mirror of https://github.com/python/cpython
Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by Daniel Stokes.
This commit is contained in:
parent
99d66f917a
commit
ea93ac013d
|
@ -329,12 +329,17 @@ Constants
|
||||||
.. versionadded:: 3.3
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
|
||||||
.. data:: SIO_*
|
.. data:: SIO_RCVALL
|
||||||
|
SIO_KEEPALIVE_VALS
|
||||||
|
SIO_LOOPBACK_FAST_PATH
|
||||||
RCVALL_*
|
RCVALL_*
|
||||||
|
|
||||||
Constants for Windows' WSAIoctl(). The constants are used as arguments to the
|
Constants for Windows' WSAIoctl(). The constants are used as arguments to the
|
||||||
:meth:`~socket.socket.ioctl` method of socket objects.
|
:meth:`~socket.socket.ioctl` method of socket objects.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
``SIO_LOOPBACK_FAST_PATH`` was added.
|
||||||
|
|
||||||
|
|
||||||
.. data:: TIPC_*
|
.. data:: TIPC_*
|
||||||
|
|
||||||
|
@ -996,6 +1001,12 @@ to sockets.
|
||||||
On other platforms, the generic :func:`fcntl.fcntl` and :func:`fcntl.ioctl`
|
On other platforms, the generic :func:`fcntl.fcntl` and :func:`fcntl.ioctl`
|
||||||
functions may be used; they accept a socket object as their first argument.
|
functions may be used; they accept a socket object as their first argument.
|
||||||
|
|
||||||
|
Currently only the following control codes are supported:
|
||||||
|
``SIO_RCVALL``, ``SIO_KEEPALIVE_VALS``, and ``SIO_LOOPBACK_FAST_PATH``.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
``SIO_LOOPBACK_FAST_PATH`` was added.
|
||||||
|
|
||||||
.. method:: socket.listen([backlog])
|
.. method:: socket.listen([backlog])
|
||||||
|
|
||||||
Enable a server to accept connections. If *backlog* is specified, it must
|
Enable a server to accept connections. If *backlog* is specified, it must
|
||||||
|
|
|
@ -346,6 +346,14 @@ sqlite3
|
||||||
(Contributed by Alex LordThorsen in :issue:`16864`.)
|
(Contributed by Alex LordThorsen in :issue:`16864`.)
|
||||||
|
|
||||||
|
|
||||||
|
socket
|
||||||
|
------
|
||||||
|
|
||||||
|
The :func:`~socket.socket.ioctl` function now supports the :data:`~socket.SIO_LOOPBACK_FAST_PATH`
|
||||||
|
control code.
|
||||||
|
(Contributed by Daniel Stokes in :issue:`26536`.)
|
||||||
|
|
||||||
|
|
||||||
socketserver
|
socketserver
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -1217,6 +1217,16 @@ class GeneralModuleTests(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, s.ioctl, -1, None)
|
self.assertRaises(ValueError, s.ioctl, -1, None)
|
||||||
s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
|
s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
|
||||||
|
|
||||||
|
@unittest.skipUnless(os.name == "nt", "Windows specific")
|
||||||
|
@unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
|
||||||
|
'Loopback fast path support required for this test')
|
||||||
|
def test_sio_loopback_fast_path(self):
|
||||||
|
s = socket.socket()
|
||||||
|
self.addCleanup(s.close)
|
||||||
|
s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
|
||||||
|
self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
|
||||||
|
|
||||||
|
|
||||||
def testGetaddrinfo(self):
|
def testGetaddrinfo(self):
|
||||||
try:
|
try:
|
||||||
socket.getaddrinfo('localhost', 80)
|
socket.getaddrinfo('localhost', 80)
|
||||||
|
|
|
@ -1431,6 +1431,7 @@ Victor Stinner
|
||||||
Richard Stoakley
|
Richard Stoakley
|
||||||
Peter Stoehr
|
Peter Stoehr
|
||||||
Casper Stoel
|
Casper Stoel
|
||||||
|
Daniel Stokes
|
||||||
Michael Stone
|
Michael Stone
|
||||||
Serhiy Storchaka
|
Serhiy Storchaka
|
||||||
Ken Stox
|
Ken Stox
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.6.0 alpha 3
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by
|
||||||
|
Daniel Stokes.
|
||||||
|
|
||||||
- Issue #27048: Prevents distutils failing on Windows when environment
|
- Issue #27048: Prevents distutils failing on Windows when environment
|
||||||
variables contain non-ASCII characters
|
variables contain non-ASCII characters
|
||||||
|
|
||||||
|
|
|
@ -4053,6 +4053,17 @@ sock_ioctl(PySocketSockObject *s, PyObject *arg)
|
||||||
return set_error();
|
return set_error();
|
||||||
}
|
}
|
||||||
return PyLong_FromUnsignedLong(recv); }
|
return PyLong_FromUnsignedLong(recv); }
|
||||||
|
#if defined(SIO_LOOPBACK_FAST_PATH)
|
||||||
|
case SIO_LOOPBACK_FAST_PATH: {
|
||||||
|
unsigned int option;
|
||||||
|
if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
|
||||||
|
return NULL;
|
||||||
|
if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
|
||||||
|
NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
|
||||||
|
return set_error();
|
||||||
|
}
|
||||||
|
return PyLong_FromUnsignedLong(recv); }
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
|
PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -4063,7 +4074,8 @@ PyDoc_STRVAR(sock_ioctl_doc,
|
||||||
\n\
|
\n\
|
||||||
Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
|
Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
|
||||||
SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
|
SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
|
||||||
SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
|
SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
|
||||||
|
SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MS_WINDOWS)
|
#if defined(MS_WINDOWS)
|
||||||
|
@ -7274,8 +7286,16 @@ PyInit__socket(void)
|
||||||
|
|
||||||
#ifdef SIO_RCVALL
|
#ifdef SIO_RCVALL
|
||||||
{
|
{
|
||||||
DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
|
DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
|
||||||
const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
|
#if defined(SIO_LOOPBACK_FAST_PATH)
|
||||||
|
SIO_LOOPBACK_FAST_PATH
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
|
||||||
|
#if defined(SIO_LOOPBACK_FAST_PATH)
|
||||||
|
"SIO_LOOPBACK_FAST_PATH"
|
||||||
|
#endif
|
||||||
|
};
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
|
for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
|
||||||
PyObject *tmp;
|
PyObject *tmp;
|
||||||
|
|
Loading…
Reference in New Issue