changeset: 102075:f8957c755c7a user: Steve Dower date: Fri Jun 17 12:52:18 2016 -0700 files: Doc/library/socket.rst Doc/whatsnew/3.6.rst Lib/test/test_socket.py Misc/ACKS Misc/NEWS Modules/socketmodule.c description: Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by Daniel Stokes. diff -r bb22ae1e1bcd -r f8957c755c7a Doc/library/socket.rst --- a/Doc/library/socket.rst Fri Jun 17 09:33:11 2016 -0700 +++ b/Doc/library/socket.rst Fri Jun 17 12:52:18 2016 -0700 @@ -329,12 +329,17 @@ .. versionadded:: 3.3 -.. data:: SIO_* +.. data:: SIO_RCVALL + SIO_KEEPALIVE_VALS + SIO_LOOPBACK_FAST_PATH RCVALL_* Constants for Windows' WSAIoctl(). The constants are used as arguments to the :meth:`~socket.socket.ioctl` method of socket objects. + .. versionchanged:: 3.6 + ``SIO_LOOPBACK_FAST_PATH`` was added. + .. data:: TIPC_* @@ -996,6 +1001,12 @@ 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. + 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]) Enable a server to accept connections. If *backlog* is specified, it must diff -r bb22ae1e1bcd -r f8957c755c7a Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Fri Jun 17 09:33:11 2016 -0700 +++ b/Doc/whatsnew/3.6.rst Fri Jun 17 12:52:18 2016 -0700 @@ -346,6 +346,14 @@ (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 ------------ diff -r bb22ae1e1bcd -r f8957c755c7a Lib/test/test_socket.py --- a/Lib/test/test_socket.py Fri Jun 17 09:33:11 2016 -0700 +++ b/Lib/test/test_socket.py Fri Jun 17 12:52:18 2016 -0700 @@ -1217,6 +1217,16 @@ self.assertRaises(ValueError, s.ioctl, -1, None) 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): try: socket.getaddrinfo('localhost', 80) diff -r bb22ae1e1bcd -r f8957c755c7a Misc/ACKS --- a/Misc/ACKS Fri Jun 17 09:33:11 2016 -0700 +++ b/Misc/ACKS Fri Jun 17 12:52:18 2016 -0700 @@ -1431,6 +1431,7 @@ Richard Stoakley Peter Stoehr Casper Stoel +Daniel Stokes Michael Stone Serhiy Storchaka Ken Stox diff -r bb22ae1e1bcd -r f8957c755c7a Misc/NEWS --- a/Misc/NEWS Fri Jun 17 09:33:11 2016 -0700 +++ b/Misc/NEWS Fri Jun 17 12:52:18 2016 -0700 @@ -10,6 +10,9 @@ Library ------- +- Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by + Daniel Stokes. + - Issue #27048: Prevents distutils failing on Windows when environment variables contain non-ASCII characters diff -r bb22ae1e1bcd -r f8957c755c7a Modules/socketmodule.c --- a/Modules/socketmodule.c Fri Jun 17 09:33:11 2016 -0700 +++ b/Modules/socketmodule.c Fri Jun 17 12:52:18 2016 -0700 @@ -4053,6 +4053,17 @@ return set_error(); } 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: PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd); return NULL; @@ -4063,7 +4074,8 @@ \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_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 #if defined(MS_WINDOWS) @@ -7274,8 +7286,16 @@ #ifdef SIO_RCVALL { - DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS}; - const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"}; + DWORD codes[] = {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; for(i = 0; i