]> granicus.if.org Git - python/commitdiff
Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by Daniel Stokes.
authorSteve Dower <steve.dower@microsoft.com>
Fri, 17 Jun 2016 19:52:18 +0000 (12:52 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Fri, 17 Jun 2016 19:52:18 +0000 (12:52 -0700)
Doc/library/socket.rst
Doc/whatsnew/3.6.rst
Lib/test/test_socket.py
Misc/ACKS
Misc/NEWS
Modules/socketmodule.c

index 84286c9c19e45aba2ea4bd7dbf7cc7c201ea9cd7..c63c73aae1006de4393aebc9ec97e757fbc61702 100644 (file)
@@ -329,12 +329,17 @@ Constants
    .. 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 @@ to sockets.
    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
index 8e166f0cf41e17f3c5beed3b4141dcf263fa5ee4..e7e01a632f46adfed56bba8b94c4748c1fc13480 100644 (file)
@@ -346,6 +346,14 @@ sqlite3
   (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
 ------------
 
index 1ddd6044b93f93496e713f0e451d86126457eba4..fa318b3aaef3c37147b19b335d9715b97503e8e8 100644 (file)
@@ -1217,6 +1217,16 @@ class GeneralModuleTests(unittest.TestCase):
         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)
index 46a649ca3aebfcca8249433bf7c3303934365b7f..94944068f76c17ad3b75a49077f705a99424f4bf 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1431,6 +1431,7 @@ Victor Stinner
 Richard Stoakley
 Peter Stoehr
 Casper Stoel
+Daniel Stokes
 Michael Stone
 Serhiy Storchaka
 Ken Stox
index 2e99f5a57069884f7e2dce290146d9e83015636f..37e366336e933a4f7cd37b53f0243b5e69ef79c0 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.6.0 alpha 3
 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
 
index 6355e4a59a61b52095ab26c359410f9e68444116..a8bdfe3e947607300abbf10bada0f32e3a777b48 100644 (file)
@@ -4053,6 +4053,17 @@ sock_ioctl(PySocketSockObject *s, PyObject *arg)
             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 @@ PyDoc_STRVAR(sock_ioctl_doc,
 \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 @@ PyInit__socket(void)
 
 #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<Py_ARRAY_LENGTH(codes); ++i) {
             PyObject *tmp;