summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2016-06-17 19:52:18 (GMT)
committerSteve Dower <steve.dower@microsoft.com>2016-06-17 19:52:18 (GMT)
commitea93ac013dc0d69c3500f16105fb0f8ea94aba3f (patch)
tree3d43d0bf0c5468a679c4c4258b38badc3bf1107a
parent99d66f917a60ad556726b497a7d964e4b2ce109d (diff)
downloadcpython-ea93ac013dc0d69c3500f16105fb0f8ea94aba3f.zip
cpython-ea93ac013dc0d69c3500f16105fb0f8ea94aba3f.tar.gz
cpython-ea93ac013dc0d69c3500f16105fb0f8ea94aba3f.tar.bz2
Issue #26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by Daniel Stokes.
-rw-r--r--Doc/library/socket.rst13
-rw-r--r--Doc/whatsnew/3.6.rst8
-rw-r--r--Lib/test/test_socket.py10
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/socketmodule.c26
6 files changed, 57 insertions, 4 deletions
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 84286c9..c63c73a 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -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
diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
index 8e166f0..e7e01a6 100644
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -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
------------
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 1ddd604..fa318b3 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -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)
diff --git a/Misc/ACKS b/Misc/ACKS
index 46a649c..9494406 100644
--- 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
diff --git a/Misc/NEWS b/Misc/NEWS
index 2e99f5a..37e3663 100644
--- 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
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 6355e4a..a8bdfe3 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -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;