diff options
author | Christian Heimes <christian@cheimes.de> | 2008-01-04 15:23:30 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2008-01-04 15:23:30 (GMT) |
commit | 04ae916fa236099956bf62fcbf3567cac0f3ce2d (patch) | |
tree | 6baaee6b2666bb9b372126fe33a653297bc3cb3b /Modules | |
parent | 951300e39f76ccc70178a6d0499b585a6eb8652e (diff) | |
download | cpython-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.c | 43 | ||||
-rw-r--r-- | Modules/socketmodule.h | 1 |
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 |