mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-32454: socket closefd (#5048)
Add close(fd) function to the socket module Signed-off-by: Christian Heimes <christian@python.org>
This commit is contained in:
parent
2f050c7e1b
commit
d0e31b980f
4 changed files with 54 additions and 2 deletions
|
@ -2836,7 +2836,7 @@ sock_close(PySocketSockObject *s)
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(close_doc,
|
||||
PyDoc_STRVAR(sock_close_doc,
|
||||
"close()\n\
|
||||
\n\
|
||||
Close the socket. It cannot be used after this call.");
|
||||
|
@ -4558,7 +4558,7 @@ static PyMethodDef sock_methods[] = {
|
|||
{"bind", (PyCFunction)sock_bind, METH_O,
|
||||
bind_doc},
|
||||
{"close", (PyCFunction)sock_close, METH_NOARGS,
|
||||
close_doc},
|
||||
sock_close_doc},
|
||||
{"connect", (PyCFunction)sock_connect, METH_O,
|
||||
connect_doc},
|
||||
{"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
|
||||
|
@ -5456,6 +5456,31 @@ PyDoc_STRVAR(getprotobyname_doc,
|
|||
\n\
|
||||
Return the protocol number for the named protocol. (Rarely used.)");
|
||||
|
||||
static PyObject *
|
||||
socket_close(PyObject *self, PyObject *fdobj)
|
||||
{
|
||||
SOCKET_T fd;
|
||||
int res;
|
||||
|
||||
fd = PyLong_AsSocket_t(fdobj);
|
||||
if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
|
||||
return NULL;
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
res = SOCKETCLOSE(fd);
|
||||
Py_END_ALLOW_THREADS
|
||||
/* bpo-30319: The peer can already have closed the connection.
|
||||
Python ignores ECONNRESET on close(). */
|
||||
if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
|
||||
return set_error();
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(close_doc,
|
||||
"close(integer) -> None\n\
|
||||
\n\
|
||||
Close an integer socket file descriptor. This is like os.close(), but for\n\
|
||||
sockets; on some platforms os.close() won't work for socket file descriptors.");
|
||||
|
||||
#ifndef NO_DUP
|
||||
/* dup() function for socket fds */
|
||||
|
@ -6397,6 +6422,8 @@ static PyMethodDef socket_methods[] = {
|
|||
METH_VARARGS, getservbyport_doc},
|
||||
{"getprotobyname", socket_getprotobyname,
|
||||
METH_VARARGS, getprotobyname_doc},
|
||||
{"close", socket_close,
|
||||
METH_O, close_doc},
|
||||
#ifndef NO_DUP
|
||||
{"dup", socket_dup,
|
||||
METH_O, dup_doc},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue