diff options
| -rw-r--r-- | Doc/library/socket.rst | 17 | ||||
| -rw-r--r-- | Doc/whatsnew/3.2.rst | 2 | ||||
| -rw-r--r-- | Lib/ssl.py | 2 | ||||
| -rw-r--r-- | Lib/test/test_socket.py | 14 | ||||
| -rw-r--r-- | Misc/NEWS | 2 | ||||
| -rw-r--r-- | Modules/socketmodule.c | 16 | 
6 files changed, 29 insertions, 24 deletions
| diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 2b43266..f340920 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -538,6 +538,15 @@ correspond to Unix system calls applicable to sockets.     connects. +.. method:: socket.detach() + +   Put the socket object into closed state without actually closing the +   underlying file descriptor.  The file descriptor is returned, and can +   be reused for other purposes. + +   .. versionadded:: 3.2 + +  .. method:: socket.fileno()     Return the socket's file descriptor (a small integer).  This is useful with @@ -548,14 +557,6 @@ correspond to Unix system calls applicable to sockets.     this limitation. -.. method:: socket.forget() - -   Put the socket object into closed state without actually closing the -   underlying file descriptor.  This allows the latter to be reused. - -   .. versionadded:: 3.2 - -  .. method:: socket.getpeername()     Return the remote address to which the socket is connected.  This is useful to diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 487298f..bc31764 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -136,7 +136,7 @@ New, Improved, and Deprecated Modules    (Contributed by Tarek Ziadé.) -* Socket objects now have a :meth:`~socket.socket.forget()` method which +* Socket objects now have a :meth:`~socket.socket.detach()` method which    puts the socket into closed state without actually closing the underlying    file descriptor.  The latter can then be reused for other purposes. @@ -157,7 +157,7 @@ class SSLSocket(socket):                      raise              else:                  connected = True -            sock.forget() +            sock.detach()          elif fileno is not None:              socket.__init__(self, fileno=fileno)          else: diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index ae34c11..a95e743 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -655,17 +655,21 @@ class BasicTCPTest(SocketConnectedTest):          self.serv_conn.send(MSG)          self.serv_conn.shutdown(2) -    def testForget(self): -        # Testing forget() -        f = self.cli_conn.fileno() -        self.cli_conn.forget() +    def testDetach(self): +        # Testing detach() +        fileno = self.cli_conn.fileno() +        f = self.cli_conn.detach() +        self.assertEqual(f, fileno) +        # cli_conn cannot be used anymore...          self.assertRaises(socket.error, self.cli_conn.recv, 1024)          self.cli_conn.close() +        # ...but we can create another socket using the (still open) +        # file descriptor          sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)          msg = sock.recv(1024)          self.assertEqual(msg, MSG) -    def _testForget(self): +    def _testDetach(self):          self.serv_conn.send(MSG)  @unittest.skipUnless(thread, 'Threading required for this test.') @@ -30,7 +30,7 @@ Core and Builtins  Extensions  ---------- -- Issue #8524: Add a forget() method to socket objects, so as to put the +- Issue #8524: Add a detach() method to socket objects, so as to put the    socket into the closed state without closing the underlying file    descriptor. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index fc671e0..b1a616e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1870,19 +1870,19 @@ PyDoc_STRVAR(close_doc,  Close the socket.  It cannot be used after this call.");  static PyObject * -sock_forget(PySocketSockObject *s) +sock_detach(PySocketSockObject *s)  { +    SOCKET_T fd = s->sock_fd;      s->sock_fd = -1; -    Py_INCREF(Py_None); -    return Py_None; +    return PyLong_FromSocket_t(fd);  } -PyDoc_STRVAR(forget_doc, -"forget()\n\ +PyDoc_STRVAR(detach_doc, +"detach()\n\  \n\  Close the socket object without closing the underlying file descriptor.\  The object cannot be used after this call, but the file descriptor\ -can be reused for other purposes."); +can be reused for other purposes.  The file descriptor is returned.");  static int  internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, @@ -2772,10 +2772,10 @@ static PyMethodDef sock_methods[] = {                        connect_doc},      {"connect_ex",        (PyCFunction)sock_connect_ex, METH_O,                        connect_ex_doc}, +    {"detach",            (PyCFunction)sock_detach, METH_NOARGS, +                      detach_doc},      {"fileno",            (PyCFunction)sock_fileno, METH_NOARGS,                        fileno_doc}, -    {"forget",            (PyCFunction)sock_forget, METH_NOARGS, -                      forget_doc},  #ifdef HAVE_GETPEERNAME      {"getpeername",       (PyCFunction)sock_getpeername,                        METH_NOARGS, getpeername_doc}, | 
