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