Mercurial > cpython-lru_cache-weakref
comparison Modules/socketmodule.c @ 56252:debb245ebb40
http://bugs.python.org/issue6971
Porting revision 75054 from trunk
| author | Kristján Valur Jónsson <kristjan@ccpgames.com> |
|---|---|
| date | Sun, 27 Sep 2009 21:10:38 +0000 |
| parents | b666e72f602f |
| children | 41bb5e2dc947 |
comparison
equal
deleted
inserted
replaced
| 56248:910da545e17b | 56252:debb245ebb40 |
|---|---|
| 2684 #if defined(MS_WINDOWS) && defined(SIO_RCVALL) | 2684 #if defined(MS_WINDOWS) && defined(SIO_RCVALL) |
| 2685 static PyObject* | 2685 static PyObject* |
| 2686 sock_ioctl(PySocketSockObject *s, PyObject *arg) | 2686 sock_ioctl(PySocketSockObject *s, PyObject *arg) |
| 2687 { | 2687 { |
| 2688 unsigned long cmd = SIO_RCVALL; | 2688 unsigned long cmd = SIO_RCVALL; |
| 2689 unsigned int option = RCVALL_ON; | 2689 PyObject *argO; |
| 2690 DWORD recv; | 2690 DWORD recv; |
| 2691 | 2691 |
| 2692 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option)) | 2692 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO)) |
| 2693 return NULL; | 2693 return NULL; |
| 2694 | 2694 |
| 2695 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option), | 2695 switch (cmd) { |
| 2696 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { | 2696 case SIO_RCVALL: { |
| 2697 return set_error(); | 2697 unsigned int option = RCVALL_ON; |
| 2698 } | 2698 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option)) |
| 2699 return PyLong_FromUnsignedLong(recv); | 2699 return NULL; |
| 2700 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option), | |
| 2701 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { | |
| 2702 return set_error(); | |
| 2703 } | |
| 2704 return PyLong_FromUnsignedLong(recv); } | |
| 2705 case SIO_KEEPALIVE_VALS: { | |
| 2706 struct tcp_keepalive ka; | |
| 2707 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd, | |
| 2708 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval)) | |
| 2709 return NULL; | |
| 2710 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka), | |
| 2711 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { | |
| 2712 return set_error(); | |
| 2713 } | |
| 2714 return PyLong_FromUnsignedLong(recv); } | |
| 2715 default: | |
| 2716 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd); | |
| 2717 return NULL; | |
| 2718 } | |
| 2700 } | 2719 } |
| 2701 PyDoc_STRVAR(sock_ioctl_doc, | 2720 PyDoc_STRVAR(sock_ioctl_doc, |
| 2702 "ioctl(cmd, option) -> long\n\ | 2721 "ioctl(cmd, option) -> long\n\ |
| 2703 \n\ | 2722 \n\ |
| 2704 Control the socket with WSAIoctl syscall. Currently only socket.SIO_RCVALL\n\ | 2723 Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\ |
| 2705 is supported as control. Options must be one of the socket.RCVALL_*\n\ | 2724 SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\ |
| 2706 constants."); | 2725 SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval)."); |
| 2707 | 2726 |
| 2708 #endif | 2727 #endif |
| 2709 | 2728 |
| 2710 /* List of methods for socket objects */ | 2729 /* List of methods for socket objects */ |
| 2711 | 2730 |
| 5056 PyModule_AddIntConstant(m, "SHUT_RDWR", 2); | 5075 PyModule_AddIntConstant(m, "SHUT_RDWR", 2); |
| 5057 #endif | 5076 #endif |
| 5058 | 5077 |
| 5059 #ifdef SIO_RCVALL | 5078 #ifdef SIO_RCVALL |
| 5060 { | 5079 { |
| 5061 PyObject *tmp; | 5080 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS}; |
| 5062 tmp = PyLong_FromUnsignedLong(SIO_RCVALL); | 5081 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"}; |
| 5063 if (tmp == NULL) | 5082 int i; |
| 5064 return NULL; | 5083 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) { |
| 5065 PyModule_AddObject(m, "SIO_RCVALL", tmp); | 5084 PyObject *tmp; |
| 5085 tmp = PyLong_FromUnsignedLong(codes[i]); | |
| 5086 if (tmp == NULL) | |
| 5087 return NULL; | |
| 5088 PyModule_AddObject(m, names[i], tmp); | |
| 5089 } | |
| 5066 } | 5090 } |
| 5067 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF); | 5091 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF); |
| 5068 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON); | 5092 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON); |
| 5069 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY); | 5093 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY); |
| 5070 #ifdef RCVALL_IPLEVEL | 5094 #ifdef RCVALL_IPLEVEL |
