summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-08-09 20:39:54 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-08-09 20:39:54 (GMT)
commit6e451df800af66eefe68ea15938bd65029af06c5 (patch)
tree3a94bf3c48a965f464f1f112d384076103a4676a
parent30e86a47676d2175901af29445aec5bd7967ef76 (diff)
downloadcpython-6e451df800af66eefe68ea15938bd65029af06c5.zip
cpython-6e451df800af66eefe68ea15938bd65029af06c5.tar.gz
cpython-6e451df800af66eefe68ea15938bd65029af06c5.tar.bz2
Followup to r83869 and issue #8524: rename socket.forget() to socket.detach()
and make it return the file descriptor.
-rw-r--r--Doc/library/socket.rst17
-rw-r--r--Doc/whatsnew/3.2.rst2
-rw-r--r--Lib/ssl.py2
-rw-r--r--Lib/test/test_socket.py14
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/socketmodule.c16
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.
diff --git a/Lib/ssl.py b/Lib/ssl.py
index 7bcc67e..5e2da29 100644
--- a/Lib/ssl.py
+++ b/Lib/ssl.py
@@ -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.')
diff --git a/Misc/NEWS b/Misc/NEWS
index cccdf66..cc13d1f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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},