summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2008-01-04 15:23:30 (GMT)
committerChristian Heimes <christian@cheimes.de>2008-01-04 15:23:30 (GMT)
commit04ae916fa236099956bf62fcbf3567cac0f3ce2d (patch)
tree6baaee6b2666bb9b372126fe33a653297bc3cb3b /Modules
parent951300e39f76ccc70178a6d0499b585a6eb8652e (diff)
downloadcpython-04ae916fa236099956bf62fcbf3567cac0f3ce2d.zip
cpython-04ae916fa236099956bf62fcbf3567cac0f3ce2d.tar.gz
cpython-04ae916fa236099956bf62fcbf3567cac0f3ce2d.tar.bz2
Added interface to Windows' WSAIoctl and a simple example for a network sniffer.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/socketmodule.c43
-rw-r--r--Modules/socketmodule.h1
2 files changed, 43 insertions, 1 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 1c31871..c30f1b3 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -2687,6 +2687,31 @@ PyDoc_STRVAR(shutdown_doc,
Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
+#ifdef MS_WINDOWS
+static PyObject*
+sock_ioctl(PySocketSockObject *s, PyObject *arg)
+{
+ unsigned long cmd = SIO_RCVALL;
+ unsigned int option = RCVALL_ON;
+ DWORD recv;
+
+ 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);
+}
+PyDoc_STRVAR(sock_ioctl_doc,
+"ioctl(cmd, option) -> long\n\
+\n\
+Control the socket with WSAIoctl syscall. Currently only socket.SIO_RCVALL\n\
+is supported as control. Options must be one of the socket.RCVALL_*\n\
+constants.");
+
+#endif
/* List of methods for socket objects */
@@ -2715,6 +2740,10 @@ static PyMethodDef sock_methods[] = {
METH_NOARGS, getsockname_doc},
{"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
getsockopt_doc},
+#ifdef MS_WINDOWS
+ {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
+ sock_ioctl_doc},
+#endif
{"listen", (PyCFunction)sock_listen, METH_O,
listen_doc},
#ifndef NO_DUP
@@ -4194,7 +4223,7 @@ See the socket module for documentation.");
PyMODINIT_FUNC
init_socket(void)
{
- PyObject *m, *has_ipv6;
+ PyObject *m, *has_ipv6, *tmp;
if (!os_init())
return;
@@ -5033,6 +5062,18 @@ init_socket(void)
PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
#endif
+#ifdef SIO_RCVALL
+ tmp = PyLong_FromUnsignedLong(SIO_RCVALL);
+ if (tmp == NULL)
+ return;
+ PyModule_AddObject(m, "SIO_RCVALL", tmp);
+ PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
+ PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
+ PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
+ PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
+ PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
+#endif /* _MSTCPIP_ */
+
/* Initialize gethostbyname lock */
#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
netdb_lock = PyThread_allocate_lock();
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index fb9ec67..95bc233 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -16,6 +16,7 @@
#if _MSC_VER >= 1300
# include <winsock2.h>
# include <ws2tcpip.h>
+# include <MSTcpIP.h> /* for SIO_RCVALL */
# define HAVE_ADDRINFO
# define HAVE_SOCKADDR_STORAGE
# define HAVE_GETADDRINFO