]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/socketmodule.c
AppPkg/.../Python-2.7.10: AppPkg.dsc, pyconfig.h, PyMod-2.7.10
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / socketmodule.c
CommitLineData
4710c53d 1/* Socket module */\r
2\r
3/*\r
4\r
5This module provides an interface to Berkeley socket IPC.\r
6\r
7Limitations:\r
8\r
9- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a\r
10 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported\r
11 under Linux.\r
12- No read/write operations (use sendall/recv or makefile instead).\r
13- Additional restrictions apply on some non-Unix platforms (compensated\r
14 for by socket.py).\r
15\r
16Module interface:\r
17\r
18- socket.error: exception raised for socket specific errors\r
19- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,\r
20 a subclass of socket.error\r
21- socket.herror: exception raised for gethostby* errors,\r
22 a subclass of socket.error\r
23- socket.fromfd(fd, family, type[, proto]) --> new socket object (created\r
24 from an existing file descriptor)\r
25- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')\r
26- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])\r
27- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')\r
28- socket.getprotobyname(protocolname) --> protocol number\r
29- socket.getservbyname(servicename[, protocolname]) --> port number\r
30- socket.getservbyport(portnumber[, protocolname]) --> service name\r
31- socket.socket([family[, type [, proto]]]) --> new socket object\r
32- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)\r
33- socket.ntohs(16 bit value) --> new int object\r
34- socket.ntohl(32 bit value) --> new int object\r
35- socket.htons(16 bit value) --> new int object\r
36- socket.htonl(32 bit value) --> new int object\r
37- socket.getaddrinfo(host, port [, family, socktype, proto, flags])\r
38 --> List of (family, socktype, proto, canonname, sockaddr)\r
39- socket.getnameinfo(sockaddr, flags) --> (host, port)\r
40- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>\r
41- socket.has_ipv6: boolean value indicating if IPv6 is supported\r
42- socket.inet_aton(IP address) -> 32-bit packed IP representation\r
43- socket.inet_ntoa(packed IP) -> IP address string\r
44- socket.getdefaulttimeout() -> None | float\r
45- socket.setdefaulttimeout(None | float)\r
46- an Internet socket address is a pair (hostname, port)\r
47 where hostname can be anything recognized by gethostbyname()\r
48 (including the dd.dd.dd.dd notation) and port is in host byte order\r
49- where a hostname is returned, the dd.dd.dd.dd notation is used\r
50- a UNIX domain socket address is a string specifying the pathname\r
51- an AF_PACKET socket address is a tuple containing a string\r
52 specifying the ethernet interface and an integer specifying\r
53 the Ethernet protocol number to be received. For example:\r
54 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple\r
55 specify packet-type and ha-type/addr.\r
56- an AF_TIPC socket address is expressed as\r
57 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:\r
58 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;\r
59 and scope can be one of:\r
60 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.\r
61 The meaning of v1, v2 and v3 depends on the value of addr_type:\r
62 if addr_type is TIPC_ADDR_NAME:\r
63 v1 is the server type\r
64 v2 is the port identifier\r
65 v3 is ignored\r
66 if addr_type is TIPC_ADDR_NAMESEQ:\r
67 v1 is the server type\r
68 v2 is the lower port number\r
69 v3 is the upper port number\r
70 if addr_type is TIPC_ADDR_ID:\r
71 v1 is the node\r
72 v2 is the ref\r
73 v3 is ignored\r
74\r
75\r
76Local naming conventions:\r
77\r
78- names starting with sock_ are socket object methods\r
79- names starting with socket_ are module-level functions\r
80- names starting with PySocket are exported through socketmodule.h\r
81\r
82*/\r
83\r
84#ifdef __APPLE__\r
85 /*\r
86 * inet_aton is not available on OSX 10.3, yet we want to use a binary\r
87 * that was build on 10.4 or later to work on that release, weak linking\r
88 * comes to the rescue.\r
89 */\r
90# pragma weak inet_aton\r
91#endif\r
92\r
93#include "Python.h"\r
94#include "structmember.h"\r
95\r
96#undef MAX\r
97#define MAX(x, y) ((x) < (y) ? (y) : (x))\r
98\r
99/* Socket object documentation */\r
100PyDoc_STRVAR(sock_doc,\r
101"socket([family[, type[, proto]]]) -> socket object\n\\r
102\n\\r
103Open a socket of the given type. The family argument specifies the\n\\r
104address family; it defaults to AF_INET. The type argument specifies\n\\r
105whether this is a stream (SOCK_STREAM, this is the default)\n\\r
106or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\\r
107specifying the default protocol. Keyword arguments are accepted.\n\\r
108\n\\r
109A socket object represents one endpoint of a network connection.\n\\r
110\n\\r
111Methods of socket objects (keyword arguments not allowed):\n\\r
112\n\\r
113accept() -- accept a connection, returning new socket and client address\n\\r
114bind(addr) -- bind the socket to a local address\n\\r
115close() -- close the socket\n\\r
116connect(addr) -- connect the socket to a remote address\n\\r
117connect_ex(addr) -- connect, return an error code instead of an exception\n\\r
118dup() -- return a new socket object identical to the current one [*]\n\\r
119fileno() -- return underlying file descriptor\n\\r
120getpeername() -- return remote address [*]\n\\r
121getsockname() -- return local address\n\\r
122getsockopt(level, optname[, buflen]) -- get socket options\n\\r
123gettimeout() -- return timeout or None\n\\r
124listen(n) -- start listening for incoming connections\n\\r
125makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\\r
126recv(buflen[, flags]) -- receive data\n\\r
127recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\\r
128recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\\r
129recvfrom_into(buffer[, nbytes, [, flags])\n\\r
130 -- receive data and sender\'s address (into a buffer)\n\\r
131sendall(data[, flags]) -- send all data\n\\r
132send(data[, flags]) -- send data, may not send all of it\n\\r
133sendto(data[, flags], addr) -- send data to a given address\n\\r
134setblocking(0 | 1) -- set or clear the blocking I/O flag\n\\r
135setsockopt(level, optname, value) -- set socket options\n\\r
136settimeout(None | float) -- set or clear the timeout\n\\r
137shutdown(how) -- shut down traffic in one or both directions\n\\r
138\n\\r
139 [*] not available on all platforms!");\r
140\r
141/* XXX This is a terrible mess of platform-dependent preprocessor hacks.\r
142 I hope some day someone can clean this up please... */\r
143\r
144/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure\r
145 script doesn't get this right, so we hardcode some platform checks below.\r
146 On the other hand, not all Linux versions agree, so there the settings\r
147 computed by the configure script are needed! */\r
148\r
149#ifndef linux\r
150# undef HAVE_GETHOSTBYNAME_R_3_ARG\r
151# undef HAVE_GETHOSTBYNAME_R_5_ARG\r
152# undef HAVE_GETHOSTBYNAME_R_6_ARG\r
153#endif\r
154\r
155#ifndef WITH_THREAD\r
156# undef HAVE_GETHOSTBYNAME_R\r
157#endif\r
158\r
159#ifdef HAVE_GETHOSTBYNAME_R\r
160# if defined(_AIX) || defined(__osf__)\r
161# define HAVE_GETHOSTBYNAME_R_3_ARG\r
162# elif defined(__sun) || defined(__sgi)\r
163# define HAVE_GETHOSTBYNAME_R_5_ARG\r
164# elif defined(linux)\r
165/* Rely on the configure script */\r
166# else\r
167# undef HAVE_GETHOSTBYNAME_R\r
168# endif\r
169#endif\r
170\r
171#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \\r
172 !defined(MS_WINDOWS)\r
173# define USE_GETHOSTBYNAME_LOCK\r
174#endif\r
175\r
176/* To use __FreeBSD_version */\r
177#ifdef HAVE_SYS_PARAM_H\r
178#include <sys/param.h>\r
179#endif\r
180/* On systems on which getaddrinfo() is believed to not be thread-safe,\r
181 (this includes the getaddrinfo emulation) protect access with a lock. */\r
182#if defined(WITH_THREAD) && (defined(__APPLE__) || \\r
183 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \\r
184 defined(__OpenBSD__) || defined(__NetBSD__) || \\r
185 defined(__VMS) || !defined(HAVE_GETADDRINFO))\r
186#define USE_GETADDRINFO_LOCK\r
187#endif\r
188\r
189#ifdef USE_GETADDRINFO_LOCK\r
190#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);\r
191#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);\r
192#else\r
193#define ACQUIRE_GETADDRINFO_LOCK\r
194#define RELEASE_GETADDRINFO_LOCK\r
195#endif\r
196\r
197#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
198# include "pythread.h"\r
199#endif\r
200\r
201#if defined(PYCC_VACPP)\r
202# include <types.h>\r
203# include <io.h>\r
204# include <sys/ioctl.h>\r
205# include <utils.h>\r
206# include <ctype.h>\r
207#endif\r
208\r
209#if defined(__VMS)\r
210# include <ioctl.h>\r
211#endif\r
212\r
213#if defined(PYOS_OS2)\r
214# define INCL_DOS\r
215# define INCL_DOSERRORS\r
216# define INCL_NOPMAPI\r
217# include <os2.h>\r
218#endif\r
219\r
220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI\r
221/* make sure that the reentrant (gethostbyaddr_r etc)\r
222 functions are declared correctly if compiling with\r
223 MIPSPro 7.x in ANSI C mode (default) */\r
224\r
225/* XXX Using _SGIAPI is the wrong thing,\r
226 but I don't know what the right thing is. */\r
227#undef _SGIAPI /* to avoid warning */\r
228#define _SGIAPI 1\r
229\r
230#undef _XOPEN_SOURCE\r
231#include <sys/socket.h>\r
232#include <sys/types.h>\r
233#include <netinet/in.h>\r
234#ifdef _SS_ALIGNSIZE\r
235#define HAVE_GETADDRINFO 1\r
236#define HAVE_GETNAMEINFO 1\r
237#endif\r
238\r
239#define HAVE_INET_PTON\r
240#include <netdb.h>\r
241#endif\r
242\r
243/* Irix 6.5 fails to define this variable at all. This is needed\r
244 for both GCC and SGI's compiler. I'd say that the SGI headers\r
245 are just busted. Same thing for Solaris. */\r
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)\r
247#define INET_ADDRSTRLEN 16\r
248#endif\r
249\r
250/* Generic includes */\r
251#ifdef HAVE_SYS_TYPES_H\r
252#include <sys/types.h>\r
253#endif\r
254\r
255/* Generic socket object definitions and includes */\r
256#define PySocket_BUILDING_SOCKET\r
257#include "socketmodule.h"\r
258\r
259/* Addressing includes */\r
260\r
261#ifndef MS_WINDOWS\r
262\r
263/* Non-MS WINDOWS includes */\r
264# include <netdb.h>\r
265\r
266/* Headers needed for inet_ntoa() and inet_addr() */\r
267# ifdef __BEOS__\r
268# include <net/netdb.h>\r
269# elif defined(PYOS_OS2) && defined(PYCC_VACPP)\r
270# include <netdb.h>\r
271typedef size_t socklen_t;\r
272# else\r
273# include <arpa/inet.h>\r
274# endif\r
275\r
276# ifndef RISCOS\r
277# include <fcntl.h>\r
278# else\r
279# include <sys/ioctl.h>\r
280# include <socklib.h>\r
281# define NO_DUP\r
282int h_errno; /* not used */\r
283# define INET_ADDRSTRLEN 16\r
284# endif\r
285\r
286#else\r
287\r
288/* MS_WINDOWS includes */\r
289# ifdef HAVE_FCNTL_H\r
290# include <fcntl.h>\r
291# endif\r
292\r
293#endif\r
294\r
295#include <stddef.h>\r
296\r
297#ifndef offsetof\r
298# define offsetof(type, member) ((size_t)(&((type *)0)->member))\r
299#endif\r
300\r
301#ifndef O_NONBLOCK\r
302# define O_NONBLOCK O_NDELAY\r
303#endif\r
304\r
305/* include Python's addrinfo.h unless it causes trouble */\r
306#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)\r
307 /* Do not include addinfo.h on some newer IRIX versions.\r
308 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,\r
309 * for example, but not by 6.5.10.\r
310 */\r
311#elif defined(_MSC_VER) && _MSC_VER>1201\r
312 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and\r
313 * EAI_* constants are defined in (the already included) ws2tcpip.h.\r
314 */\r
315#else\r
316# include "addrinfo.h"\r
317#endif\r
318\r
319#ifndef HAVE_INET_PTON\r
320#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)\r
321int inet_pton(int af, const char *src, void *dst);\r
322const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);\r
323#endif\r
324#endif\r
325\r
326#ifdef __APPLE__\r
327/* On OS X, getaddrinfo returns no error indication of lookup\r
328 failure, so we must use the emulation instead of the libinfo\r
329 implementation. Unfortunately, performing an autoconf test\r
330 for this bug would require DNS access for the machine performing\r
331 the configuration, which is not acceptable. Therefore, we\r
332 determine the bug just by checking for __APPLE__. If this bug\r
333 gets ever fixed, perhaps checking for sys/version.h would be\r
334 appropriate, which is 10/0 on the system with the bug. */\r
335#ifndef HAVE_GETNAMEINFO\r
336/* This bug seems to be fixed in Jaguar. Ths easiest way I could\r
337 Find to check for Jaguar is that it has getnameinfo(), which\r
338 older releases don't have */\r
339#undef HAVE_GETADDRINFO\r
340#endif\r
341\r
342#ifdef HAVE_INET_ATON\r
343#define USE_INET_ATON_WEAKLINK\r
344#endif\r
345\r
346#endif\r
347\r
348/* I know this is a bad practice, but it is the easiest... */\r
349#if !defined(HAVE_GETADDRINFO)\r
350/* avoid clashes with the C library definition of the symbol. */\r
351#define getaddrinfo fake_getaddrinfo\r
352#define gai_strerror fake_gai_strerror\r
353#define freeaddrinfo fake_freeaddrinfo\r
354#include "getaddrinfo.c"\r
355#endif\r
356#if !defined(HAVE_GETNAMEINFO)\r
357#define getnameinfo fake_getnameinfo\r
358#include "getnameinfo.c"\r
359#endif\r
360\r
361#if defined(MS_WINDOWS) || defined(__BEOS__)\r
362/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */\r
363/* seem to be a few differences in the API */\r
364#define SOCKETCLOSE closesocket\r
365#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */\r
366#endif\r
367\r
368#ifdef MS_WIN32\r
369#define EAFNOSUPPORT WSAEAFNOSUPPORT\r
370#define snprintf _snprintf\r
371#endif\r
372\r
373#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
374#define SOCKETCLOSE soclose\r
375#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */\r
376#endif\r
377\r
378#ifndef SOCKETCLOSE\r
379#define SOCKETCLOSE close\r
380#endif\r
381\r
382#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)\r
383#define USE_BLUETOOTH 1\r
384#if defined(__FreeBSD__)\r
385#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP\r
386#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM\r
387#define BTPROTO_HCI BLUETOOTH_PROTO_HCI\r
388#define SOL_HCI SOL_HCI_RAW\r
389#define HCI_FILTER SO_HCI_RAW_FILTER\r
390#define sockaddr_l2 sockaddr_l2cap\r
391#define sockaddr_rc sockaddr_rfcomm\r
392#define hci_dev hci_node\r
393#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)\r
394#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)\r
395#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)\r
396#elif defined(__NetBSD__) || defined(__DragonFly__)\r
397#define sockaddr_l2 sockaddr_bt\r
398#define sockaddr_rc sockaddr_bt\r
399#define sockaddr_hci sockaddr_bt\r
400#define sockaddr_sco sockaddr_bt\r
401#define SOL_HCI BTPROTO_HCI\r
402#define HCI_DATA_DIR SO_HCI_DIRECTION\r
403#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)\r
404#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)\r
405#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)\r
406#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)\r
407#else\r
408#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)\r
409#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)\r
410#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)\r
411#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)\r
412#endif\r
413#endif\r
414\r
415#ifdef __VMS\r
416/* TCP/IP Services for VMS uses a maximum send/recv buffer length */\r
417#define SEGMENT_SIZE (32 * 1024 -1)\r
418#endif\r
419\r
420#define SAS2SA(x) ((struct sockaddr *)(x))\r
421\r
422/*\r
423 * Constants for getnameinfo()\r
424 */\r
425#if !defined(NI_MAXHOST)\r
426#define NI_MAXHOST 1025\r
427#endif\r
428#if !defined(NI_MAXSERV)\r
429#define NI_MAXSERV 32\r
430#endif\r
431\r
432/* XXX There's a problem here: *static* functions are not supposed to have\r
433 a Py prefix (or use CapitalizedWords). Later... */\r
434\r
435/* Global variable holding the exception type for errors detected\r
436 by this module (but not argument type or memory errors, etc.). */\r
437static PyObject *socket_error;\r
438static PyObject *socket_herror;\r
439static PyObject *socket_gaierror;\r
440static PyObject *socket_timeout;\r
441\r
442#ifdef RISCOS\r
443/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */\r
444static int taskwindow;\r
445#endif\r
446\r
447/* A forward reference to the socket type object.\r
448 The sock_type variable contains pointers to various functions,\r
449 some of which call new_sockobject(), which uses sock_type, so\r
450 there has to be a circular reference. */\r
451static PyTypeObject sock_type;\r
452\r
453#if defined(HAVE_POLL_H)\r
454#include <poll.h>\r
455#elif defined(HAVE_SYS_POLL_H)\r
456#include <sys/poll.h>\r
457#endif\r
458\r
459#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE\r
460/* Platform can select file descriptors beyond FD_SETSIZE */\r
461#define IS_SELECTABLE(s) 1\r
462#elif defined(HAVE_POLL)\r
463/* Instead of select(), we'll use poll() since poll() works on any fd. */\r
464#define IS_SELECTABLE(s) 1\r
465/* Can we call select() with this socket without a buffer overrun? */\r
466#else\r
467/* POSIX says selecting file descriptors beyond FD_SETSIZE\r
468 has undefined behaviour. If there's no timeout left, we don't have to\r
469 call select, so it's a safe, little white lie. */\r
470#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)\r
471#endif\r
472\r
473static PyObject*\r
474select_error(void)\r
475{\r
476 PyErr_SetString(socket_error, "unable to select on socket");\r
477 return NULL;\r
478}\r
479\r
480/* Convenience function to raise an error according to errno\r
481 and return a NULL pointer from a function. */\r
482\r
483static PyObject *\r
484set_error(void)\r
485{\r
486#ifdef MS_WINDOWS\r
487 int err_no = WSAGetLastError();\r
488 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which\r
489 recognizes the error codes used by both GetLastError() and\r
490 WSAGetLastError */\r
491 if (err_no)\r
492 return PyErr_SetExcFromWindowsErr(socket_error, err_no);\r
493#endif\r
494\r
495#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
496 if (sock_errno() != NO_ERROR) {\r
497 APIRET rc;\r
498 ULONG msglen;\r
499 char outbuf[100];\r
500 int myerrorcode = sock_errno();\r
501\r
502 /* Retrieve socket-related error message from MPTN.MSG file */\r
503 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),\r
504 myerrorcode - SOCBASEERR + 26,\r
505 "mptn.msg",\r
506 &msglen);\r
507 if (rc == NO_ERROR) {\r
508 PyObject *v;\r
509\r
510 /* OS/2 doesn't guarantee a terminator */\r
511 outbuf[msglen] = '\0';\r
512 if (strlen(outbuf) > 0) {\r
513 /* If non-empty msg, trim CRLF */\r
514 char *lastc = &outbuf[ strlen(outbuf)-1 ];\r
515 while (lastc > outbuf &&\r
516 isspace(Py_CHARMASK(*lastc))) {\r
517 /* Trim trailing whitespace (CRLF) */\r
518 *lastc-- = '\0';\r
519 }\r
520 }\r
521 v = Py_BuildValue("(is)", myerrorcode, outbuf);\r
522 if (v != NULL) {\r
523 PyErr_SetObject(socket_error, v);\r
524 Py_DECREF(v);\r
525 }\r
526 return NULL;\r
527 }\r
528 }\r
529#endif\r
530\r
531#if defined(RISCOS)\r
532 if (_inet_error.errnum != NULL) {\r
533 PyObject *v;\r
534 v = Py_BuildValue("(is)", errno, _inet_err());\r
535 if (v != NULL) {\r
536 PyErr_SetObject(socket_error, v);\r
537 Py_DECREF(v);\r
538 }\r
539 return NULL;\r
540 }\r
541#endif\r
542\r
543 return PyErr_SetFromErrno(socket_error);\r
544}\r
545\r
546\r
547static PyObject *\r
548set_herror(int h_error)\r
549{\r
550 PyObject *v;\r
551\r
552#ifdef HAVE_HSTRERROR\r
553 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));\r
554#else\r
555 v = Py_BuildValue("(is)", h_error, "host not found");\r
556#endif\r
557 if (v != NULL) {\r
558 PyErr_SetObject(socket_herror, v);\r
559 Py_DECREF(v);\r
560 }\r
561\r
562 return NULL;\r
563}\r
564\r
565\r
566static PyObject *\r
567set_gaierror(int error)\r
568{\r
569 PyObject *v;\r
570\r
571#ifdef EAI_SYSTEM\r
572 /* EAI_SYSTEM is not available on Windows XP. */\r
573 if (error == EAI_SYSTEM)\r
574 return set_error();\r
575#endif\r
576\r
577#ifdef HAVE_GAI_STRERROR\r
578 v = Py_BuildValue("(is)", error, gai_strerror(error));\r
579#else\r
580 v = Py_BuildValue("(is)", error, "getaddrinfo failed");\r
581#endif\r
582 if (v != NULL) {\r
583 PyErr_SetObject(socket_gaierror, v);\r
584 Py_DECREF(v);\r
585 }\r
586\r
587 return NULL;\r
588}\r
589\r
590#ifdef __VMS\r
591/* Function to send in segments */\r
592static int\r
593sendsegmented(int sock_fd, char *buf, int len, int flags)\r
594{\r
595 int n = 0;\r
596 int remaining = len;\r
597\r
598 while (remaining > 0) {\r
599 unsigned int segment;\r
600\r
601 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);\r
602 n = send(sock_fd, buf, segment, flags);\r
603 if (n < 0) {\r
604 return n;\r
605 }\r
606 remaining -= segment;\r
607 buf += segment;\r
608 } /* end while */\r
609\r
610 return len;\r
611}\r
612#endif\r
613\r
614/* Function to perform the setting of socket blocking mode\r
615 internally. block = (1 | 0). */\r
616static int\r
617internal_setblocking(PySocketSockObject *s, int block)\r
618{\r
619#ifndef RISCOS\r
620#ifndef MS_WINDOWS\r
621 int delay_flag;\r
622#endif\r
623#endif\r
624\r
625 Py_BEGIN_ALLOW_THREADS\r
626#ifdef __BEOS__\r
627 block = !block;\r
628 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,\r
629 (void *)(&block), sizeof(int));\r
630#else\r
631#ifndef RISCOS\r
632#ifndef MS_WINDOWS\r
633#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
634 block = !block;\r
635 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));\r
636#elif defined(__VMS)\r
637 block = !block;\r
638 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);\r
639#else /* !PYOS_OS2 && !__VMS */\r
640 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);\r
641 if (block)\r
642 delay_flag &= (~O_NONBLOCK);\r
643 else\r
644 delay_flag |= O_NONBLOCK;\r
645 fcntl(s->sock_fd, F_SETFL, delay_flag);\r
646#endif /* !PYOS_OS2 */\r
647#else /* MS_WINDOWS */\r
648 block = !block;\r
649 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);\r
650#endif /* MS_WINDOWS */\r
651#else /* RISCOS */\r
652 block = !block;\r
653 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);\r
654#endif /* RISCOS */\r
655#endif /* __BEOS__ */\r
656 Py_END_ALLOW_THREADS\r
657\r
658 /* Since these don't return anything */\r
659 return 1;\r
660}\r
661\r
662/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).\r
663 The argument writing indicates the direction.\r
664 This does not raise an exception; we'll let our caller do that\r
665 after they've reacquired the interpreter lock.\r
666 Returns 1 on timeout, -1 on error, 0 otherwise. */\r
667static int\r
668internal_select(PySocketSockObject *s, int writing)\r
669{\r
670 int n;\r
671\r
672 /* Nothing to do unless we're in timeout mode (not non-blocking) */\r
673 if (s->sock_timeout <= 0.0)\r
674 return 0;\r
675\r
676 /* Guard against closed socket */\r
677 if (s->sock_fd < 0)\r
678 return 0;\r
679\r
680 /* Prefer poll, if available, since you can poll() any fd\r
681 * which can't be done with select(). */\r
682#ifdef HAVE_POLL\r
683 {\r
684 struct pollfd pollfd;\r
685 int timeout;\r
686\r
687 pollfd.fd = s->sock_fd;\r
688 pollfd.events = writing ? POLLOUT : POLLIN;\r
689\r
690 /* s->sock_timeout is in seconds, timeout in ms */\r
691 timeout = (int)(s->sock_timeout * 1000 + 0.5);\r
692 n = poll(&pollfd, 1, timeout);\r
693 }\r
694#else\r
695 {\r
696 /* Construct the arguments to select */\r
697 fd_set fds;\r
698 struct timeval tv;\r
699 tv.tv_sec = (int)s->sock_timeout;\r
700 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);\r
701 FD_ZERO(&fds);\r
702 FD_SET(s->sock_fd, &fds);\r
703\r
704 /* See if the socket is ready */\r
705 if (writing)\r
706 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);\r
707 else\r
708 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);\r
709 }\r
710#endif\r
711\r
712 if (n < 0)\r
713 return -1;\r
714 if (n == 0)\r
715 return 1;\r
716 return 0;\r
717}\r
718\r
719/* Initialize a new socket object. */\r
720\r
721static double defaulttimeout = -1.0; /* Default timeout for new sockets */\r
722\r
723PyMODINIT_FUNC\r
724init_sockobject(PySocketSockObject *s,\r
725 SOCKET_T fd, int family, int type, int proto)\r
726{\r
727#ifdef RISCOS\r
728 int block = 1;\r
729#endif\r
730 s->sock_fd = fd;\r
731 s->sock_family = family;\r
732 s->sock_type = type;\r
733 s->sock_proto = proto;\r
734 s->sock_timeout = defaulttimeout;\r
735\r
736 s->errorhandler = &set_error;\r
737\r
738 if (defaulttimeout >= 0.0)\r
739 internal_setblocking(s, 0);\r
740\r
741#ifdef RISCOS\r
742 if (taskwindow)\r
743 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);\r
744#endif\r
745}\r
746\r
747\r
748/* Create a new socket object.\r
749 This just creates the object and initializes it.\r
750 If the creation fails, return NULL and set an exception (implicit\r
751 in NEWOBJ()). */\r
752\r
753static PySocketSockObject *\r
754new_sockobject(SOCKET_T fd, int family, int type, int proto)\r
755{\r
756 PySocketSockObject *s;\r
757 s = (PySocketSockObject *)\r
758 PyType_GenericNew(&sock_type, NULL, NULL);\r
759 if (s != NULL)\r
760 init_sockobject(s, fd, family, type, proto);\r
761 return s;\r
762}\r
763\r
764\r
765/* Lock to allow python interpreter to continue, but only allow one\r
766 thread to be in gethostbyname or getaddrinfo */\r
767#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
768PyThread_type_lock netdb_lock;\r
769#endif\r
770\r
771\r
772/* Convert a string specifying a host name or one of a few symbolic\r
773 names to a numeric IP address. This usually calls gethostbyname()\r
774 to do the work; the names "" and "<broadcast>" are special.\r
775 Return the length (IPv4 should be 4 bytes), or negative if\r
776 an error occurred; then an exception is raised. */\r
777\r
778static int\r
779setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)\r
780{\r
781 struct addrinfo hints, *res;\r
782 int error;\r
783 int d1, d2, d3, d4;\r
784 char ch;\r
785\r
786 memset((void *) addr_ret, '\0', sizeof(*addr_ret));\r
787 if (name[0] == '\0') {\r
788 int siz;\r
789 memset(&hints, 0, sizeof(hints));\r
790 hints.ai_family = af;\r
791 hints.ai_socktype = SOCK_DGRAM; /*dummy*/\r
792 hints.ai_flags = AI_PASSIVE;\r
793 Py_BEGIN_ALLOW_THREADS\r
794 ACQUIRE_GETADDRINFO_LOCK\r
795 error = getaddrinfo(NULL, "0", &hints, &res);\r
796 Py_END_ALLOW_THREADS\r
797 /* We assume that those thread-unsafe getaddrinfo() versions\r
798 *are* safe regarding their return value, ie. that a\r
799 subsequent call to getaddrinfo() does not destroy the\r
800 outcome of the first call. */\r
801 RELEASE_GETADDRINFO_LOCK\r
802 if (error) {\r
803 set_gaierror(error);\r
804 return -1;\r
805 }\r
806 switch (res->ai_family) {\r
807 case AF_INET:\r
808 siz = 4;\r
809 break;\r
810#ifdef ENABLE_IPV6\r
811 case AF_INET6:\r
812 siz = 16;\r
813 break;\r
814#endif\r
815 default:\r
816 freeaddrinfo(res);\r
817 PyErr_SetString(socket_error,\r
818 "unsupported address family");\r
819 return -1;\r
820 }\r
821 if (res->ai_next) {\r
822 freeaddrinfo(res);\r
823 PyErr_SetString(socket_error,\r
824 "wildcard resolved to multiple address");\r
825 return -1;\r
826 }\r
827 if (res->ai_addrlen < addr_ret_size)\r
828 addr_ret_size = res->ai_addrlen;\r
829 memcpy(addr_ret, res->ai_addr, addr_ret_size);\r
830 freeaddrinfo(res);\r
831 return siz;\r
832 }\r
833 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {\r
834 struct sockaddr_in *sin;\r
835 if (af != AF_INET && af != AF_UNSPEC) {\r
836 PyErr_SetString(socket_error,\r
837 "address family mismatched");\r
838 return -1;\r
839 }\r
840 sin = (struct sockaddr_in *)addr_ret;\r
841 memset((void *) sin, '\0', sizeof(*sin));\r
842 sin->sin_family = AF_INET;\r
843#ifdef HAVE_SOCKADDR_SA_LEN\r
844 sin->sin_len = sizeof(*sin);\r
845#endif\r
846 sin->sin_addr.s_addr = INADDR_BROADCAST;\r
847 return sizeof(sin->sin_addr);\r
848 }\r
849 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&\r
850 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&\r
851 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {\r
852 struct sockaddr_in *sin;\r
853 sin = (struct sockaddr_in *)addr_ret;\r
854 sin->sin_addr.s_addr = htonl(\r
855 ((long) d1 << 24) | ((long) d2 << 16) |\r
856 ((long) d3 << 8) | ((long) d4 << 0));\r
857 sin->sin_family = AF_INET;\r
858#ifdef HAVE_SOCKADDR_SA_LEN\r
859 sin->sin_len = sizeof(*sin);\r
860#endif\r
861 return 4;\r
862 }\r
863 memset(&hints, 0, sizeof(hints));\r
864 hints.ai_family = af;\r
865 Py_BEGIN_ALLOW_THREADS\r
866 ACQUIRE_GETADDRINFO_LOCK\r
867 error = getaddrinfo(name, NULL, &hints, &res);\r
868#if defined(__digital__) && defined(__unix__)\r
869 if (error == EAI_NONAME && af == AF_UNSPEC) {\r
870 /* On Tru64 V5.1, numeric-to-addr conversion fails\r
871 if no address family is given. Assume IPv4 for now.*/\r
872 hints.ai_family = AF_INET;\r
873 error = getaddrinfo(name, NULL, &hints, &res);\r
874 }\r
875#endif\r
876 Py_END_ALLOW_THREADS\r
877 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */\r
878 if (error) {\r
879 set_gaierror(error);\r
880 return -1;\r
881 }\r
882 if (res->ai_addrlen < addr_ret_size)\r
883 addr_ret_size = res->ai_addrlen;\r
884 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);\r
885 freeaddrinfo(res);\r
886 switch (addr_ret->sa_family) {\r
887 case AF_INET:\r
888 return 4;\r
889#ifdef ENABLE_IPV6\r
890 case AF_INET6:\r
891 return 16;\r
892#endif\r
893 default:\r
894 PyErr_SetString(socket_error, "unknown address family");\r
895 return -1;\r
896 }\r
897}\r
898\r
899\r
900/* Create a string object representing an IP address.\r
901 This is always a string of the form 'dd.dd.dd.dd' (with variable\r
902 size numbers). */\r
903\r
904static PyObject *\r
905makeipaddr(struct sockaddr *addr, int addrlen)\r
906{\r
907 char buf[NI_MAXHOST];\r
908 int error;\r
909\r
910 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,\r
911 NI_NUMERICHOST);\r
912 if (error) {\r
913 set_gaierror(error);\r
914 return NULL;\r
915 }\r
916 return PyString_FromString(buf);\r
917}\r
918\r
919\r
920#ifdef USE_BLUETOOTH\r
921/* Convert a string representation of a Bluetooth address into a numeric\r
922 address. Returns the length (6), or raises an exception and returns -1 if\r
923 an error occurred. */\r
924\r
925static int\r
926setbdaddr(char *name, bdaddr_t *bdaddr)\r
927{\r
928 unsigned int b0, b1, b2, b3, b4, b5;\r
929 char ch;\r
930 int n;\r
931\r
932 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",\r
933 &b5, &b4, &b3, &b2, &b1, &b0, &ch);\r
934 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {\r
935 bdaddr->b[0] = b0;\r
936 bdaddr->b[1] = b1;\r
937 bdaddr->b[2] = b2;\r
938 bdaddr->b[3] = b3;\r
939 bdaddr->b[4] = b4;\r
940 bdaddr->b[5] = b5;\r
941 return 6;\r
942 } else {\r
943 PyErr_SetString(socket_error, "bad bluetooth address");\r
944 return -1;\r
945 }\r
946}\r
947\r
948/* Create a string representation of the Bluetooth address. This is always a\r
949 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal\r
950 value (zero padded if necessary). */\r
951\r
952static PyObject *\r
953makebdaddr(bdaddr_t *bdaddr)\r
954{\r
955 char buf[(6 * 2) + 5 + 1];\r
956\r
957 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",\r
958 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],\r
959 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);\r
960 return PyString_FromString(buf);\r
961}\r
962#endif\r
963\r
964\r
965/* Create an object representing the given socket address,\r
966 suitable for passing it back to bind(), connect() etc.\r
967 The family field of the sockaddr structure is inspected\r
968 to determine what kind of address it really is. */\r
969\r
970/*ARGSUSED*/\r
971static PyObject *\r
972makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)\r
973{\r
974 if (addrlen == 0) {\r
975 /* No address -- may be recvfrom() from known socket */\r
976 Py_INCREF(Py_None);\r
977 return Py_None;\r
978 }\r
979\r
980#ifdef __BEOS__\r
981 /* XXX: BeOS version of accept() doesn't set family correctly */\r
982 addr->sa_family = AF_INET;\r
983#endif\r
984\r
985 switch (addr->sa_family) {\r
986\r
987 case AF_INET:\r
988 {\r
989 struct sockaddr_in *a;\r
990 PyObject *addrobj = makeipaddr(addr, sizeof(*a));\r
991 PyObject *ret = NULL;\r
992 if (addrobj) {\r
993 a = (struct sockaddr_in *)addr;\r
994 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));\r
995 Py_DECREF(addrobj);\r
996 }\r
997 return ret;\r
998 }\r
999\r
1000#if defined(AF_UNIX)\r
1001 case AF_UNIX:\r
1002 {\r
1003 struct sockaddr_un *a = (struct sockaddr_un *) addr;\r
1004#ifdef linux\r
1005 if (a->sun_path[0] == 0) { /* Linux abstract namespace */\r
1006 addrlen -= offsetof(struct sockaddr_un, sun_path);\r
1007 return PyString_FromStringAndSize(a->sun_path,\r
1008 addrlen);\r
1009 }\r
1010 else\r
1011#endif /* linux */\r
1012 {\r
1013 /* regular NULL-terminated string */\r
1014 return PyString_FromString(a->sun_path);\r
1015 }\r
1016 }\r
1017#endif /* AF_UNIX */\r
1018\r
1019#if defined(AF_NETLINK)\r
1020 case AF_NETLINK:\r
1021 {\r
1022 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;\r
1023 return Py_BuildValue("II", a->nl_pid, a->nl_groups);\r
1024 }\r
1025#endif /* AF_NETLINK */\r
1026\r
1027#ifdef ENABLE_IPV6\r
1028 case AF_INET6:\r
1029 {\r
1030 struct sockaddr_in6 *a;\r
1031 PyObject *addrobj = makeipaddr(addr, sizeof(*a));\r
1032 PyObject *ret = NULL;\r
1033 if (addrobj) {\r
1034 a = (struct sockaddr_in6 *)addr;\r
1035 ret = Py_BuildValue("Oiii",\r
1036 addrobj,\r
1037 ntohs(a->sin6_port),\r
1038 a->sin6_flowinfo,\r
1039 a->sin6_scope_id);\r
1040 Py_DECREF(addrobj);\r
1041 }\r
1042 return ret;\r
1043 }\r
1044#endif\r
1045\r
1046#ifdef USE_BLUETOOTH\r
1047 case AF_BLUETOOTH:\r
1048 switch (proto) {\r
1049\r
1050 case BTPROTO_L2CAP:\r
1051 {\r
1052 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;\r
1053 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));\r
1054 PyObject *ret = NULL;\r
1055 if (addrobj) {\r
1056 ret = Py_BuildValue("Oi",\r
1057 addrobj,\r
1058 _BT_L2_MEMB(a, psm));\r
1059 Py_DECREF(addrobj);\r
1060 }\r
1061 return ret;\r
1062 }\r
1063\r
1064 case BTPROTO_RFCOMM:\r
1065 {\r
1066 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;\r
1067 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));\r
1068 PyObject *ret = NULL;\r
1069 if (addrobj) {\r
1070 ret = Py_BuildValue("Oi",\r
1071 addrobj,\r
1072 _BT_RC_MEMB(a, channel));\r
1073 Py_DECREF(addrobj);\r
1074 }\r
1075 return ret;\r
1076 }\r
1077\r
1078 case BTPROTO_HCI:\r
1079 {\r
1080 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;\r
1081#if defined(__NetBSD__) || defined(__DragonFly__)\r
1082 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));\r
1083#else\r
1084 PyObject *ret = NULL;\r
1085 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));\r
1086 return ret;\r
1087#endif\r
1088 }\r
1089\r
1090#if !defined(__FreeBSD__)\r
1091 case BTPROTO_SCO:\r
1092 {\r
1093 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;\r
1094 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));\r
1095 }\r
1096#endif\r
1097\r
1098 default:\r
1099 PyErr_SetString(PyExc_ValueError,\r
1100 "Unknown Bluetooth protocol");\r
1101 return NULL;\r
1102 }\r
1103#endif\r
1104\r
1105#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)\r
1106 case AF_PACKET:\r
1107 {\r
1108 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;\r
1109 char *ifname = "";\r
1110 struct ifreq ifr;\r
1111 /* need to look up interface name give index */\r
1112 if (a->sll_ifindex) {\r
1113 ifr.ifr_ifindex = a->sll_ifindex;\r
1114 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)\r
1115 ifname = ifr.ifr_name;\r
1116 }\r
1117 return Py_BuildValue("shbhs#",\r
1118 ifname,\r
1119 ntohs(a->sll_protocol),\r
1120 a->sll_pkttype,\r
1121 a->sll_hatype,\r
1122 a->sll_addr,\r
1123 a->sll_halen);\r
1124 }\r
1125#endif\r
1126\r
1127#ifdef HAVE_LINUX_TIPC_H\r
1128 case AF_TIPC:\r
1129 {\r
1130 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;\r
1131 if (a->addrtype == TIPC_ADDR_NAMESEQ) {\r
1132 return Py_BuildValue("IIIII",\r
1133 a->addrtype,\r
1134 a->addr.nameseq.type,\r
1135 a->addr.nameseq.lower,\r
1136 a->addr.nameseq.upper,\r
1137 a->scope);\r
1138 } else if (a->addrtype == TIPC_ADDR_NAME) {\r
1139 return Py_BuildValue("IIIII",\r
1140 a->addrtype,\r
1141 a->addr.name.name.type,\r
1142 a->addr.name.name.instance,\r
1143 a->addr.name.name.instance,\r
1144 a->scope);\r
1145 } else if (a->addrtype == TIPC_ADDR_ID) {\r
1146 return Py_BuildValue("IIIII",\r
1147 a->addrtype,\r
1148 a->addr.id.node,\r
1149 a->addr.id.ref,\r
1150 0,\r
1151 a->scope);\r
1152 } else {\r
1153 PyErr_SetString(PyExc_ValueError,\r
1154 "Invalid address type");\r
1155 return NULL;\r
1156 }\r
1157 }\r
1158#endif\r
1159\r
1160 /* More cases here... */\r
1161\r
1162 default:\r
1163 /* If we don't know the address family, don't raise an\r
1164 exception -- return it as a tuple. */\r
1165 return Py_BuildValue("is#",\r
1166 addr->sa_family,\r
1167 addr->sa_data,\r
1168 sizeof(addr->sa_data));\r
1169\r
1170 }\r
1171}\r
1172\r
1173\r
1174/* Parse a socket address argument according to the socket object's\r
1175 address family. Return 1 if the address was in the proper format,\r
1176 0 of not. The address is returned through addr_ret, its length\r
1177 through len_ret. */\r
1178\r
1179static int\r
1180getsockaddrarg(PySocketSockObject *s, PyObject *args,\r
1181 struct sockaddr *addr_ret, int *len_ret)\r
1182{\r
1183 switch (s->sock_family) {\r
1184\r
1185#if defined(AF_UNIX)\r
1186 case AF_UNIX:\r
1187 {\r
1188 struct sockaddr_un* addr;\r
1189 char *path;\r
1190 int len;\r
1191 if (!PyArg_Parse(args, "t#", &path, &len))\r
1192 return 0;\r
1193\r
1194 addr = (struct sockaddr_un*)addr_ret;\r
1195#ifdef linux\r
1196 if (len > 0 && path[0] == 0) {\r
1197 /* Linux abstract namespace extension */\r
1198 if (len > sizeof addr->sun_path) {\r
1199 PyErr_SetString(socket_error,\r
1200 "AF_UNIX path too long");\r
1201 return 0;\r
1202 }\r
1203 }\r
1204 else\r
1205#endif /* linux */\r
1206 {\r
1207 /* regular NULL-terminated string */\r
1208 if (len >= sizeof addr->sun_path) {\r
1209 PyErr_SetString(socket_error,\r
1210 "AF_UNIX path too long");\r
1211 return 0;\r
1212 }\r
1213 addr->sun_path[len] = 0;\r
1214 }\r
1215 addr->sun_family = s->sock_family;\r
1216 memcpy(addr->sun_path, path, len);\r
1217#if defined(PYOS_OS2)\r
1218 *len_ret = sizeof(*addr);\r
1219#else\r
1220 *len_ret = len + offsetof(struct sockaddr_un, sun_path);\r
1221#endif\r
1222 return 1;\r
1223 }\r
1224#endif /* AF_UNIX */\r
1225\r
1226#if defined(AF_NETLINK)\r
1227 case AF_NETLINK:\r
1228 {\r
1229 struct sockaddr_nl* addr;\r
1230 int pid, groups;\r
1231 addr = (struct sockaddr_nl *)addr_ret;\r
1232 if (!PyTuple_Check(args)) {\r
1233 PyErr_Format(\r
1234 PyExc_TypeError,\r
1235 "getsockaddrarg: "\r
1236 "AF_NETLINK address must be tuple, not %.500s",\r
1237 Py_TYPE(args)->tp_name);\r
1238 return 0;\r
1239 }\r
1240 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))\r
1241 return 0;\r
1242 addr->nl_family = AF_NETLINK;\r
1243 addr->nl_pid = pid;\r
1244 addr->nl_groups = groups;\r
1245 *len_ret = sizeof(*addr);\r
1246 return 1;\r
1247 }\r
1248#endif\r
1249\r
1250 case AF_INET:\r
1251 {\r
1252 struct sockaddr_in* addr;\r
1253 char *host;\r
1254 int port, result;\r
1255 if (!PyTuple_Check(args)) {\r
1256 PyErr_Format(\r
1257 PyExc_TypeError,\r
1258 "getsockaddrarg: "\r
1259 "AF_INET address must be tuple, not %.500s",\r
1260 Py_TYPE(args)->tp_name);\r
1261 return 0;\r
1262 }\r
1263 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",\r
1264 "idna", &host, &port))\r
1265 return 0;\r
1266 addr=(struct sockaddr_in*)addr_ret;\r
1267 result = setipaddr(host, (struct sockaddr *)addr,\r
1268 sizeof(*addr), AF_INET);\r
1269 PyMem_Free(host);\r
1270 if (result < 0)\r
1271 return 0;\r
1272 if (port < 0 || port > 0xffff) {\r
1273 PyErr_SetString(\r
1274 PyExc_OverflowError,\r
1275 "getsockaddrarg: port must be 0-65535.");\r
1276 return 0;\r
1277 }\r
1278 addr->sin_family = AF_INET;\r
1279 addr->sin_port = htons((short)port);\r
1280 *len_ret = sizeof *addr;\r
1281 return 1;\r
1282 }\r
1283\r
1284#ifdef ENABLE_IPV6\r
1285 case AF_INET6:\r
1286 {\r
1287 struct sockaddr_in6* addr;\r
1288 char *host;\r
1289 int port, flowinfo, scope_id, result;\r
1290 flowinfo = scope_id = 0;\r
1291 if (!PyTuple_Check(args)) {\r
1292 PyErr_Format(\r
1293 PyExc_TypeError,\r
1294 "getsockaddrarg: "\r
1295 "AF_INET6 address must be tuple, not %.500s",\r
1296 Py_TYPE(args)->tp_name);\r
1297 return 0;\r
1298 }\r
1299 if (!PyArg_ParseTuple(args, "eti|ii",\r
1300 "idna", &host, &port, &flowinfo,\r
1301 &scope_id)) {\r
1302 return 0;\r
1303 }\r
1304 addr = (struct sockaddr_in6*)addr_ret;\r
1305 result = setipaddr(host, (struct sockaddr *)addr,\r
1306 sizeof(*addr), AF_INET6);\r
1307 PyMem_Free(host);\r
1308 if (result < 0)\r
1309 return 0;\r
1310 if (port < 0 || port > 0xffff) {\r
1311 PyErr_SetString(\r
1312 PyExc_OverflowError,\r
1313 "getsockaddrarg: port must be 0-65535.");\r
1314 return 0;\r
1315 }\r
1316 addr->sin6_family = s->sock_family;\r
1317 addr->sin6_port = htons((short)port);\r
1318 addr->sin6_flowinfo = flowinfo;\r
1319 addr->sin6_scope_id = scope_id;\r
1320 *len_ret = sizeof *addr;\r
1321 return 1;\r
1322 }\r
1323#endif\r
1324\r
1325#ifdef USE_BLUETOOTH\r
1326 case AF_BLUETOOTH:\r
1327 {\r
1328 switch (s->sock_proto) {\r
1329 case BTPROTO_L2CAP:\r
1330 {\r
1331 struct sockaddr_l2 *addr;\r
1332 char *straddr;\r
1333\r
1334 addr = (struct sockaddr_l2 *)addr_ret;\r
1335 memset(addr, 0, sizeof(struct sockaddr_l2));\r
1336 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;\r
1337 if (!PyArg_ParseTuple(args, "si", &straddr,\r
1338 &_BT_L2_MEMB(addr, psm))) {\r
1339 PyErr_SetString(socket_error, "getsockaddrarg: "\r
1340 "wrong format");\r
1341 return 0;\r
1342 }\r
1343 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)\r
1344 return 0;\r
1345\r
1346 *len_ret = sizeof *addr;\r
1347 return 1;\r
1348 }\r
1349 case BTPROTO_RFCOMM:\r
1350 {\r
1351 struct sockaddr_rc *addr;\r
1352 char *straddr;\r
1353\r
1354 addr = (struct sockaddr_rc *)addr_ret;\r
1355 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;\r
1356 if (!PyArg_ParseTuple(args, "si", &straddr,\r
1357 &_BT_RC_MEMB(addr, channel))) {\r
1358 PyErr_SetString(socket_error, "getsockaddrarg: "\r
1359 "wrong format");\r
1360 return 0;\r
1361 }\r
1362 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)\r
1363 return 0;\r
1364\r
1365 *len_ret = sizeof *addr;\r
1366 return 1;\r
1367 }\r
1368 case BTPROTO_HCI:\r
1369 {\r
1370 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;\r
1371#if defined(__NetBSD__) || defined(__DragonFly__)\r
c9f4d483 1372 char *straddr = PyBytes_AS_STRING(args);\r
4710c53d 1373\r
c9f4d483 1374 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;\r
4710c53d 1375 if (straddr == NULL) {\r
1376 PyErr_SetString(socket_error, "getsockaddrarg: "\r
1377 "wrong format");\r
1378 return 0;\r
1379 }\r
1380 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)\r
1381 return 0;\r
1382#else\r
1383 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;\r
1384 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {\r
1385 PyErr_SetString(socket_error, "getsockaddrarg: "\r
1386 "wrong format");\r
1387 return 0;\r
1388 }\r
1389#endif\r
1390 *len_ret = sizeof *addr;\r
1391 return 1;\r
1392 }\r
1393#if !defined(__FreeBSD__)\r
1394 case BTPROTO_SCO:\r
1395 {\r
1396 struct sockaddr_sco *addr;\r
1397 char *straddr;\r
1398\r
1399 addr = (struct sockaddr_sco *)addr_ret;\r
1400 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;\r
1401 straddr = PyString_AsString(args);\r
1402 if (straddr == NULL) {\r
1403 PyErr_SetString(socket_error, "getsockaddrarg: "\r
1404 "wrong format");\r
1405 return 0;\r
1406 }\r
1407 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)\r
1408 return 0;\r
1409\r
1410 *len_ret = sizeof *addr;\r
1411 return 1;\r
1412 }\r
1413#endif\r
1414 default:\r
1415 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");\r
1416 return 0;\r
1417 }\r
1418 }\r
1419#endif\r
1420\r
1421#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)\r
1422 case AF_PACKET:\r
1423 {\r
1424 struct sockaddr_ll* addr;\r
1425 struct ifreq ifr;\r
1426 char *interfaceName;\r
1427 int protoNumber;\r
1428 int hatype = 0;\r
1429 int pkttype = 0;\r
1430 char *haddr = NULL;\r
1431 unsigned int halen = 0;\r
1432\r
1433 if (!PyTuple_Check(args)) {\r
1434 PyErr_Format(\r
1435 PyExc_TypeError,\r
1436 "getsockaddrarg: "\r
1437 "AF_PACKET address must be tuple, not %.500s",\r
1438 Py_TYPE(args)->tp_name);\r
1439 return 0;\r
1440 }\r
1441 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,\r
1442 &protoNumber, &pkttype, &hatype,\r
1443 &haddr, &halen))\r
1444 return 0;\r
1445 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));\r
1446 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';\r
1447 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {\r
1448 s->errorhandler();\r
1449 return 0;\r
1450 }\r
1451 if (halen > 8) {\r
1452 PyErr_SetString(PyExc_ValueError,\r
1453 "Hardware address must be 8 bytes or less");\r
1454 return 0;\r
1455 }\r
1456 if (protoNumber < 0 || protoNumber > 0xffff) {\r
1457 PyErr_SetString(\r
1458 PyExc_OverflowError,\r
1459 "getsockaddrarg: protoNumber must be 0-65535.");\r
1460 return 0;\r
1461 }\r
1462 addr = (struct sockaddr_ll*)addr_ret;\r
1463 addr->sll_family = AF_PACKET;\r
1464 addr->sll_protocol = htons((short)protoNumber);\r
1465 addr->sll_ifindex = ifr.ifr_ifindex;\r
1466 addr->sll_pkttype = pkttype;\r
1467 addr->sll_hatype = hatype;\r
1468 if (halen != 0) {\r
1469 memcpy(&addr->sll_addr, haddr, halen);\r
1470 }\r
1471 addr->sll_halen = halen;\r
1472 *len_ret = sizeof *addr;\r
1473 return 1;\r
1474 }\r
1475#endif\r
1476\r
1477#ifdef HAVE_LINUX_TIPC_H\r
1478 case AF_TIPC:\r
1479 {\r
1480 unsigned int atype, v1, v2, v3;\r
1481 unsigned int scope = TIPC_CLUSTER_SCOPE;\r
1482 struct sockaddr_tipc *addr;\r
1483\r
1484 if (!PyTuple_Check(args)) {\r
1485 PyErr_Format(\r
1486 PyExc_TypeError,\r
1487 "getsockaddrarg: "\r
1488 "AF_TIPC address must be tuple, not %.500s",\r
1489 Py_TYPE(args)->tp_name);\r
1490 return 0;\r
1491 }\r
1492\r
1493 if (!PyArg_ParseTuple(args,\r
1494 "IIII|I;Invalid TIPC address format",\r
1495 &atype, &v1, &v2, &v3, &scope))\r
1496 return 0;\r
1497\r
1498 addr = (struct sockaddr_tipc *) addr_ret;\r
1499 memset(addr, 0, sizeof(struct sockaddr_tipc));\r
1500\r
1501 addr->family = AF_TIPC;\r
1502 addr->scope = scope;\r
1503 addr->addrtype = atype;\r
1504\r
1505 if (atype == TIPC_ADDR_NAMESEQ) {\r
1506 addr->addr.nameseq.type = v1;\r
1507 addr->addr.nameseq.lower = v2;\r
1508 addr->addr.nameseq.upper = v3;\r
1509 } else if (atype == TIPC_ADDR_NAME) {\r
1510 addr->addr.name.name.type = v1;\r
1511 addr->addr.name.name.instance = v2;\r
1512 } else if (atype == TIPC_ADDR_ID) {\r
1513 addr->addr.id.node = v1;\r
1514 addr->addr.id.ref = v2;\r
1515 } else {\r
1516 /* Shouldn't happen */\r
1517 PyErr_SetString(PyExc_TypeError, "Invalid address type");\r
1518 return 0;\r
1519 }\r
1520\r
1521 *len_ret = sizeof(*addr);\r
1522\r
1523 return 1;\r
1524 }\r
1525#endif\r
1526\r
1527 /* More cases here... */\r
1528\r
1529 default:\r
1530 PyErr_SetString(socket_error, "getsockaddrarg: bad family");\r
1531 return 0;\r
1532\r
1533 }\r
1534}\r
1535\r
1536\r
1537/* Get the address length according to the socket object's address family.\r
1538 Return 1 if the family is known, 0 otherwise. The length is returned\r
1539 through len_ret. */\r
1540\r
1541static int\r
1542getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)\r
1543{\r
1544 switch (s->sock_family) {\r
1545\r
1546#if defined(AF_UNIX)\r
1547 case AF_UNIX:\r
1548 {\r
1549 *len_ret = sizeof (struct sockaddr_un);\r
1550 return 1;\r
1551 }\r
1552#endif /* AF_UNIX */\r
1553#if defined(AF_NETLINK)\r
1554 case AF_NETLINK:\r
1555 {\r
1556 *len_ret = sizeof (struct sockaddr_nl);\r
1557 return 1;\r
1558 }\r
1559#endif\r
1560\r
1561 case AF_INET:\r
1562 {\r
1563 *len_ret = sizeof (struct sockaddr_in);\r
1564 return 1;\r
1565 }\r
1566\r
1567#ifdef ENABLE_IPV6\r
1568 case AF_INET6:\r
1569 {\r
1570 *len_ret = sizeof (struct sockaddr_in6);\r
1571 return 1;\r
1572 }\r
1573#endif\r
1574\r
1575#ifdef USE_BLUETOOTH\r
1576 case AF_BLUETOOTH:\r
1577 {\r
1578 switch(s->sock_proto)\r
1579 {\r
1580\r
1581 case BTPROTO_L2CAP:\r
1582 *len_ret = sizeof (struct sockaddr_l2);\r
1583 return 1;\r
1584 case BTPROTO_RFCOMM:\r
1585 *len_ret = sizeof (struct sockaddr_rc);\r
1586 return 1;\r
1587 case BTPROTO_HCI:\r
1588 *len_ret = sizeof (struct sockaddr_hci);\r
1589 return 1;\r
1590#if !defined(__FreeBSD__)\r
1591 case BTPROTO_SCO:\r
1592 *len_ret = sizeof (struct sockaddr_sco);\r
1593 return 1;\r
1594#endif\r
1595 default:\r
1596 PyErr_SetString(socket_error, "getsockaddrlen: "\r
1597 "unknown BT protocol");\r
1598 return 0;\r
1599\r
1600 }\r
1601 }\r
1602#endif\r
1603\r
1604#ifdef HAVE_NETPACKET_PACKET_H\r
1605 case AF_PACKET:\r
1606 {\r
1607 *len_ret = sizeof (struct sockaddr_ll);\r
1608 return 1;\r
1609 }\r
1610#endif\r
1611\r
1612#ifdef HAVE_LINUX_TIPC_H\r
1613 case AF_TIPC:\r
1614 {\r
1615 *len_ret = sizeof (struct sockaddr_tipc);\r
1616 return 1;\r
1617 }\r
1618#endif\r
1619\r
1620 /* More cases here... */\r
1621\r
1622 default:\r
1623 PyErr_SetString(socket_error, "getsockaddrlen: bad family");\r
1624 return 0;\r
1625\r
1626 }\r
1627}\r
1628\r
1629\r
1630/* s.accept() method */\r
1631\r
1632static PyObject *\r
1633sock_accept(PySocketSockObject *s)\r
1634{\r
1635 sock_addr_t addrbuf;\r
1636 SOCKET_T newfd;\r
1637 socklen_t addrlen;\r
1638 PyObject *sock = NULL;\r
1639 PyObject *addr = NULL;\r
1640 PyObject *res = NULL;\r
1641 int timeout;\r
1642\r
1643 if (!getsockaddrlen(s, &addrlen))\r
1644 return NULL;\r
1645 memset(&addrbuf, 0, addrlen);\r
1646\r
1647#ifdef MS_WINDOWS\r
1648 newfd = INVALID_SOCKET;\r
1649#else\r
1650 newfd = -1;\r
1651#endif\r
1652\r
1653 if (!IS_SELECTABLE(s))\r
1654 return select_error();\r
1655\r
1656 Py_BEGIN_ALLOW_THREADS\r
1657 timeout = internal_select(s, 0);\r
1658 if (!timeout)\r
1659 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
1660 Py_END_ALLOW_THREADS\r
1661\r
1662 if (timeout == 1) {\r
1663 PyErr_SetString(socket_timeout, "timed out");\r
1664 return NULL;\r
1665 }\r
1666\r
1667#ifdef MS_WINDOWS\r
1668 if (newfd == INVALID_SOCKET)\r
1669#else\r
1670 if (newfd < 0)\r
1671#endif\r
1672 return s->errorhandler();\r
1673\r
1674 /* Create the new object with unspecified family,\r
1675 to avoid calls to bind() etc. on it. */\r
1676 sock = (PyObject *) new_sockobject(newfd,\r
1677 s->sock_family,\r
1678 s->sock_type,\r
1679 s->sock_proto);\r
1680\r
1681 if (sock == NULL) {\r
1682 SOCKETCLOSE(newfd);\r
1683 goto finally;\r
1684 }\r
1685 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),\r
1686 addrlen, s->sock_proto);\r
1687 if (addr == NULL)\r
1688 goto finally;\r
1689\r
1690 res = PyTuple_Pack(2, sock, addr);\r
1691\r
1692finally:\r
1693 Py_XDECREF(sock);\r
1694 Py_XDECREF(addr);\r
1695 return res;\r
1696}\r
1697\r
1698PyDoc_STRVAR(accept_doc,\r
1699"accept() -> (socket object, address info)\n\\r
1700\n\\r
1701Wait for an incoming connection. Return a new socket representing the\n\\r
1702connection, and the address of the client. For IP sockets, the address\n\\r
1703info is a pair (hostaddr, port).");\r
1704\r
1705/* s.setblocking(flag) method. Argument:\r
1706 False -- non-blocking mode; same as settimeout(0)\r
1707 True -- blocking mode; same as settimeout(None)\r
1708*/\r
1709\r
1710static PyObject *\r
1711sock_setblocking(PySocketSockObject *s, PyObject *arg)\r
1712{\r
1713 int block;\r
1714\r
1715 block = PyInt_AsLong(arg);\r
1716 if (block == -1 && PyErr_Occurred())\r
1717 return NULL;\r
1718\r
1719 s->sock_timeout = block ? -1.0 : 0.0;\r
1720 internal_setblocking(s, block);\r
1721\r
1722 Py_INCREF(Py_None);\r
1723 return Py_None;\r
1724}\r
1725\r
1726PyDoc_STRVAR(setblocking_doc,\r
1727"setblocking(flag)\n\\r
1728\n\\r
1729Set the socket to blocking (flag is true) or non-blocking (false).\n\\r
1730setblocking(True) is equivalent to settimeout(None);\n\\r
1731setblocking(False) is equivalent to settimeout(0.0).");\r
1732\r
1733/* s.settimeout(timeout) method. Argument:\r
1734 None -- no timeout, blocking mode; same as setblocking(True)\r
1735 0.0 -- non-blocking mode; same as setblocking(False)\r
1736 > 0 -- timeout mode; operations time out after timeout seconds\r
1737 < 0 -- illegal; raises an exception\r
1738*/\r
1739static PyObject *\r
1740sock_settimeout(PySocketSockObject *s, PyObject *arg)\r
1741{\r
1742 double timeout;\r
1743\r
1744 if (arg == Py_None)\r
1745 timeout = -1.0;\r
1746 else {\r
1747 timeout = PyFloat_AsDouble(arg);\r
1748 if (timeout < 0.0) {\r
1749 if (!PyErr_Occurred())\r
1750 PyErr_SetString(PyExc_ValueError,\r
1751 "Timeout value out of range");\r
1752 return NULL;\r
1753 }\r
1754 }\r
1755\r
1756 s->sock_timeout = timeout;\r
1757 internal_setblocking(s, timeout < 0.0);\r
1758\r
1759 Py_INCREF(Py_None);\r
1760 return Py_None;\r
1761}\r
1762\r
1763PyDoc_STRVAR(settimeout_doc,\r
1764"settimeout(timeout)\n\\r
1765\n\\r
1766Set a timeout on socket operations. 'timeout' can be a float,\n\\r
1767giving in seconds, or None. Setting a timeout of None disables\n\\r
1768the timeout feature and is equivalent to setblocking(1).\n\\r
1769Setting a timeout of zero is the same as setblocking(0).");\r
1770\r
1771/* s.gettimeout() method.\r
1772 Returns the timeout associated with a socket. */\r
1773static PyObject *\r
1774sock_gettimeout(PySocketSockObject *s)\r
1775{\r
1776 if (s->sock_timeout < 0.0) {\r
1777 Py_INCREF(Py_None);\r
1778 return Py_None;\r
1779 }\r
1780 else\r
1781 return PyFloat_FromDouble(s->sock_timeout);\r
1782}\r
1783\r
1784PyDoc_STRVAR(gettimeout_doc,\r
1785"gettimeout() -> timeout\n\\r
1786\n\\r
1787Returns the timeout in floating seconds associated with socket \n\\r
1788operations. A timeout of None indicates that timeouts on socket \n\\r
1789operations are disabled.");\r
1790\r
1791#ifdef RISCOS\r
1792/* s.sleeptaskw(1 | 0) method */\r
1793\r
1794static PyObject *\r
1795sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)\r
1796{\r
1797 int block;\r
1798 block = PyInt_AsLong(arg);\r
1799 if (block == -1 && PyErr_Occurred())\r
1800 return NULL;\r
1801 Py_BEGIN_ALLOW_THREADS\r
1802 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);\r
1803 Py_END_ALLOW_THREADS\r
1804\r
1805 Py_INCREF(Py_None);\r
1806 return Py_None;\r
1807}\r
1808PyDoc_STRVAR(sleeptaskw_doc,\r
1809"sleeptaskw(flag)\n\\r
1810\n\\r
1811Allow sleeps in taskwindows.");\r
1812#endif\r
1813\r
1814\r
1815/* s.setsockopt() method.\r
1816 With an integer third argument, sets an integer option.\r
1817 With a string third argument, sets an option from a buffer;\r
1818 use optional built-in module 'struct' to encode the string. */\r
1819\r
1820static PyObject *\r
1821sock_setsockopt(PySocketSockObject *s, PyObject *args)\r
1822{\r
1823 int level;\r
1824 int optname;\r
1825 int res;\r
1826 char *buf;\r
1827 int buflen;\r
1828 int flag;\r
1829\r
1830 if (PyArg_ParseTuple(args, "iii:setsockopt",\r
1831 &level, &optname, &flag)) {\r
1832 buf = (char *) &flag;\r
1833 buflen = sizeof flag;\r
1834 }\r
1835 else {\r
1836 PyErr_Clear();\r
1837 if (!PyArg_ParseTuple(args, "iis#:setsockopt",\r
1838 &level, &optname, &buf, &buflen))\r
1839 return NULL;\r
1840 }\r
1841 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);\r
1842 if (res < 0)\r
1843 return s->errorhandler();\r
1844 Py_INCREF(Py_None);\r
1845 return Py_None;\r
1846}\r
1847\r
1848PyDoc_STRVAR(setsockopt_doc,\r
1849"setsockopt(level, option, value)\n\\r
1850\n\\r
1851Set a socket option. See the Unix manual for level and option.\n\\r
1852The value argument can either be an integer or a string.");\r
1853\r
1854\r
1855/* s.getsockopt() method.\r
1856 With two arguments, retrieves an integer option.\r
1857 With a third integer argument, retrieves a string buffer of that size;\r
1858 use optional built-in module 'struct' to decode the string. */\r
1859\r
1860static PyObject *\r
1861sock_getsockopt(PySocketSockObject *s, PyObject *args)\r
1862{\r
1863 int level;\r
1864 int optname;\r
1865 int res;\r
1866 PyObject *buf;\r
1867 socklen_t buflen = 0;\r
1868\r
1869#ifdef __BEOS__\r
1870 /* We have incomplete socket support. */\r
1871 PyErr_SetString(socket_error, "getsockopt not supported");\r
1872 return NULL;\r
1873#else\r
1874\r
1875 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",\r
1876 &level, &optname, &buflen))\r
1877 return NULL;\r
1878\r
1879 if (buflen == 0) {\r
1880 int flag = 0;\r
1881 socklen_t flagsize = sizeof flag;\r
1882 res = getsockopt(s->sock_fd, level, optname,\r
1883 (void *)&flag, &flagsize);\r
1884 if (res < 0)\r
1885 return s->errorhandler();\r
1886 return PyInt_FromLong(flag);\r
1887 }\r
1888#ifdef __VMS\r
1889 /* socklen_t is unsigned so no negative test is needed,\r
1890 test buflen == 0 is previously done */\r
1891 if (buflen > 1024) {\r
1892#else\r
1893 if (buflen <= 0 || buflen > 1024) {\r
1894#endif\r
1895 PyErr_SetString(socket_error,\r
1896 "getsockopt buflen out of range");\r
1897 return NULL;\r
1898 }\r
1899 buf = PyString_FromStringAndSize((char *)NULL, buflen);\r
1900 if (buf == NULL)\r
1901 return NULL;\r
1902 res = getsockopt(s->sock_fd, level, optname,\r
1903 (void *)PyString_AS_STRING(buf), &buflen);\r
1904 if (res < 0) {\r
1905 Py_DECREF(buf);\r
1906 return s->errorhandler();\r
1907 }\r
1908 _PyString_Resize(&buf, buflen);\r
1909 return buf;\r
1910#endif /* __BEOS__ */\r
1911}\r
1912\r
1913PyDoc_STRVAR(getsockopt_doc,\r
1914"getsockopt(level, option[, buffersize]) -> value\n\\r
1915\n\\r
1916Get a socket option. See the Unix manual for level and option.\n\\r
1917If a nonzero buffersize argument is given, the return value is a\n\\r
1918string of that length; otherwise it is an integer.");\r
1919\r
1920\r
1921/* s.bind(sockaddr) method */\r
1922\r
1923static PyObject *\r
1924sock_bind(PySocketSockObject *s, PyObject *addro)\r
1925{\r
1926 sock_addr_t addrbuf;\r
1927 int addrlen;\r
1928 int res;\r
1929\r
1930 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
1931 return NULL;\r
1932 Py_BEGIN_ALLOW_THREADS\r
1933 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);\r
1934 Py_END_ALLOW_THREADS\r
1935 if (res < 0)\r
1936 return s->errorhandler();\r
1937 Py_INCREF(Py_None);\r
1938 return Py_None;\r
1939}\r
1940\r
1941PyDoc_STRVAR(bind_doc,\r
1942"bind(address)\n\\r
1943\n\\r
1944Bind the socket to a local address. For IP sockets, the address is a\n\\r
1945pair (host, port); the host must refer to the local host. For raw packet\n\\r
1946sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");\r
1947\r
1948\r
1949/* s.close() method.\r
1950 Set the file descriptor to -1 so operations tried subsequently\r
1951 will surely fail. */\r
1952\r
1953static PyObject *\r
1954sock_close(PySocketSockObject *s)\r
1955{\r
1956 SOCKET_T fd;\r
1957\r
1958 if ((fd = s->sock_fd) != -1) {\r
1959 s->sock_fd = -1;\r
1960 Py_BEGIN_ALLOW_THREADS\r
1961 (void) SOCKETCLOSE(fd);\r
1962 Py_END_ALLOW_THREADS\r
1963 }\r
1964 Py_INCREF(Py_None);\r
1965 return Py_None;\r
1966}\r
1967\r
1968PyDoc_STRVAR(close_doc,\r
1969"close()\n\\r
1970\n\\r
1971Close the socket. It cannot be used after this call.");\r
1972\r
1973static int\r
1974internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,\r
1975 int *timeoutp)\r
1976{\r
1977 int res, timeout;\r
1978\r
1979 timeout = 0;\r
1980 res = connect(s->sock_fd, addr, addrlen);\r
1981\r
1982#ifdef MS_WINDOWS\r
1983\r
1984 if (s->sock_timeout > 0.0) {\r
1985 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&\r
1986 IS_SELECTABLE(s)) {\r
1987 /* This is a mess. Best solution: trust select */\r
1988 fd_set fds;\r
1989 fd_set fds_exc;\r
1990 struct timeval tv;\r
1991 tv.tv_sec = (int)s->sock_timeout;\r
1992 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);\r
1993 FD_ZERO(&fds);\r
1994 FD_SET(s->sock_fd, &fds);\r
1995 FD_ZERO(&fds_exc);\r
1996 FD_SET(s->sock_fd, &fds_exc);\r
1997 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);\r
1998 if (res == 0) {\r
1999 res = WSAEWOULDBLOCK;\r
2000 timeout = 1;\r
2001 } else if (res > 0) {\r
2002 if (FD_ISSET(s->sock_fd, &fds))\r
2003 /* The socket is in the writeable set - this\r
2004 means connected */\r
2005 res = 0;\r
2006 else {\r
2007 /* As per MS docs, we need to call getsockopt()\r
2008 to get the underlying error */\r
2009 int res_size = sizeof res;\r
2010 /* It must be in the exception set */\r
2011 assert(FD_ISSET(s->sock_fd, &fds_exc));\r
2012 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,\r
2013 (char *)&res, &res_size))\r
2014 /* getsockopt also clears WSAGetLastError,\r
2015 so reset it back. */\r
2016 WSASetLastError(res);\r
2017 else\r
2018 res = WSAGetLastError();\r
2019 }\r
2020 }\r
2021 /* else if (res < 0) an error occurred */\r
2022 }\r
2023 }\r
2024\r
2025 if (res < 0)\r
2026 res = WSAGetLastError();\r
2027\r
2028#else\r
2029\r
2030 if (s->sock_timeout > 0.0) {\r
2031 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {\r
2032 timeout = internal_select(s, 1);\r
2033 if (timeout == 0) {\r
2034 /* Bug #1019808: in case of an EINPROGRESS,\r
2035 use getsockopt(SO_ERROR) to get the real\r
2036 error. */\r
2037 socklen_t res_size = sizeof res;\r
2038 (void)getsockopt(s->sock_fd, SOL_SOCKET,\r
2039 SO_ERROR, &res, &res_size);\r
2040 if (res == EISCONN)\r
2041 res = 0;\r
2042 errno = res;\r
2043 }\r
2044 else if (timeout == -1) {\r
2045 res = errno; /* had error */\r
2046 }\r
2047 else\r
2048 res = EWOULDBLOCK; /* timed out */\r
2049 }\r
2050 }\r
2051\r
2052 if (res < 0)\r
2053 res = errno;\r
2054\r
2055#endif\r
2056 *timeoutp = timeout;\r
2057\r
2058 return res;\r
2059}\r
2060\r
2061/* s.connect(sockaddr) method */\r
2062\r
2063static PyObject *\r
2064sock_connect(PySocketSockObject *s, PyObject *addro)\r
2065{\r
2066 sock_addr_t addrbuf;\r
2067 int addrlen;\r
2068 int res;\r
2069 int timeout;\r
2070\r
2071 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
2072 return NULL;\r
2073\r
2074 Py_BEGIN_ALLOW_THREADS\r
2075 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);\r
2076 Py_END_ALLOW_THREADS\r
2077\r
2078 if (timeout == 1) {\r
2079 PyErr_SetString(socket_timeout, "timed out");\r
2080 return NULL;\r
2081 }\r
2082 if (res != 0)\r
2083 return s->errorhandler();\r
2084 Py_INCREF(Py_None);\r
2085 return Py_None;\r
2086}\r
2087\r
2088PyDoc_STRVAR(connect_doc,\r
2089"connect(address)\n\\r
2090\n\\r
2091Connect the socket to a remote address. For IP sockets, the address\n\\r
2092is a pair (host, port).");\r
2093\r
2094\r
2095/* s.connect_ex(sockaddr) method */\r
2096\r
2097static PyObject *\r
2098sock_connect_ex(PySocketSockObject *s, PyObject *addro)\r
2099{\r
2100 sock_addr_t addrbuf;\r
2101 int addrlen;\r
2102 int res;\r
2103 int timeout;\r
2104\r
2105 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
2106 return NULL;\r
2107\r
2108 Py_BEGIN_ALLOW_THREADS\r
2109 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);\r
2110 Py_END_ALLOW_THREADS\r
2111\r
2112 /* Signals are not errors (though they may raise exceptions). Adapted\r
2113 from PyErr_SetFromErrnoWithFilenameObject(). */\r
2114#ifdef EINTR\r
2115 if (res == EINTR && PyErr_CheckSignals())\r
2116 return NULL;\r
2117#endif\r
2118\r
2119 return PyInt_FromLong((long) res);\r
2120}\r
2121\r
2122PyDoc_STRVAR(connect_ex_doc,\r
2123"connect_ex(address) -> errno\n\\r
2124\n\\r
2125This is like connect(address), but returns an error code (the errno value)\n\\r
2126instead of raising an exception when an error occurs.");\r
2127\r
2128\r
2129/* s.fileno() method */\r
2130\r
2131static PyObject *\r
2132sock_fileno(PySocketSockObject *s)\r
2133{\r
2134#if SIZEOF_SOCKET_T <= SIZEOF_LONG\r
2135 return PyInt_FromLong((long) s->sock_fd);\r
2136#else\r
2137 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);\r
2138#endif\r
2139}\r
2140\r
2141PyDoc_STRVAR(fileno_doc,\r
2142"fileno() -> integer\n\\r
2143\n\\r
2144Return the integer file descriptor of the socket.");\r
2145\r
2146\r
2147#ifndef NO_DUP\r
2148/* s.dup() method */\r
2149\r
2150static PyObject *\r
2151sock_dup(PySocketSockObject *s)\r
2152{\r
2153 SOCKET_T newfd;\r
2154 PyObject *sock;\r
2155\r
2156 newfd = dup(s->sock_fd);\r
2157 if (newfd < 0)\r
2158 return s->errorhandler();\r
2159 sock = (PyObject *) new_sockobject(newfd,\r
2160 s->sock_family,\r
2161 s->sock_type,\r
2162 s->sock_proto);\r
2163 if (sock == NULL)\r
2164 SOCKETCLOSE(newfd);\r
2165 return sock;\r
2166}\r
2167\r
2168PyDoc_STRVAR(dup_doc,\r
2169"dup() -> socket object\n\\r
2170\n\\r
2171Return a new socket object connected to the same system resource.");\r
2172\r
2173#endif\r
2174\r
2175\r
2176/* s.getsockname() method */\r
2177\r
2178static PyObject *\r
2179sock_getsockname(PySocketSockObject *s)\r
2180{\r
2181 sock_addr_t addrbuf;\r
2182 int res;\r
2183 socklen_t addrlen;\r
2184\r
2185 if (!getsockaddrlen(s, &addrlen))\r
2186 return NULL;\r
2187 memset(&addrbuf, 0, addrlen);\r
2188 Py_BEGIN_ALLOW_THREADS\r
2189 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
2190 Py_END_ALLOW_THREADS\r
2191 if (res < 0)\r
2192 return s->errorhandler();\r
2193 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,\r
2194 s->sock_proto);\r
2195}\r
2196\r
2197PyDoc_STRVAR(getsockname_doc,\r
2198"getsockname() -> address info\n\\r
2199\n\\r
2200Return the address of the local endpoint. For IP sockets, the address\n\\r
2201info is a pair (hostaddr, port).");\r
2202\r
2203\r
2204#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */\r
2205/* s.getpeername() method */\r
2206\r
2207static PyObject *\r
2208sock_getpeername(PySocketSockObject *s)\r
2209{\r
2210 sock_addr_t addrbuf;\r
2211 int res;\r
2212 socklen_t addrlen;\r
2213\r
2214 if (!getsockaddrlen(s, &addrlen))\r
2215 return NULL;\r
2216 memset(&addrbuf, 0, addrlen);\r
2217 Py_BEGIN_ALLOW_THREADS\r
2218 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
2219 Py_END_ALLOW_THREADS\r
2220 if (res < 0)\r
2221 return s->errorhandler();\r
2222 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,\r
2223 s->sock_proto);\r
2224}\r
2225\r
2226PyDoc_STRVAR(getpeername_doc,\r
2227"getpeername() -> address info\n\\r
2228\n\\r
2229Return the address of the remote endpoint. For IP sockets, the address\n\\r
2230info is a pair (hostaddr, port).");\r
2231\r
2232#endif /* HAVE_GETPEERNAME */\r
2233\r
2234\r
2235/* s.listen(n) method */\r
2236\r
2237static PyObject *\r
2238sock_listen(PySocketSockObject *s, PyObject *arg)\r
2239{\r
2240 int backlog;\r
2241 int res;\r
2242\r
2243 backlog = PyInt_AsLong(arg);\r
2244 if (backlog == -1 && PyErr_Occurred())\r
2245 return NULL;\r
2246 Py_BEGIN_ALLOW_THREADS\r
2247 /* To avoid problems on systems that don't allow a negative backlog\r
2248 * (which doesn't make sense anyway) we force a minimum value of 0. */\r
2249 if (backlog < 0)\r
2250 backlog = 0;\r
2251 res = listen(s->sock_fd, backlog);\r
2252 Py_END_ALLOW_THREADS\r
2253 if (res < 0)\r
2254 return s->errorhandler();\r
2255 Py_INCREF(Py_None);\r
2256 return Py_None;\r
2257}\r
2258\r
2259PyDoc_STRVAR(listen_doc,\r
2260"listen(backlog)\n\\r
2261\n\\r
2262Enable a server to accept connections. The backlog argument must be at\n\\r
2263least 0 (if it is lower, it is set to 0); it specifies the number of\n\\r
2264unaccepted connections that the system will allow before refusing new\n\\r
2265connections.");\r
2266\r
2267\r
2268#ifndef NO_DUP\r
2269/* s.makefile(mode) method.\r
2270 Create a new open file object referring to a dupped version of\r
2271 the socket's file descriptor. (The dup() call is necessary so\r
2272 that the open file and socket objects may be closed independent\r
2273 of each other.)\r
2274 The mode argument specifies 'r' or 'w' passed to fdopen(). */\r
2275\r
2276static PyObject *\r
2277sock_makefile(PySocketSockObject *s, PyObject *args)\r
2278{\r
2279 extern int fclose(FILE *);\r
2280 char *mode = "r";\r
2281 int bufsize = -1;\r
2282#ifdef MS_WIN32\r
2283 Py_intptr_t fd;\r
2284#else\r
2285 int fd;\r
2286#endif\r
2287 FILE *fp;\r
2288 PyObject *f;\r
2289#ifdef __VMS\r
2290 char *mode_r = "r";\r
2291 char *mode_w = "w";\r
2292#endif\r
2293\r
2294 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))\r
2295 return NULL;\r
2296#ifdef __VMS\r
2297 if (strcmp(mode,"rb") == 0) {\r
2298 mode = mode_r;\r
2299 }\r
2300 else {\r
2301 if (strcmp(mode,"wb") == 0) {\r
2302 mode = mode_w;\r
2303 }\r
2304 }\r
2305#endif\r
2306#ifdef MS_WIN32\r
2307 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||\r
2308 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))\r
2309#else\r
2310 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)\r
2311#endif\r
2312 {\r
2313 if (fd >= 0)\r
2314 SOCKETCLOSE(fd);\r
2315 return s->errorhandler();\r
2316 }\r
2317 f = PyFile_FromFile(fp, "<socket>", mode, fclose);\r
2318 if (f != NULL)\r
2319 PyFile_SetBufSize(f, bufsize);\r
2320 return f;\r
2321}\r
2322\r
2323PyDoc_STRVAR(makefile_doc,\r
2324"makefile([mode[, buffersize]]) -> file object\n\\r
2325\n\\r
2326Return a regular file object corresponding to the socket.\n\\r
2327The mode and buffersize arguments are as for the built-in open() function.");\r
2328\r
2329#endif /* NO_DUP */\r
2330\r
2331/*\r
2332 * This is the guts of the recv() and recv_into() methods, which reads into a\r
2333 * char buffer. If you have any inc/dec ref to do to the objects that contain\r
2334 * the buffer, do it in the caller. This function returns the number of bytes\r
2335 * successfully read. If there was an error, it returns -1. Note that it is\r
2336 * also possible that we return a number of bytes smaller than the request\r
2337 * bytes.\r
2338 */\r
2339static ssize_t\r
2340sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)\r
2341{\r
2342 ssize_t outlen = -1;\r
2343 int timeout;\r
2344#ifdef __VMS\r
2345 int remaining;\r
2346 char *read_buf;\r
2347#endif\r
2348\r
2349 if (!IS_SELECTABLE(s)) {\r
2350 select_error();\r
2351 return -1;\r
2352 }\r
2353\r
2354#ifndef __VMS\r
2355 Py_BEGIN_ALLOW_THREADS\r
2356 timeout = internal_select(s, 0);\r
2357 if (!timeout)\r
2358 outlen = recv(s->sock_fd, cbuf, len, flags);\r
2359 Py_END_ALLOW_THREADS\r
2360\r
2361 if (timeout == 1) {\r
2362 PyErr_SetString(socket_timeout, "timed out");\r
2363 return -1;\r
2364 }\r
2365 if (outlen < 0) {\r
2366 /* Note: the call to errorhandler() ALWAYS indirectly returned\r
2367 NULL, so ignore its return value */\r
2368 s->errorhandler();\r
2369 return -1;\r
2370 }\r
2371#else\r
2372 read_buf = cbuf;\r
2373 remaining = len;\r
2374 while (remaining != 0) {\r
2375 unsigned int segment;\r
2376 int nread = -1;\r
2377\r
2378 segment = remaining /SEGMENT_SIZE;\r
2379 if (segment != 0) {\r
2380 segment = SEGMENT_SIZE;\r
2381 }\r
2382 else {\r
2383 segment = remaining;\r
2384 }\r
2385\r
2386 Py_BEGIN_ALLOW_THREADS\r
2387 timeout = internal_select(s, 0);\r
2388 if (!timeout)\r
2389 nread = recv(s->sock_fd, read_buf, segment, flags);\r
2390 Py_END_ALLOW_THREADS\r
2391\r
2392 if (timeout == 1) {\r
2393 PyErr_SetString(socket_timeout, "timed out");\r
2394 return -1;\r
2395 }\r
2396 if (nread < 0) {\r
2397 s->errorhandler();\r
2398 return -1;\r
2399 }\r
2400 if (nread != remaining) {\r
2401 read_buf += nread;\r
2402 break;\r
2403 }\r
2404\r
2405 remaining -= segment;\r
2406 read_buf += segment;\r
2407 }\r
2408 outlen = read_buf - cbuf;\r
2409#endif /* !__VMS */\r
2410\r
2411 return outlen;\r
2412}\r
2413\r
2414\r
2415/* s.recv(nbytes [,flags]) method */\r
2416\r
2417static PyObject *\r
2418sock_recv(PySocketSockObject *s, PyObject *args)\r
2419{\r
2420 int recvlen, flags = 0;\r
2421 ssize_t outlen;\r
2422 PyObject *buf;\r
2423\r
2424 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))\r
2425 return NULL;\r
2426\r
2427 if (recvlen < 0) {\r
2428 PyErr_SetString(PyExc_ValueError,\r
2429 "negative buffersize in recv");\r
2430 return NULL;\r
2431 }\r
2432\r
2433 /* Allocate a new string. */\r
2434 buf = PyString_FromStringAndSize((char *) 0, recvlen);\r
2435 if (buf == NULL)\r
2436 return NULL;\r
2437\r
2438 /* Call the guts */\r
2439 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);\r
2440 if (outlen < 0) {\r
2441 /* An error occurred, release the string and return an\r
2442 error. */\r
2443 Py_DECREF(buf);\r
2444 return NULL;\r
2445 }\r
2446 if (outlen != recvlen) {\r
2447 /* We did not read as many bytes as we anticipated, resize the\r
2448 string if possible and be successful. */\r
2449 if (_PyString_Resize(&buf, outlen) < 0)\r
2450 /* Oopsy, not so successful after all. */\r
2451 return NULL;\r
2452 }\r
2453\r
2454 return buf;\r
2455}\r
2456\r
2457PyDoc_STRVAR(recv_doc,\r
2458"recv(buffersize[, flags]) -> data\n\\r
2459\n\\r
2460Receive up to buffersize bytes from the socket. For the optional flags\n\\r
2461argument, see the Unix manual. When no data is available, block until\n\\r
2462at least one byte is available or until the remote end is closed. When\n\\r
2463the remote end is closed and all data is read, return the empty string.");\r
2464\r
2465\r
2466/* s.recv_into(buffer, [nbytes [,flags]]) method */\r
2467\r
2468static PyObject*\r
2469sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)\r
2470{\r
2471 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};\r
2472\r
2473 int recvlen = 0, flags = 0;\r
2474 ssize_t readlen;\r
2475 Py_buffer buf;\r
2476 Py_ssize_t buflen;\r
2477\r
2478 /* Get the buffer's memory */\r
2479 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,\r
2480 &buf, &recvlen, &flags))\r
2481 return NULL;\r
2482 buflen = buf.len;\r
2483 assert(buf.buf != 0 && buflen > 0);\r
2484\r
2485 if (recvlen < 0) {\r
2486 PyErr_SetString(PyExc_ValueError,\r
2487 "negative buffersize in recv_into");\r
2488 goto error;\r
2489 }\r
2490 if (recvlen == 0) {\r
2491 /* If nbytes was not specified, use the buffer's length */\r
2492 recvlen = buflen;\r
2493 }\r
2494\r
2495 /* Check if the buffer is large enough */\r
2496 if (buflen < recvlen) {\r
2497 PyErr_SetString(PyExc_ValueError,\r
2498 "buffer too small for requested bytes");\r
2499 goto error;\r
2500 }\r
2501\r
2502 /* Call the guts */\r
2503 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);\r
2504 if (readlen < 0) {\r
2505 /* Return an error. */\r
2506 goto error;\r
2507 }\r
2508\r
2509 PyBuffer_Release(&buf);\r
2510 /* Return the number of bytes read. Note that we do not do anything\r
2511 special here in the case that readlen < recvlen. */\r
2512 return PyInt_FromSsize_t(readlen);\r
2513\r
2514error:\r
2515 PyBuffer_Release(&buf);\r
2516 return NULL;\r
2517}\r
2518\r
2519PyDoc_STRVAR(recv_into_doc,\r
2520"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\\r
2521\n\\r
2522A version of recv() that stores its data into a buffer rather than creating \n\\r
2523a new string. Receive up to buffersize bytes from the socket. If buffersize \n\\r
2524is not specified (or 0), receive up to the size available in the given buffer.\n\\r
2525\n\\r
2526See recv() for documentation about the flags.");\r
2527\r
2528\r
2529/*\r
2530 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads\r
2531 * into a char buffer. If you have any inc/def ref to do to the objects that\r
2532 * contain the buffer, do it in the caller. This function returns the number\r
2533 * of bytes successfully read. If there was an error, it returns -1. Note\r
2534 * that it is also possible that we return a number of bytes smaller than the\r
2535 * request bytes.\r
2536 *\r
2537 * 'addr' is a return value for the address object. Note that you must decref\r
2538 * it yourself.\r
2539 */\r
2540static ssize_t\r
2541sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,\r
2542 PyObject** addr)\r
2543{\r
2544 sock_addr_t addrbuf;\r
2545 int timeout;\r
2546 ssize_t n = -1;\r
2547 socklen_t addrlen;\r
2548\r
2549 *addr = NULL;\r
2550\r
2551 if (!getsockaddrlen(s, &addrlen))\r
2552 return -1;\r
2553\r
2554 if (!IS_SELECTABLE(s)) {\r
2555 select_error();\r
2556 return -1;\r
2557 }\r
2558\r
2559 Py_BEGIN_ALLOW_THREADS\r
2560 memset(&addrbuf, 0, addrlen);\r
2561 timeout = internal_select(s, 0);\r
2562 if (!timeout) {\r
2563#ifndef MS_WINDOWS\r
2564#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
2565 n = recvfrom(s->sock_fd, cbuf, len, flags,\r
2566 SAS2SA(&addrbuf), &addrlen);\r
2567#else\r
2568 n = recvfrom(s->sock_fd, cbuf, len, flags,\r
2569 (void *) &addrbuf, &addrlen);\r
2570#endif\r
2571#else\r
2572 n = recvfrom(s->sock_fd, cbuf, len, flags,\r
2573 SAS2SA(&addrbuf), &addrlen);\r
2574#endif\r
2575 }\r
2576 Py_END_ALLOW_THREADS\r
2577\r
2578 if (timeout == 1) {\r
2579 PyErr_SetString(socket_timeout, "timed out");\r
2580 return -1;\r
2581 }\r
2582 if (n < 0) {\r
2583 s->errorhandler();\r
2584 return -1;\r
2585 }\r
2586\r
2587 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),\r
2588 addrlen, s->sock_proto)))\r
2589 return -1;\r
2590\r
2591 return n;\r
2592}\r
2593\r
2594/* s.recvfrom(nbytes [,flags]) method */\r
2595\r
2596static PyObject *\r
2597sock_recvfrom(PySocketSockObject *s, PyObject *args)\r
2598{\r
2599 PyObject *buf = NULL;\r
2600 PyObject *addr = NULL;\r
2601 PyObject *ret = NULL;\r
2602 int recvlen, flags = 0;\r
2603 ssize_t outlen;\r
2604\r
2605 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))\r
2606 return NULL;\r
2607\r
2608 if (recvlen < 0) {\r
2609 PyErr_SetString(PyExc_ValueError,\r
2610 "negative buffersize in recvfrom");\r
2611 return NULL;\r
2612 }\r
2613\r
2614 buf = PyString_FromStringAndSize((char *) 0, recvlen);\r
2615 if (buf == NULL)\r
2616 return NULL;\r
2617\r
2618 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),\r
2619 recvlen, flags, &addr);\r
2620 if (outlen < 0) {\r
2621 goto finally;\r
2622 }\r
2623\r
2624 if (outlen != recvlen) {\r
2625 /* We did not read as many bytes as we anticipated, resize the\r
2626 string if possible and be successful. */\r
2627 if (_PyString_Resize(&buf, outlen) < 0)\r
2628 /* Oopsy, not so successful after all. */\r
2629 goto finally;\r
2630 }\r
2631\r
2632 ret = PyTuple_Pack(2, buf, addr);\r
2633\r
2634finally:\r
2635 Py_XDECREF(buf);\r
2636 Py_XDECREF(addr);\r
2637 return ret;\r
2638}\r
2639\r
2640PyDoc_STRVAR(recvfrom_doc,\r
2641"recvfrom(buffersize[, flags]) -> (data, address info)\n\\r
2642\n\\r
2643Like recv(buffersize, flags) but also return the sender's address info.");\r
2644\r
2645\r
2646/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */\r
2647\r
2648static PyObject *\r
2649sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)\r
2650{\r
2651 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};\r
2652\r
2653 int recvlen = 0, flags = 0;\r
2654 ssize_t readlen;\r
2655 Py_buffer buf;\r
2656 int buflen;\r
2657\r
2658 PyObject *addr = NULL;\r
2659\r
2660 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",\r
2661 kwlist, &buf,\r
2662 &recvlen, &flags))\r
2663 return NULL;\r
2664 buflen = buf.len;\r
2665 assert(buf.buf != 0 && buflen > 0);\r
2666\r
2667 if (recvlen < 0) {\r
2668 PyErr_SetString(PyExc_ValueError,\r
2669 "negative buffersize in recvfrom_into");\r
2670 goto error;\r
2671 }\r
2672 if (recvlen == 0) {\r
2673 /* If nbytes was not specified, use the buffer's length */\r
2674 recvlen = buflen;\r
2675 }\r
2676\r
2677 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);\r
2678 if (readlen < 0) {\r
2679 /* Return an error */\r
2680 goto error;\r
2681 }\r
2682\r
2683 PyBuffer_Release(&buf);\r
2684 /* Return the number of bytes read and the address. Note that we do\r
2685 not do anything special here in the case that readlen < recvlen. */\r
2686 return Py_BuildValue("lN", readlen, addr);\r
2687\r
2688error:\r
2689 Py_XDECREF(addr);\r
2690 PyBuffer_Release(&buf);\r
2691 return NULL;\r
2692}\r
2693\r
2694PyDoc_STRVAR(recvfrom_into_doc,\r
2695"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\\r
2696\n\\r
2697Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");\r
2698\r
2699\r
2700/* s.send(data [,flags]) method */\r
2701\r
2702static PyObject *\r
2703sock_send(PySocketSockObject *s, PyObject *args)\r
2704{\r
2705 char *buf;\r
2706 int len, n = -1, flags = 0, timeout;\r
2707 Py_buffer pbuf;\r
2708\r
2709 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))\r
2710 return NULL;\r
2711\r
2712 if (!IS_SELECTABLE(s)) {\r
2713 PyBuffer_Release(&pbuf);\r
2714 return select_error();\r
2715 }\r
2716 buf = pbuf.buf;\r
2717 len = pbuf.len;\r
2718\r
2719 Py_BEGIN_ALLOW_THREADS\r
2720 timeout = internal_select(s, 1);\r
2721 if (!timeout)\r
2722#ifdef __VMS\r
2723 n = sendsegmented(s->sock_fd, buf, len, flags);\r
2724#else\r
2725 n = send(s->sock_fd, buf, len, flags);\r
2726#endif\r
2727 Py_END_ALLOW_THREADS\r
2728\r
2729 PyBuffer_Release(&pbuf);\r
2730\r
2731 if (timeout == 1) {\r
2732 PyErr_SetString(socket_timeout, "timed out");\r
2733 return NULL;\r
2734 }\r
2735 if (n < 0)\r
2736 return s->errorhandler();\r
2737 return PyInt_FromLong((long)n);\r
2738}\r
2739\r
2740PyDoc_STRVAR(send_doc,\r
2741"send(data[, flags]) -> count\n\\r
2742\n\\r
2743Send a data string to the socket. For the optional flags\n\\r
2744argument, see the Unix manual. Return the number of bytes\n\\r
2745sent; this may be less than len(data) if the network is busy.");\r
2746\r
2747\r
2748/* s.sendall(data [,flags]) method */\r
2749\r
2750static PyObject *\r
2751sock_sendall(PySocketSockObject *s, PyObject *args)\r
2752{\r
2753 char *buf;\r
2754 int len, n = -1, flags = 0, timeout, saved_errno;\r
2755 Py_buffer pbuf;\r
2756\r
2757 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))\r
2758 return NULL;\r
2759 buf = pbuf.buf;\r
2760 len = pbuf.len;\r
2761\r
2762 if (!IS_SELECTABLE(s)) {\r
2763 PyBuffer_Release(&pbuf);\r
2764 return select_error();\r
2765 }\r
2766\r
2767 do {\r
2768 Py_BEGIN_ALLOW_THREADS\r
2769 timeout = internal_select(s, 1);\r
2770 n = -1;\r
2771 if (!timeout) {\r
2772#ifdef __VMS\r
2773 n = sendsegmented(s->sock_fd, buf, len, flags);\r
2774#else\r
2775 n = send(s->sock_fd, buf, len, flags);\r
2776#endif\r
2777 }\r
2778 Py_END_ALLOW_THREADS\r
2779 if (timeout == 1) {\r
2780 PyBuffer_Release(&pbuf);\r
2781 PyErr_SetString(socket_timeout, "timed out");\r
2782 return NULL;\r
2783 }\r
2784 /* PyErr_CheckSignals() might change errno */\r
2785 saved_errno = errno;\r
2786 /* We must run our signal handlers before looping again.\r
2787 send() can return a successful partial write when it is\r
2788 interrupted, so we can't restrict ourselves to EINTR. */\r
2789 if (PyErr_CheckSignals()) {\r
2790 PyBuffer_Release(&pbuf);\r
2791 return NULL;\r
2792 }\r
2793 if (n < 0) {\r
2794 /* If interrupted, try again */\r
2795 if (saved_errno == EINTR)\r
2796 continue;\r
2797 else\r
2798 break;\r
2799 }\r
2800 buf += n;\r
2801 len -= n;\r
2802 } while (len > 0);\r
2803 PyBuffer_Release(&pbuf);\r
2804\r
2805 if (n < 0)\r
2806 return s->errorhandler();\r
2807\r
2808 Py_INCREF(Py_None);\r
2809 return Py_None;\r
2810}\r
2811\r
2812PyDoc_STRVAR(sendall_doc,\r
2813"sendall(data[, flags])\n\\r
2814\n\\r
2815Send a data string to the socket. For the optional flags\n\\r
2816argument, see the Unix manual. This calls send() repeatedly\n\\r
2817until all data is sent. If an error occurs, it's impossible\n\\r
2818to tell how much data has been sent.");\r
2819\r
2820\r
2821/* s.sendto(data, [flags,] sockaddr) method */\r
2822\r
2823static PyObject *\r
2824sock_sendto(PySocketSockObject *s, PyObject *args)\r
2825{\r
2826 Py_buffer pbuf;\r
c9f4d483 2827 PyObject *addro;\r
4710c53d 2828 char *buf;\r
2829 Py_ssize_t len;\r
2830 sock_addr_t addrbuf;\r
2831 int addrlen, n = -1, flags, timeout;\r
2832 int arglen;\r
2833\r
2834 flags = 0;\r
2835 arglen = PyTuple_Size(args);\r
2836 switch(arglen) {\r
2837 case 2:\r
2838 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);\r
2839 break;\r
2840 case 3:\r
2841 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);\r
2842 break;\r
2843 default:\r
2844 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"\r
2845 " arguments (%d given)", arglen);\r
2846 }\r
2847 if (PyErr_Occurred())\r
2848 return NULL;\r
2849\r
2850 buf = pbuf.buf;\r
2851 len = pbuf.len;\r
2852\r
2853 if (!IS_SELECTABLE(s)) {\r
2854 PyBuffer_Release(&pbuf);\r
2855 return select_error();\r
2856 }\r
2857\r
2858 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {\r
2859 PyBuffer_Release(&pbuf);\r
2860 return NULL;\r
2861 }\r
2862\r
2863 Py_BEGIN_ALLOW_THREADS\r
2864 timeout = internal_select(s, 1);\r
2865 if (!timeout)\r
2866 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);\r
2867 Py_END_ALLOW_THREADS\r
2868\r
2869 PyBuffer_Release(&pbuf);\r
2870 if (timeout == 1) {\r
2871 PyErr_SetString(socket_timeout, "timed out");\r
2872 return NULL;\r
2873 }\r
2874 if (n < 0)\r
2875 return s->errorhandler();\r
2876 return PyInt_FromLong((long)n);\r
2877}\r
2878\r
2879PyDoc_STRVAR(sendto_doc,\r
2880"sendto(data[, flags], address) -> count\n\\r
2881\n\\r
2882Like send(data, flags) but allows specifying the destination address.\n\\r
2883For IP sockets, the address is a pair (hostaddr, port).");\r
2884\r
2885\r
2886/* s.shutdown(how) method */\r
2887\r
2888static PyObject *\r
2889sock_shutdown(PySocketSockObject *s, PyObject *arg)\r
2890{\r
2891 int how;\r
2892 int res;\r
2893\r
2894 how = PyInt_AsLong(arg);\r
2895 if (how == -1 && PyErr_Occurred())\r
2896 return NULL;\r
2897 Py_BEGIN_ALLOW_THREADS\r
2898 res = shutdown(s->sock_fd, how);\r
2899 Py_END_ALLOW_THREADS\r
2900 if (res < 0)\r
2901 return s->errorhandler();\r
2902 Py_INCREF(Py_None);\r
2903 return Py_None;\r
2904}\r
2905\r
2906PyDoc_STRVAR(shutdown_doc,\r
2907"shutdown(flag)\n\\r
2908\n\\r
2909Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\\r
2910of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");\r
2911\r
2912#if defined(MS_WINDOWS) && defined(SIO_RCVALL)\r
2913static PyObject*\r
2914sock_ioctl(PySocketSockObject *s, PyObject *arg)\r
2915{\r
2916 unsigned long cmd = SIO_RCVALL;\r
2917 PyObject *argO;\r
2918 DWORD recv;\r
2919\r
2920 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))\r
2921 return NULL;\r
2922\r
2923 switch (cmd) {\r
2924 case SIO_RCVALL: {\r
2925 unsigned int option = RCVALL_ON;\r
2926 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))\r
2927 return NULL;\r
2928 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),\r
2929 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {\r
2930 return set_error();\r
2931 }\r
2932 return PyLong_FromUnsignedLong(recv); }\r
2933 case SIO_KEEPALIVE_VALS: {\r
2934 struct tcp_keepalive ka;\r
2935 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,\r
2936 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))\r
2937 return NULL;\r
2938 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),\r
2939 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {\r
2940 return set_error();\r
2941 }\r
2942 return PyLong_FromUnsignedLong(recv); }\r
2943 default:\r
2944 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);\r
2945 return NULL;\r
2946 }\r
2947}\r
2948PyDoc_STRVAR(sock_ioctl_doc,\r
2949"ioctl(cmd, option) -> long\n\\r
2950\n\\r
2951Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\\r
2952SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\\r
2953SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");\r
2954\r
2955#endif\r
2956\r
2957/* List of methods for socket objects */\r
2958\r
2959static PyMethodDef sock_methods[] = {\r
2960 {"accept", (PyCFunction)sock_accept, METH_NOARGS,\r
2961 accept_doc},\r
2962 {"bind", (PyCFunction)sock_bind, METH_O,\r
2963 bind_doc},\r
2964 {"close", (PyCFunction)sock_close, METH_NOARGS,\r
2965 close_doc},\r
2966 {"connect", (PyCFunction)sock_connect, METH_O,\r
2967 connect_doc},\r
2968 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,\r
2969 connect_ex_doc},\r
2970#ifndef NO_DUP\r
2971 {"dup", (PyCFunction)sock_dup, METH_NOARGS,\r
2972 dup_doc},\r
2973#endif\r
2974 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,\r
2975 fileno_doc},\r
2976#ifdef HAVE_GETPEERNAME\r
2977 {"getpeername", (PyCFunction)sock_getpeername,\r
2978 METH_NOARGS, getpeername_doc},\r
2979#endif\r
2980 {"getsockname", (PyCFunction)sock_getsockname,\r
2981 METH_NOARGS, getsockname_doc},\r
2982 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,\r
2983 getsockopt_doc},\r
2984#if defined(MS_WINDOWS) && defined(SIO_RCVALL)\r
2985 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,\r
2986 sock_ioctl_doc},\r
2987#endif\r
2988 {"listen", (PyCFunction)sock_listen, METH_O,\r
2989 listen_doc},\r
2990#ifndef NO_DUP\r
2991 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,\r
2992 makefile_doc},\r
2993#endif\r
2994 {"recv", (PyCFunction)sock_recv, METH_VARARGS,\r
2995 recv_doc},\r
2996 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,\r
2997 recv_into_doc},\r
2998 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,\r
2999 recvfrom_doc},\r
3000 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,\r
3001 recvfrom_into_doc},\r
3002 {"send", (PyCFunction)sock_send, METH_VARARGS,\r
3003 send_doc},\r
3004 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,\r
3005 sendall_doc},\r
3006 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,\r
3007 sendto_doc},\r
3008 {"setblocking", (PyCFunction)sock_setblocking, METH_O,\r
3009 setblocking_doc},\r
3010 {"settimeout", (PyCFunction)sock_settimeout, METH_O,\r
3011 settimeout_doc},\r
3012 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,\r
3013 gettimeout_doc},\r
3014 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,\r
3015 setsockopt_doc},\r
3016 {"shutdown", (PyCFunction)sock_shutdown, METH_O,\r
3017 shutdown_doc},\r
3018#ifdef RISCOS\r
3019 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,\r
3020 sleeptaskw_doc},\r
3021#endif\r
3022 {NULL, NULL} /* sentinel */\r
3023};\r
3024\r
3025/* SockObject members */\r
3026static PyMemberDef sock_memberlist[] = {\r
3027 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},\r
3028 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},\r
3029 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},\r
3030 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},\r
3031 {0},\r
3032};\r
3033\r
3034/* Deallocate a socket object in response to the last Py_DECREF().\r
3035 First close the file description. */\r
3036\r
3037static void\r
3038sock_dealloc(PySocketSockObject *s)\r
3039{\r
3040 if (s->sock_fd != -1)\r
3041 (void) SOCKETCLOSE(s->sock_fd);\r
3042 Py_TYPE(s)->tp_free((PyObject *)s);\r
3043}\r
3044\r
3045\r
3046static PyObject *\r
3047sock_repr(PySocketSockObject *s)\r
3048{\r
3049 char buf[512];\r
3050#if SIZEOF_SOCKET_T > SIZEOF_LONG\r
3051 if (s->sock_fd > LONG_MAX) {\r
3052 /* this can occur on Win64, and actually there is a special\r
3053 ugly printf formatter for decimal pointer length integer\r
3054 printing, only bother if necessary*/\r
3055 PyErr_SetString(PyExc_OverflowError,\r
3056 "no printf formatter to display "\r
3057 "the socket descriptor in decimal");\r
3058 return NULL;\r
3059 }\r
3060#endif\r
3061 PyOS_snprintf(\r
3062 buf, sizeof(buf),\r
3063 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",\r
3064 (long)s->sock_fd, s->sock_family,\r
3065 s->sock_type,\r
3066 s->sock_proto);\r
3067 return PyString_FromString(buf);\r
3068}\r
3069\r
3070\r
3071/* Create a new, uninitialized socket object. */\r
3072\r
3073static PyObject *\r
3074sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
3075{\r
3076 PyObject *new;\r
3077\r
3078 new = type->tp_alloc(type, 0);\r
3079 if (new != NULL) {\r
3080 ((PySocketSockObject *)new)->sock_fd = -1;\r
3081 ((PySocketSockObject *)new)->sock_timeout = -1.0;\r
3082 ((PySocketSockObject *)new)->errorhandler = &set_error;\r
3083 }\r
3084 return new;\r
3085}\r
3086\r
3087\r
3088/* Initialize a new socket object. */\r
3089\r
3090/*ARGSUSED*/\r
3091static int\r
3092sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)\r
3093{\r
3094 PySocketSockObject *s = (PySocketSockObject *)self;\r
3095 SOCKET_T fd;\r
3096 int family = AF_INET, type = SOCK_STREAM, proto = 0;\r
3097 static char *keywords[] = {"family", "type", "proto", 0};\r
3098\r
3099 if (!PyArg_ParseTupleAndKeywords(args, kwds,\r
3100 "|iii:socket", keywords,\r
3101 &family, &type, &proto))\r
3102 return -1;\r
3103\r
3104 Py_BEGIN_ALLOW_THREADS\r
3105 fd = socket(family, type, proto);\r
3106 Py_END_ALLOW_THREADS\r
3107\r
3108#ifdef MS_WINDOWS\r
3109 if (fd == INVALID_SOCKET)\r
3110#else\r
3111 if (fd < 0)\r
3112#endif\r
3113 {\r
3114 set_error();\r
3115 return -1;\r
3116 }\r
3117 init_sockobject(s, fd, family, type, proto);\r
3118\r
3119 return 0;\r
3120\r
3121}\r
3122\r
3123\r
3124/* Type object for socket objects. */\r
3125\r
3126static PyTypeObject sock_type = {\r
3127 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */\r
3128 "_socket.socket", /* tp_name */\r
3129 sizeof(PySocketSockObject), /* tp_basicsize */\r
3130 0, /* tp_itemsize */\r
3131 (destructor)sock_dealloc, /* tp_dealloc */\r
3132 0, /* tp_print */\r
3133 0, /* tp_getattr */\r
3134 0, /* tp_setattr */\r
3135 0, /* tp_compare */\r
3136 (reprfunc)sock_repr, /* tp_repr */\r
3137 0, /* tp_as_number */\r
3138 0, /* tp_as_sequence */\r
3139 0, /* tp_as_mapping */\r
3140 0, /* tp_hash */\r
3141 0, /* tp_call */\r
3142 0, /* tp_str */\r
3143 PyObject_GenericGetAttr, /* tp_getattro */\r
3144 0, /* tp_setattro */\r
3145 0, /* tp_as_buffer */\r
3146 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */\r
3147 sock_doc, /* tp_doc */\r
3148 0, /* tp_traverse */\r
3149 0, /* tp_clear */\r
3150 0, /* tp_richcompare */\r
3151 0, /* tp_weaklistoffset */\r
3152 0, /* tp_iter */\r
3153 0, /* tp_iternext */\r
3154 sock_methods, /* tp_methods */\r
3155 sock_memberlist, /* tp_members */\r
3156 0, /* tp_getset */\r
3157 0, /* tp_base */\r
3158 0, /* tp_dict */\r
3159 0, /* tp_descr_get */\r
3160 0, /* tp_descr_set */\r
3161 0, /* tp_dictoffset */\r
3162 sock_initobj, /* tp_init */\r
3163 PyType_GenericAlloc, /* tp_alloc */\r
3164 sock_new, /* tp_new */\r
3165 PyObject_Del, /* tp_free */\r
3166};\r
3167\r
3168\r
3169/* Python interface to gethostname(). */\r
3170\r
3171/*ARGSUSED*/\r
3172static PyObject *\r
3173socket_gethostname(PyObject *self, PyObject *unused)\r
3174{\r
3175 char buf[1024];\r
3176 int res;\r
3177 Py_BEGIN_ALLOW_THREADS\r
3178 res = gethostname(buf, (int) sizeof buf - 1);\r
3179 Py_END_ALLOW_THREADS\r
3180 if (res < 0)\r
3181 return set_error();\r
3182 buf[sizeof buf - 1] = '\0';\r
3183 return PyString_FromString(buf);\r
3184}\r
3185\r
3186PyDoc_STRVAR(gethostname_doc,\r
3187"gethostname() -> string\n\\r
3188\n\\r
3189Return the current host name.");\r
3190\r
3191\r
3192/* Python interface to gethostbyname(name). */\r
3193\r
3194/*ARGSUSED*/\r
3195static PyObject *\r
3196socket_gethostbyname(PyObject *self, PyObject *args)\r
3197{\r
3198 char *name;\r
3199 sock_addr_t addrbuf;\r
3200\r
3201 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))\r
3202 return NULL;\r
3203 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)\r
3204 return NULL;\r
3205 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));\r
3206}\r
3207\r
3208PyDoc_STRVAR(gethostbyname_doc,\r
3209"gethostbyname(host) -> address\n\\r
3210\n\\r
3211Return the IP address (a string of the form '255.255.255.255') for a host.");\r
3212\r
3213\r
3214/* Convenience function common to gethostbyname_ex and gethostbyaddr */\r
3215\r
3216static PyObject *\r
3217gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)\r
3218{\r
3219 char **pch;\r
3220 PyObject *rtn_tuple = (PyObject *)NULL;\r
3221 PyObject *name_list = (PyObject *)NULL;\r
3222 PyObject *addr_list = (PyObject *)NULL;\r
3223 PyObject *tmp;\r
3224\r
3225 if (h == NULL) {\r
3226 /* Let's get real error message to return */\r
3227#ifndef RISCOS\r
3228 set_herror(h_errno);\r
3229#else\r
3230 PyErr_SetString(socket_error, "host not found");\r
3231#endif\r
3232 return NULL;\r
3233 }\r
3234\r
3235 if (h->h_addrtype != af) {\r
3236 /* Let's get real error message to return */\r
3237 PyErr_SetString(socket_error,\r
3238 (char *)strerror(EAFNOSUPPORT));\r
3239\r
3240 return NULL;\r
3241 }\r
3242\r
3243 switch (af) {\r
3244\r
3245 case AF_INET:\r
3246 if (alen < sizeof(struct sockaddr_in))\r
3247 return NULL;\r
3248 break;\r
3249\r
3250#ifdef ENABLE_IPV6\r
3251 case AF_INET6:\r
3252 if (alen < sizeof(struct sockaddr_in6))\r
3253 return NULL;\r
3254 break;\r
3255#endif\r
3256\r
3257 }\r
3258\r
3259 if ((name_list = PyList_New(0)) == NULL)\r
3260 goto err;\r
3261\r
3262 if ((addr_list = PyList_New(0)) == NULL)\r
3263 goto err;\r
3264\r
3265 /* SF #1511317: h_aliases can be NULL */\r
3266 if (h->h_aliases) {\r
3267 for (pch = h->h_aliases; *pch != NULL; pch++) {\r
3268 int status;\r
3269 tmp = PyString_FromString(*pch);\r
3270 if (tmp == NULL)\r
3271 goto err;\r
3272\r
3273 status = PyList_Append(name_list, tmp);\r
3274 Py_DECREF(tmp);\r
3275\r
3276 if (status)\r
3277 goto err;\r
3278 }\r
3279 }\r
3280\r
3281 for (pch = h->h_addr_list; *pch != NULL; pch++) {\r
3282 int status;\r
3283\r
3284 switch (af) {\r
3285\r
3286 case AF_INET:\r
3287 {\r
3288 struct sockaddr_in sin;\r
3289 memset(&sin, 0, sizeof(sin));\r
3290 sin.sin_family = af;\r
3291#ifdef HAVE_SOCKADDR_SA_LEN\r
3292 sin.sin_len = sizeof(sin);\r
3293#endif\r
3294 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));\r
3295 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));\r
3296\r
3297 if (pch == h->h_addr_list && alen >= sizeof(sin))\r
3298 memcpy((char *) addr, &sin, sizeof(sin));\r
3299 break;\r
3300 }\r
3301\r
3302#ifdef ENABLE_IPV6\r
3303 case AF_INET6:\r
3304 {\r
3305 struct sockaddr_in6 sin6;\r
3306 memset(&sin6, 0, sizeof(sin6));\r
3307 sin6.sin6_family = af;\r
3308#ifdef HAVE_SOCKADDR_SA_LEN\r
3309 sin6.sin6_len = sizeof(sin6);\r
3310#endif\r
3311 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));\r
3312 tmp = makeipaddr((struct sockaddr *)&sin6,\r
3313 sizeof(sin6));\r
3314\r
3315 if (pch == h->h_addr_list && alen >= sizeof(sin6))\r
3316 memcpy((char *) addr, &sin6, sizeof(sin6));\r
3317 break;\r
3318 }\r
3319#endif\r
3320\r
3321 default: /* can't happen */\r
3322 PyErr_SetString(socket_error,\r
3323 "unsupported address family");\r
3324 return NULL;\r
3325 }\r
3326\r
3327 if (tmp == NULL)\r
3328 goto err;\r
3329\r
3330 status = PyList_Append(addr_list, tmp);\r
3331 Py_DECREF(tmp);\r
3332\r
3333 if (status)\r
3334 goto err;\r
3335 }\r
3336\r
3337 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);\r
3338\r
3339 err:\r
3340 Py_XDECREF(name_list);\r
3341 Py_XDECREF(addr_list);\r
3342 return rtn_tuple;\r
3343}\r
3344\r
3345\r
3346/* Python interface to gethostbyname_ex(name). */\r
3347\r
3348/*ARGSUSED*/\r
3349static PyObject *\r
3350socket_gethostbyname_ex(PyObject *self, PyObject *args)\r
3351{\r
3352 char *name;\r
3353 struct hostent *h;\r
3354#ifdef ENABLE_IPV6\r
3355 struct sockaddr_storage addr;\r
3356#else\r
3357 struct sockaddr_in addr;\r
3358#endif\r
3359 struct sockaddr *sa;\r
3360 PyObject *ret;\r
3361#ifdef HAVE_GETHOSTBYNAME_R\r
3362 struct hostent hp_allocated;\r
3363#ifdef HAVE_GETHOSTBYNAME_R_3_ARG\r
3364 struct hostent_data data;\r
3365#else\r
3366 char buf[16384];\r
3367 int buf_len = (sizeof buf) - 1;\r
3368 int errnop;\r
3369#endif\r
3370#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
3371 int result;\r
3372#endif\r
3373#endif /* HAVE_GETHOSTBYNAME_R */\r
3374\r
3375 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))\r
3376 return NULL;\r
3377 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)\r
3378 return NULL;\r
3379 Py_BEGIN_ALLOW_THREADS\r
3380#ifdef HAVE_GETHOSTBYNAME_R\r
3381#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
3382 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,\r
3383 &h, &errnop);\r
3384#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)\r
3385 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);\r
3386#else /* HAVE_GETHOSTBYNAME_R_3_ARG */\r
3387 memset((void *) &data, '\0', sizeof(data));\r
3388 result = gethostbyname_r(name, &hp_allocated, &data);\r
3389 h = (result != 0) ? NULL : &hp_allocated;\r
3390#endif\r
3391#else /* not HAVE_GETHOSTBYNAME_R */\r
3392#ifdef USE_GETHOSTBYNAME_LOCK\r
3393 PyThread_acquire_lock(netdb_lock, 1);\r
3394#endif\r
3395 h = gethostbyname(name);\r
3396#endif /* HAVE_GETHOSTBYNAME_R */\r
3397 Py_END_ALLOW_THREADS\r
3398 /* Some C libraries would require addr.__ss_family instead of\r
3399 addr.ss_family.\r
3400 Therefore, we cast the sockaddr_storage into sockaddr to\r
3401 access sa_family. */\r
3402 sa = (struct sockaddr*)&addr;\r
3403 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),\r
3404 sa->sa_family);\r
3405#ifdef USE_GETHOSTBYNAME_LOCK\r
3406 PyThread_release_lock(netdb_lock);\r
3407#endif\r
3408 return ret;\r
3409}\r
3410\r
3411PyDoc_STRVAR(ghbn_ex_doc,\r
3412"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\\r
3413\n\\r
3414Return the true host name, a list of aliases, and a list of IP addresses,\n\\r
3415for a host. The host argument is a string giving a host name or IP number.");\r
3416\r
3417\r
3418/* Python interface to gethostbyaddr(IP). */\r
3419\r
3420/*ARGSUSED*/\r
3421static PyObject *\r
3422socket_gethostbyaddr(PyObject *self, PyObject *args)\r
3423{\r
3424#ifdef ENABLE_IPV6\r
3425 struct sockaddr_storage addr;\r
3426#else\r
3427 struct sockaddr_in addr;\r
3428#endif\r
3429 struct sockaddr *sa = (struct sockaddr *)&addr;\r
3430 char *ip_num;\r
3431 struct hostent *h;\r
3432 PyObject *ret;\r
3433#ifdef HAVE_GETHOSTBYNAME_R\r
3434 struct hostent hp_allocated;\r
3435#ifdef HAVE_GETHOSTBYNAME_R_3_ARG\r
3436 struct hostent_data data;\r
3437#else\r
3438 /* glibcs up to 2.10 assume that the buf argument to\r
3439 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc\r
3440 does not ensure. The attribute below instructs the compiler\r
3441 to maintain this alignment. */\r
3442 char buf[16384] Py_ALIGNED(8);\r
3443 int buf_len = (sizeof buf) - 1;\r
3444 int errnop;\r
3445#endif\r
3446#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
3447 int result;\r
3448#endif\r
3449#endif /* HAVE_GETHOSTBYNAME_R */\r
3450 char *ap;\r
3451 int al;\r
3452 int af;\r
3453\r
3454 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))\r
3455 return NULL;\r
3456 af = AF_UNSPEC;\r
3457 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)\r
3458 return NULL;\r
3459 af = sa->sa_family;\r
3460 ap = NULL;\r
3461 switch (af) {\r
3462 case AF_INET:\r
3463 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;\r
3464 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);\r
3465 break;\r
3466#ifdef ENABLE_IPV6\r
3467 case AF_INET6:\r
3468 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;\r
3469 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);\r
3470 break;\r
3471#endif\r
3472 default:\r
3473 PyErr_SetString(socket_error, "unsupported address family");\r
3474 return NULL;\r
3475 }\r
3476 Py_BEGIN_ALLOW_THREADS\r
3477#ifdef HAVE_GETHOSTBYNAME_R\r
3478#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
3479 result = gethostbyaddr_r(ap, al, af,\r
3480 &hp_allocated, buf, buf_len,\r
3481 &h, &errnop);\r
3482#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)\r
3483 h = gethostbyaddr_r(ap, al, af,\r
3484 &hp_allocated, buf, buf_len, &errnop);\r
3485#else /* HAVE_GETHOSTBYNAME_R_3_ARG */\r
3486 memset((void *) &data, '\0', sizeof(data));\r
3487 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);\r
3488 h = (result != 0) ? NULL : &hp_allocated;\r
3489#endif\r
3490#else /* not HAVE_GETHOSTBYNAME_R */\r
3491#ifdef USE_GETHOSTBYNAME_LOCK\r
3492 PyThread_acquire_lock(netdb_lock, 1);\r
3493#endif\r
3494 h = gethostbyaddr(ap, al, af);\r
3495#endif /* HAVE_GETHOSTBYNAME_R */\r
3496 Py_END_ALLOW_THREADS\r
3497 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);\r
3498#ifdef USE_GETHOSTBYNAME_LOCK\r
3499 PyThread_release_lock(netdb_lock);\r
3500#endif\r
3501 return ret;\r
3502}\r
3503\r
3504PyDoc_STRVAR(gethostbyaddr_doc,\r
3505"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\\r
3506\n\\r
3507Return the true host name, a list of aliases, and a list of IP addresses,\n\\r
3508for a host. The host argument is a string giving a host name or IP number.");\r
3509\r
3510\r
3511/* Python interface to getservbyname(name).\r
3512 This only returns the port number, since the other info is already\r
3513 known or not useful (like the list of aliases). */\r
3514\r
3515/*ARGSUSED*/\r
3516static PyObject *\r
3517socket_getservbyname(PyObject *self, PyObject *args)\r
3518{\r
3519 char *name, *proto=NULL;\r
3520 struct servent *sp;\r
3521 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))\r
3522 return NULL;\r
3523 Py_BEGIN_ALLOW_THREADS\r
3524 sp = getservbyname(name, proto);\r
3525 Py_END_ALLOW_THREADS\r
3526 if (sp == NULL) {\r
3527 PyErr_SetString(socket_error, "service/proto not found");\r
3528 return NULL;\r
3529 }\r
3530 return PyInt_FromLong((long) ntohs(sp->s_port));\r
3531}\r
3532\r
3533PyDoc_STRVAR(getservbyname_doc,\r
3534"getservbyname(servicename[, protocolname]) -> integer\n\\r
3535\n\\r
3536Return a port number from a service name and protocol name.\n\\r
3537The optional protocol name, if given, should be 'tcp' or 'udp',\n\\r
3538otherwise any protocol will match.");\r
3539\r
3540\r
3541/* Python interface to getservbyport(port).\r
3542 This only returns the service name, since the other info is already\r
3543 known or not useful (like the list of aliases). */\r
3544\r
3545/*ARGSUSED*/\r
3546static PyObject *\r
3547socket_getservbyport(PyObject *self, PyObject *args)\r
3548{\r
3549 int port;\r
3550 char *proto=NULL;\r
3551 struct servent *sp;\r
3552 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))\r
3553 return NULL;\r
3554 if (port < 0 || port > 0xffff) {\r
3555 PyErr_SetString(\r
3556 PyExc_OverflowError,\r
3557 "getservbyport: port must be 0-65535.");\r
3558 return NULL;\r
3559 }\r
3560 Py_BEGIN_ALLOW_THREADS\r
3561 sp = getservbyport(htons((short)port), proto);\r
3562 Py_END_ALLOW_THREADS\r
3563 if (sp == NULL) {\r
3564 PyErr_SetString(socket_error, "port/proto not found");\r
3565 return NULL;\r
3566 }\r
3567 return PyString_FromString(sp->s_name);\r
3568}\r
3569\r
3570PyDoc_STRVAR(getservbyport_doc,\r
3571"getservbyport(port[, protocolname]) -> string\n\\r
3572\n\\r
3573Return the service name from a port number and protocol name.\n\\r
3574The optional protocol name, if given, should be 'tcp' or 'udp',\n\\r
3575otherwise any protocol will match.");\r
3576\r
3577/* Python interface to getprotobyname(name).\r
3578 This only returns the protocol number, since the other info is\r
3579 already known or not useful (like the list of aliases). */\r
3580\r
3581/*ARGSUSED*/\r
3582static PyObject *\r
3583socket_getprotobyname(PyObject *self, PyObject *args)\r
3584{\r
3585 char *name;\r
3586 struct protoent *sp;\r
3587#ifdef __BEOS__\r
3588/* Not available in BeOS yet. - [cjh] */\r
3589 PyErr_SetString(socket_error, "getprotobyname not supported");\r
3590 return NULL;\r
3591#else\r
3592 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))\r
3593 return NULL;\r
3594 Py_BEGIN_ALLOW_THREADS\r
3595 sp = getprotobyname(name);\r
3596 Py_END_ALLOW_THREADS\r
3597 if (sp == NULL) {\r
3598 PyErr_SetString(socket_error, "protocol not found");\r
3599 return NULL;\r
3600 }\r
3601 return PyInt_FromLong((long) sp->p_proto);\r
3602#endif\r
3603}\r
3604\r
3605PyDoc_STRVAR(getprotobyname_doc,\r
3606"getprotobyname(name) -> integer\n\\r
3607\n\\r
3608Return the protocol number for the named protocol. (Rarely used.)");\r
3609\r
3610\r
3611#ifdef HAVE_SOCKETPAIR\r
3612/* Create a pair of sockets using the socketpair() function.\r
3613 Arguments as for socket() except the default family is AF_UNIX if\r
3614 defined on the platform; otherwise, the default is AF_INET. */\r
3615\r
3616/*ARGSUSED*/\r
3617static PyObject *\r
3618socket_socketpair(PyObject *self, PyObject *args)\r
3619{\r
3620 PySocketSockObject *s0 = NULL, *s1 = NULL;\r
3621 SOCKET_T sv[2];\r
3622 int family, type = SOCK_STREAM, proto = 0;\r
3623 PyObject *res = NULL;\r
3624\r
3625#if defined(AF_UNIX)\r
3626 family = AF_UNIX;\r
3627#else\r
3628 family = AF_INET;\r
3629#endif\r
3630 if (!PyArg_ParseTuple(args, "|iii:socketpair",\r
3631 &family, &type, &proto))\r
3632 return NULL;\r
3633 /* Create a pair of socket fds */\r
3634 if (socketpair(family, type, proto, sv) < 0)\r
3635 return set_error();\r
3636 s0 = new_sockobject(sv[0], family, type, proto);\r
3637 if (s0 == NULL)\r
3638 goto finally;\r
3639 s1 = new_sockobject(sv[1], family, type, proto);\r
3640 if (s1 == NULL)\r
3641 goto finally;\r
3642 res = PyTuple_Pack(2, s0, s1);\r
3643\r
3644finally:\r
3645 if (res == NULL) {\r
3646 if (s0 == NULL)\r
3647 SOCKETCLOSE(sv[0]);\r
3648 if (s1 == NULL)\r
3649 SOCKETCLOSE(sv[1]);\r
3650 }\r
3651 Py_XDECREF(s0);\r
3652 Py_XDECREF(s1);\r
3653 return res;\r
3654}\r
3655\r
3656PyDoc_STRVAR(socketpair_doc,\r
3657"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\\r
3658\n\\r
3659Create a pair of socket objects from the sockets returned by the platform\n\\r
3660socketpair() function.\n\\r
3661The arguments are the same as for socket() except the default family is\n\\r
3662AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");\r
3663\r
3664#endif /* HAVE_SOCKETPAIR */\r
3665\r
3666\r
3667#ifndef NO_DUP\r
3668/* Create a socket object from a numeric file description.\r
3669 Useful e.g. if stdin is a socket.\r
3670 Additional arguments as for socket(). */\r
3671\r
3672/*ARGSUSED*/\r
3673static PyObject *\r
3674socket_fromfd(PyObject *self, PyObject *args)\r
3675{\r
3676 PySocketSockObject *s;\r
3677 SOCKET_T fd;\r
3678 int family, type, proto = 0;\r
3679 if (!PyArg_ParseTuple(args, "iii|i:fromfd",\r
3680 &fd, &family, &type, &proto))\r
3681 return NULL;\r
3682 /* Dup the fd so it and the socket can be closed independently */\r
3683 fd = dup(fd);\r
3684 if (fd < 0)\r
3685 return set_error();\r
3686 s = new_sockobject(fd, family, type, proto);\r
3687 return (PyObject *) s;\r
3688}\r
3689\r
3690PyDoc_STRVAR(fromfd_doc,\r
3691"fromfd(fd, family, type[, proto]) -> socket object\n\\r
3692\n\\r
3693Create a socket object from a duplicate of the given\n\\r
3694file descriptor.\n\\r
3695The remaining arguments are the same as for socket().");\r
3696\r
3697#endif /* NO_DUP */\r
3698\r
3699\r
3700static PyObject *\r
3701socket_ntohs(PyObject *self, PyObject *args)\r
3702{\r
3703 int x1, x2;\r
3704\r
3705 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {\r
3706 return NULL;\r
3707 }\r
3708 if (x1 < 0) {\r
3709 PyErr_SetString(PyExc_OverflowError,\r
3710 "can't convert negative number to unsigned long");\r
3711 return NULL;\r
3712 }\r
3713 x2 = (unsigned int)ntohs((unsigned short)x1);\r
3714 return PyInt_FromLong(x2);\r
3715}\r
3716\r
3717PyDoc_STRVAR(ntohs_doc,\r
3718"ntohs(integer) -> integer\n\\r
3719\n\\r
3720Convert a 16-bit integer from network to host byte order.");\r
3721\r
3722\r
3723static PyObject *\r
3724socket_ntohl(PyObject *self, PyObject *arg)\r
3725{\r
3726 unsigned long x;\r
3727\r
3728 if (PyInt_Check(arg)) {\r
3729 x = PyInt_AS_LONG(arg);\r
3730 if (x == (unsigned long) -1 && PyErr_Occurred())\r
3731 return NULL;\r
3732 if ((long)x < 0) {\r
3733 PyErr_SetString(PyExc_OverflowError,\r
3734 "can't convert negative number to unsigned long");\r
3735 return NULL;\r
3736 }\r
3737 }\r
3738 else if (PyLong_Check(arg)) {\r
3739 x = PyLong_AsUnsignedLong(arg);\r
3740 if (x == (unsigned long) -1 && PyErr_Occurred())\r
3741 return NULL;\r
3742#if SIZEOF_LONG > 4\r
3743 {\r
3744 unsigned long y;\r
3745 /* only want the trailing 32 bits */\r
3746 y = x & 0xFFFFFFFFUL;\r
3747 if (y ^ x)\r
3748 return PyErr_Format(PyExc_OverflowError,\r
3749 "long int larger than 32 bits");\r
3750 x = y;\r
3751 }\r
3752#endif\r
3753 }\r
3754 else\r
3755 return PyErr_Format(PyExc_TypeError,\r
3756 "expected int/long, %s found",\r
3757 Py_TYPE(arg)->tp_name);\r
3758 if (x == (unsigned long) -1 && PyErr_Occurred())\r
3759 return NULL;\r
3760 return PyLong_FromUnsignedLong(ntohl(x));\r
3761}\r
3762\r
3763PyDoc_STRVAR(ntohl_doc,\r
3764"ntohl(integer) -> integer\n\\r
3765\n\\r
3766Convert a 32-bit integer from network to host byte order.");\r
3767\r
3768\r
3769static PyObject *\r
3770socket_htons(PyObject *self, PyObject *args)\r
3771{\r
3772 int x1, x2;\r
3773\r
3774 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {\r
3775 return NULL;\r
3776 }\r
3777 if (x1 < 0) {\r
3778 PyErr_SetString(PyExc_OverflowError,\r
3779 "can't convert negative number to unsigned long");\r
3780 return NULL;\r
3781 }\r
3782 x2 = (unsigned int)htons((unsigned short)x1);\r
3783 return PyInt_FromLong(x2);\r
3784}\r
3785\r
3786PyDoc_STRVAR(htons_doc,\r
3787"htons(integer) -> integer\n\\r
3788\n\\r
3789Convert a 16-bit integer from host to network byte order.");\r
3790\r
3791\r
3792static PyObject *\r
3793socket_htonl(PyObject *self, PyObject *arg)\r
3794{\r
3795 unsigned long x;\r
3796\r
3797 if (PyInt_Check(arg)) {\r
3798 x = PyInt_AS_LONG(arg);\r
3799 if (x == (unsigned long) -1 && PyErr_Occurred())\r
3800 return NULL;\r
3801 if ((long)x < 0) {\r
3802 PyErr_SetString(PyExc_OverflowError,\r
3803 "can't convert negative number to unsigned long");\r
3804 return NULL;\r
3805 }\r
3806 }\r
3807 else if (PyLong_Check(arg)) {\r
3808 x = PyLong_AsUnsignedLong(arg);\r
3809 if (x == (unsigned long) -1 && PyErr_Occurred())\r
3810 return NULL;\r
3811#if SIZEOF_LONG > 4\r
3812 {\r
3813 unsigned long y;\r
3814 /* only want the trailing 32 bits */\r
3815 y = x & 0xFFFFFFFFUL;\r
3816 if (y ^ x)\r
3817 return PyErr_Format(PyExc_OverflowError,\r
3818 "long int larger than 32 bits");\r
3819 x = y;\r
3820 }\r
3821#endif\r
3822 }\r
3823 else\r
3824 return PyErr_Format(PyExc_TypeError,\r
3825 "expected int/long, %s found",\r
3826 Py_TYPE(arg)->tp_name);\r
3827 return PyLong_FromUnsignedLong(htonl((unsigned long)x));\r
3828}\r
3829\r
3830PyDoc_STRVAR(htonl_doc,\r
3831"htonl(integer) -> integer\n\\r
3832\n\\r
3833Convert a 32-bit integer from host to network byte order.");\r
3834\r
3835/* socket.inet_aton() and socket.inet_ntoa() functions. */\r
3836\r
3837PyDoc_STRVAR(inet_aton_doc,\r
3838"inet_aton(string) -> packed 32-bit IP representation\n\\r
3839\n\\r
3840Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\\r
3841binary format used in low-level network functions.");\r
3842\r
3843static PyObject*\r
3844socket_inet_aton(PyObject *self, PyObject *args)\r
3845{\r
3846#ifndef INADDR_NONE\r
3847#define INADDR_NONE (-1)\r
3848#endif\r
3849#ifdef HAVE_INET_ATON\r
3850 struct in_addr buf;\r
3851#endif\r
3852\r
3853#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)\r
3854#if (SIZEOF_INT != 4)\r
3855#error "Not sure if in_addr_t exists and int is not 32-bits."\r
3856#endif\r
3857 /* Have to use inet_addr() instead */\r
3858 unsigned int packed_addr;\r
3859#endif\r
3860 char *ip_addr;\r
3861\r
3862 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))\r
3863 return NULL;\r
3864\r
3865\r
3866#ifdef HAVE_INET_ATON\r
3867\r
3868#ifdef USE_INET_ATON_WEAKLINK\r
3869 if (inet_aton != NULL) {\r
3870#endif\r
3871 if (inet_aton(ip_addr, &buf))\r
3872 return PyString_FromStringAndSize((char *)(&buf),\r
3873 sizeof(buf));\r
3874\r
3875 PyErr_SetString(socket_error,\r
3876 "illegal IP address string passed to inet_aton");\r
3877 return NULL;\r
3878\r
3879#ifdef USE_INET_ATON_WEAKLINK\r
3880 } else {\r
3881#endif\r
3882\r
3883#endif\r
3884\r
3885#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)\r
3886\r
3887 /* special-case this address as inet_addr might return INADDR_NONE\r
3888 * for this */\r
3889 if (strcmp(ip_addr, "255.255.255.255") == 0) {\r
3890 packed_addr = 0xFFFFFFFF;\r
3891 } else {\r
3892\r
3893 packed_addr = inet_addr(ip_addr);\r
3894\r
3895 if (packed_addr == INADDR_NONE) { /* invalid address */\r
3896 PyErr_SetString(socket_error,\r
3897 "illegal IP address string passed to inet_aton");\r
3898 return NULL;\r
3899 }\r
3900 }\r
3901 return PyString_FromStringAndSize((char *) &packed_addr,\r
3902 sizeof(packed_addr));\r
3903\r
3904#ifdef USE_INET_ATON_WEAKLINK\r
3905 }\r
3906#endif\r
3907\r
3908#endif\r
3909}\r
3910\r
3911PyDoc_STRVAR(inet_ntoa_doc,\r
3912"inet_ntoa(packed_ip) -> ip_address_string\n\\r
3913\n\\r
3914Convert an IP address from 32-bit packed binary format to string format");\r
3915\r
3916static PyObject*\r
3917socket_inet_ntoa(PyObject *self, PyObject *args)\r
3918{\r
3919 char *packed_str;\r
3920 int addr_len;\r
3921 struct in_addr packed_addr;\r
3922\r
3923 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {\r
3924 return NULL;\r
3925 }\r
3926\r
3927 if (addr_len != sizeof(packed_addr)) {\r
3928 PyErr_SetString(socket_error,\r
3929 "packed IP wrong length for inet_ntoa");\r
3930 return NULL;\r
3931 }\r
3932\r
3933 memcpy(&packed_addr, packed_str, addr_len);\r
3934\r
3935 return PyString_FromString(inet_ntoa(packed_addr));\r
3936}\r
3937\r
3938#ifdef HAVE_INET_PTON\r
3939\r
3940PyDoc_STRVAR(inet_pton_doc,\r
3941"inet_pton(af, ip) -> packed IP address string\n\\r
3942\n\\r
3943Convert an IP address from string format to a packed string suitable\n\\r
3944for use with low-level network functions.");\r
3945\r
3946static PyObject *\r
3947socket_inet_pton(PyObject *self, PyObject *args)\r
3948{\r
3949 int af;\r
3950 char* ip;\r
3951 int retval;\r
3952#ifdef ENABLE_IPV6\r
3953 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];\r
3954#else\r
3955 char packed[sizeof(struct in_addr)];\r
3956#endif\r
3957 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {\r
3958 return NULL;\r
3959 }\r
3960\r
3961#if !defined(ENABLE_IPV6) && defined(AF_INET6)\r
3962 if(af == AF_INET6) {\r
3963 PyErr_SetString(socket_error,\r
3964 "can't use AF_INET6, IPv6 is disabled");\r
3965 return NULL;\r
3966 }\r
3967#endif\r
3968\r
3969 retval = inet_pton(af, ip, packed);\r
3970 if (retval < 0) {\r
3971 PyErr_SetFromErrno(socket_error);\r
3972 return NULL;\r
3973 } else if (retval == 0) {\r
3974 PyErr_SetString(socket_error,\r
3975 "illegal IP address string passed to inet_pton");\r
3976 return NULL;\r
3977 } else if (af == AF_INET) {\r
3978 return PyString_FromStringAndSize(packed,\r
3979 sizeof(struct in_addr));\r
3980#ifdef ENABLE_IPV6\r
3981 } else if (af == AF_INET6) {\r
3982 return PyString_FromStringAndSize(packed,\r
3983 sizeof(struct in6_addr));\r
3984#endif\r
3985 } else {\r
3986 PyErr_SetString(socket_error, "unknown address family");\r
3987 return NULL;\r
3988 }\r
3989}\r
3990\r
3991PyDoc_STRVAR(inet_ntop_doc,\r
3992"inet_ntop(af, packed_ip) -> string formatted IP address\n\\r
3993\n\\r
3994Convert a packed IP address of the given family to string format.");\r
3995\r
3996static PyObject *\r
3997socket_inet_ntop(PyObject *self, PyObject *args)\r
3998{\r
3999 int af;\r
4000 char* packed;\r
4001 int len;\r
4002 const char* retval;\r
4003#ifdef ENABLE_IPV6\r
4004 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];\r
4005#else\r
4006 char ip[INET_ADDRSTRLEN + 1];\r
4007#endif\r
4008\r
4009 /* Guarantee NUL-termination for PyString_FromString() below */\r
4010 memset((void *) &ip[0], '\0', sizeof(ip));\r
4011\r
4012 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {\r
4013 return NULL;\r
4014 }\r
4015\r
4016 if (af == AF_INET) {\r
4017 if (len != sizeof(struct in_addr)) {\r
4018 PyErr_SetString(PyExc_ValueError,\r
4019 "invalid length of packed IP address string");\r
4020 return NULL;\r
4021 }\r
4022#ifdef ENABLE_IPV6\r
4023 } else if (af == AF_INET6) {\r
4024 if (len != sizeof(struct in6_addr)) {\r
4025 PyErr_SetString(PyExc_ValueError,\r
4026 "invalid length of packed IP address string");\r
4027 return NULL;\r
4028 }\r
4029#endif\r
4030 } else {\r
4031 PyErr_Format(PyExc_ValueError,\r
4032 "unknown address family %d", af);\r
4033 return NULL;\r
4034 }\r
4035\r
4036 retval = inet_ntop(af, packed, ip, sizeof(ip));\r
4037 if (!retval) {\r
4038 PyErr_SetFromErrno(socket_error);\r
4039 return NULL;\r
4040 } else {\r
4041 return PyString_FromString(retval);\r
4042 }\r
4043\r
4044 /* NOTREACHED */\r
4045 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");\r
4046 return NULL;\r
4047}\r
4048\r
4049#endif /* HAVE_INET_PTON */\r
4050\r
4051/* Python interface to getaddrinfo(host, port). */\r
4052\r
4053/*ARGSUSED*/\r
4054static PyObject *\r
4055socket_getaddrinfo(PyObject *self, PyObject *args)\r
4056{\r
4057 struct addrinfo hints, *res;\r
4058 struct addrinfo *res0 = NULL;\r
4059 PyObject *hobj = NULL;\r
4060 PyObject *pobj = (PyObject *)NULL;\r
4061 char pbuf[30];\r
4062 char *hptr, *pptr;\r
4063 int family, socktype, protocol, flags;\r
4064 int error;\r
4065 PyObject *all = (PyObject *)NULL;\r
4066 PyObject *single = (PyObject *)NULL;\r
4067 PyObject *idna = NULL;\r
4068\r
4069 family = socktype = protocol = flags = 0;\r
4070 family = AF_UNSPEC;\r
4071 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",\r
4072 &hobj, &pobj, &family, &socktype,\r
4073 &protocol, &flags)) {\r
4074 return NULL;\r
4075 }\r
4076 if (hobj == Py_None) {\r
4077 hptr = NULL;\r
4078 } else if (PyUnicode_Check(hobj)) {\r
4079 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");\r
4080 if (!idna)\r
4081 return NULL;\r
4082 hptr = PyString_AsString(idna);\r
4083 } else if (PyString_Check(hobj)) {\r
4084 hptr = PyString_AsString(hobj);\r
4085 } else {\r
4086 PyErr_SetString(PyExc_TypeError,\r
4087 "getaddrinfo() argument 1 must be string or None");\r
4088 return NULL;\r
4089 }\r
4090 if (PyInt_Check(pobj)) {\r
4091 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));\r
4092 pptr = pbuf;\r
4093 } else if (PyString_Check(pobj)) {\r
4094 pptr = PyString_AsString(pobj);\r
4095 } else if (pobj == Py_None) {\r
4096 pptr = (char *)NULL;\r
4097 } else {\r
4098 PyErr_SetString(socket_error, "Int or String expected");\r
4099 goto err;\r
4100 }\r
4101 memset(&hints, 0, sizeof(hints));\r
4102 hints.ai_family = family;\r
4103 hints.ai_socktype = socktype;\r
4104 hints.ai_protocol = protocol;\r
4105 hints.ai_flags = flags;\r
4106 Py_BEGIN_ALLOW_THREADS\r
4107 ACQUIRE_GETADDRINFO_LOCK\r
4108 error = getaddrinfo(hptr, pptr, &hints, &res0);\r
4109 Py_END_ALLOW_THREADS\r
4110 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */\r
4111 if (error) {\r
4112 set_gaierror(error);\r
4113 goto err;\r
4114 }\r
4115\r
4116 if ((all = PyList_New(0)) == NULL)\r
4117 goto err;\r
4118 for (res = res0; res; res = res->ai_next) {\r
4119 PyObject *addr =\r
4120 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);\r
4121 if (addr == NULL)\r
4122 goto err;\r
4123 single = Py_BuildValue("iiisO", res->ai_family,\r
4124 res->ai_socktype, res->ai_protocol,\r
4125 res->ai_canonname ? res->ai_canonname : "",\r
4126 addr);\r
4127 Py_DECREF(addr);\r
4128 if (single == NULL)\r
4129 goto err;\r
4130\r
4131 if (PyList_Append(all, single))\r
4132 goto err;\r
4133 Py_XDECREF(single);\r
4134 }\r
4135 Py_XDECREF(idna);\r
4136 if (res0)\r
4137 freeaddrinfo(res0);\r
4138 return all;\r
4139 err:\r
4140 Py_XDECREF(single);\r
4141 Py_XDECREF(all);\r
4142 Py_XDECREF(idna);\r
4143 if (res0)\r
4144 freeaddrinfo(res0);\r
4145 return (PyObject *)NULL;\r
4146}\r
4147\r
4148PyDoc_STRVAR(getaddrinfo_doc,\r
4149"getaddrinfo(host, port [, family, socktype, proto, flags])\n\\r
4150 -> list of (family, socktype, proto, canonname, sockaddr)\n\\r
4151\n\\r
4152Resolve host and port into addrinfo struct.");\r
4153\r
4154/* Python interface to getnameinfo(sa, flags). */\r
4155\r
4156/*ARGSUSED*/\r
4157static PyObject *\r
4158socket_getnameinfo(PyObject *self, PyObject *args)\r
4159{\r
4160 PyObject *sa = (PyObject *)NULL;\r
4161 int flags;\r
4162 char *hostp;\r
4163 int port, flowinfo, scope_id;\r
4164 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];\r
4165 struct addrinfo hints, *res = NULL;\r
4166 int error;\r
4167 PyObject *ret = (PyObject *)NULL;\r
4168\r
4169 flags = flowinfo = scope_id = 0;\r
4170 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))\r
4171 return NULL;\r
4172 if (!PyTuple_Check(sa)) {\r
4173 PyErr_SetString(PyExc_TypeError,\r
4174 "getnameinfo() argument 1 must be a tuple");\r
4175 return NULL;\r
4176 }\r
4177 if (!PyArg_ParseTuple(sa, "si|ii",\r
4178 &hostp, &port, &flowinfo, &scope_id))\r
4179 return NULL;\r
4180 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);\r
4181 memset(&hints, 0, sizeof(hints));\r
4182 hints.ai_family = AF_UNSPEC;\r
4183 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */\r
4184 Py_BEGIN_ALLOW_THREADS\r
4185 ACQUIRE_GETADDRINFO_LOCK\r
4186 error = getaddrinfo(hostp, pbuf, &hints, &res);\r
4187 Py_END_ALLOW_THREADS\r
4188 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */\r
4189 if (error) {\r
4190 set_gaierror(error);\r
4191 goto fail;\r
4192 }\r
4193 if (res->ai_next) {\r
4194 PyErr_SetString(socket_error,\r
4195 "sockaddr resolved to multiple addresses");\r
4196 goto fail;\r
4197 }\r
4198 switch (res->ai_family) {\r
4199 case AF_INET:\r
4200 {\r
4201 if (PyTuple_GET_SIZE(sa) != 2) {\r
4202 PyErr_SetString(socket_error,\r
4203 "IPv4 sockaddr must be 2 tuple");\r
4204 goto fail;\r
4205 }\r
4206 break;\r
4207 }\r
4208#ifdef ENABLE_IPV6\r
4209 case AF_INET6:\r
4210 {\r
4211 struct sockaddr_in6 *sin6;\r
4212 sin6 = (struct sockaddr_in6 *)res->ai_addr;\r
4213 sin6->sin6_flowinfo = flowinfo;\r
4214 sin6->sin6_scope_id = scope_id;\r
4215 break;\r
4216 }\r
4217#endif\r
4218 }\r
4219 error = getnameinfo(res->ai_addr, res->ai_addrlen,\r
4220 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);\r
4221 if (error) {\r
4222 set_gaierror(error);\r
4223 goto fail;\r
4224 }\r
4225 ret = Py_BuildValue("ss", hbuf, pbuf);\r
4226\r
4227fail:\r
4228 if (res)\r
4229 freeaddrinfo(res);\r
4230 return ret;\r
4231}\r
4232\r
4233PyDoc_STRVAR(getnameinfo_doc,\r
4234"getnameinfo(sockaddr, flags) --> (host, port)\n\\r
4235\n\\r
4236Get host and port for a sockaddr.");\r
4237\r
4238\r
4239/* Python API to getting and setting the default timeout value. */\r
4240\r
4241static PyObject *\r
4242socket_getdefaulttimeout(PyObject *self)\r
4243{\r
4244 if (defaulttimeout < 0.0) {\r
4245 Py_INCREF(Py_None);\r
4246 return Py_None;\r
4247 }\r
4248 else\r
4249 return PyFloat_FromDouble(defaulttimeout);\r
4250}\r
4251\r
4252PyDoc_STRVAR(getdefaulttimeout_doc,\r
4253"getdefaulttimeout() -> timeout\n\\r
4254\n\\r
4255Returns the default timeout in floating seconds for new socket objects.\n\\r
4256A value of None indicates that new socket objects have no timeout.\n\\r
4257When the socket module is first imported, the default is None.");\r
4258\r
4259static PyObject *\r
4260socket_setdefaulttimeout(PyObject *self, PyObject *arg)\r
4261{\r
4262 double timeout;\r
4263\r
4264 if (arg == Py_None)\r
4265 timeout = -1.0;\r
4266 else {\r
4267 timeout = PyFloat_AsDouble(arg);\r
4268 if (timeout < 0.0) {\r
4269 if (!PyErr_Occurred())\r
4270 PyErr_SetString(PyExc_ValueError,\r
4271 "Timeout value out of range");\r
4272 return NULL;\r
4273 }\r
4274 }\r
4275\r
4276 defaulttimeout = timeout;\r
4277\r
4278 Py_INCREF(Py_None);\r
4279 return Py_None;\r
4280}\r
4281\r
4282PyDoc_STRVAR(setdefaulttimeout_doc,\r
4283"setdefaulttimeout(timeout)\n\\r
4284\n\\r
4285Set the default timeout in floating seconds for new socket objects.\n\\r
4286A value of None indicates that new socket objects have no timeout.\n\\r
4287When the socket module is first imported, the default is None.");\r
4288\r
4289\r
4290/* List of functions exported by this module. */\r
4291\r
4292static PyMethodDef socket_methods[] = {\r
4293 {"gethostbyname", socket_gethostbyname,\r
4294 METH_VARARGS, gethostbyname_doc},\r
4295 {"gethostbyname_ex", socket_gethostbyname_ex,\r
4296 METH_VARARGS, ghbn_ex_doc},\r
4297 {"gethostbyaddr", socket_gethostbyaddr,\r
4298 METH_VARARGS, gethostbyaddr_doc},\r
4299 {"gethostname", socket_gethostname,\r
4300 METH_NOARGS, gethostname_doc},\r
4301 {"getservbyname", socket_getservbyname,\r
4302 METH_VARARGS, getservbyname_doc},\r
4303 {"getservbyport", socket_getservbyport,\r
4304 METH_VARARGS, getservbyport_doc},\r
4305 {"getprotobyname", socket_getprotobyname,\r
4306 METH_VARARGS, getprotobyname_doc},\r
4307#ifndef NO_DUP\r
4308 {"fromfd", socket_fromfd,\r
4309 METH_VARARGS, fromfd_doc},\r
4310#endif\r
4311#ifdef HAVE_SOCKETPAIR\r
4312 {"socketpair", socket_socketpair,\r
4313 METH_VARARGS, socketpair_doc},\r
4314#endif\r
4315 {"ntohs", socket_ntohs,\r
4316 METH_VARARGS, ntohs_doc},\r
4317 {"ntohl", socket_ntohl,\r
4318 METH_O, ntohl_doc},\r
4319 {"htons", socket_htons,\r
4320 METH_VARARGS, htons_doc},\r
4321 {"htonl", socket_htonl,\r
4322 METH_O, htonl_doc},\r
4323 {"inet_aton", socket_inet_aton,\r
4324 METH_VARARGS, inet_aton_doc},\r
4325 {"inet_ntoa", socket_inet_ntoa,\r
4326 METH_VARARGS, inet_ntoa_doc},\r
4327#ifdef HAVE_INET_PTON\r
4328 {"inet_pton", socket_inet_pton,\r
4329 METH_VARARGS, inet_pton_doc},\r
4330 {"inet_ntop", socket_inet_ntop,\r
4331 METH_VARARGS, inet_ntop_doc},\r
4332#endif\r
4333 {"getaddrinfo", socket_getaddrinfo,\r
4334 METH_VARARGS, getaddrinfo_doc},\r
4335 {"getnameinfo", socket_getnameinfo,\r
4336 METH_VARARGS, getnameinfo_doc},\r
4337 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,\r
4338 METH_NOARGS, getdefaulttimeout_doc},\r
4339 {"setdefaulttimeout", socket_setdefaulttimeout,\r
4340 METH_O, setdefaulttimeout_doc},\r
4341 {NULL, NULL} /* Sentinel */\r
4342};\r
4343\r
4344\r
4345#ifdef RISCOS\r
4346#define OS_INIT_DEFINED\r
4347\r
4348static int\r
4349os_init(void)\r
4350{\r
4351 _kernel_swi_regs r;\r
4352\r
4353 r.r[0] = 0;\r
4354 _kernel_swi(0x43380, &r, &r);\r
4355 taskwindow = r.r[0];\r
4356\r
4357 return 1;\r
4358}\r
4359\r
4360#endif /* RISCOS */\r
4361\r
4362\r
4363#ifdef MS_WINDOWS\r
4364#define OS_INIT_DEFINED\r
4365\r
4366/* Additional initialization and cleanup for Windows */\r
4367\r
4368static void\r
4369os_cleanup(void)\r
4370{\r
4371 WSACleanup();\r
4372}\r
4373\r
4374static int\r
4375os_init(void)\r
4376{\r
4377 WSADATA WSAData;\r
4378 int ret;\r
4379 char buf[100];\r
4380 ret = WSAStartup(0x0101, &WSAData);\r
4381 switch (ret) {\r
4382 case 0: /* No error */\r
4383 Py_AtExit(os_cleanup);\r
4384 return 1; /* Success */\r
4385 case WSASYSNOTREADY:\r
4386 PyErr_SetString(PyExc_ImportError,\r
4387 "WSAStartup failed: network not ready");\r
4388 break;\r
4389 case WSAVERNOTSUPPORTED:\r
4390 case WSAEINVAL:\r
4391 PyErr_SetString(\r
4392 PyExc_ImportError,\r
4393 "WSAStartup failed: requested version not supported");\r
4394 break;\r
4395 default:\r
4396 PyOS_snprintf(buf, sizeof(buf),\r
4397 "WSAStartup failed: error code %d", ret);\r
4398 PyErr_SetString(PyExc_ImportError, buf);\r
4399 break;\r
4400 }\r
4401 return 0; /* Failure */\r
4402}\r
4403\r
4404#endif /* MS_WINDOWS */\r
4405\r
4406\r
4407#ifdef PYOS_OS2\r
4408#define OS_INIT_DEFINED\r
4409\r
4410/* Additional initialization for OS/2 */\r
4411\r
4412static int\r
4413os_init(void)\r
4414{\r
4415#ifndef PYCC_GCC\r
4416 char reason[64];\r
4417 int rc = sock_init();\r
4418\r
4419 if (rc == 0) {\r
4420 return 1; /* Success */\r
4421 }\r
4422\r
4423 PyOS_snprintf(reason, sizeof(reason),\r
4424 "OS/2 TCP/IP Error# %d", sock_errno());\r
4425 PyErr_SetString(PyExc_ImportError, reason);\r
4426\r
4427 return 0; /* Failure */\r
4428#else\r
4429 /* No need to initialize sockets with GCC/EMX */\r
4430 return 1; /* Success */\r
4431#endif\r
4432}\r
4433\r
4434#endif /* PYOS_OS2 */\r
4435\r
4436\r
4437#ifndef OS_INIT_DEFINED\r
4438static int\r
4439os_init(void)\r
4440{\r
4441 return 1; /* Success */\r
4442}\r
4443#endif\r
4444\r
4445\r
4446/* C API table - always add new things to the end for binary\r
4447 compatibility. */\r
4448static\r
4449PySocketModule_APIObject PySocketModuleAPI =\r
4450{\r
4451 &sock_type,\r
4452 NULL\r
4453};\r
4454\r
4455\r
4456/* Initialize the _socket module.\r
4457\r
4458 This module is actually called "_socket", and there's a wrapper\r
4459 "socket.py" which implements some additional functionality. On some\r
4460 platforms (e.g. Windows and OS/2), socket.py also implements a\r
4461 wrapper for the socket type that provides missing functionality such\r
4462 as makefile(), dup() and fromfd(). The import of "_socket" may fail\r
4463 with an ImportError exception if os-specific initialization fails.\r
4464 On Windows, this does WINSOCK initialization. When WINSOCK is\r
4465 initialized successfully, a call to WSACleanup() is scheduled to be\r
4466 made at exit time.\r
4467*/\r
4468\r
4469PyDoc_STRVAR(socket_doc,\r
4470"Implementation module for socket operations.\n\\r
4471\n\\r
4472See the socket module for documentation.");\r
4473\r
4474PyMODINIT_FUNC\r
4475init_socket(void)\r
4476{\r
4477 PyObject *m, *has_ipv6;\r
4478\r
4479 if (!os_init())\r
4480 return;\r
4481\r
4482 Py_TYPE(&sock_type) = &PyType_Type;\r
4483 m = Py_InitModule3(PySocket_MODULE_NAME,\r
4484 socket_methods,\r
4485 socket_doc);\r
4486 if (m == NULL)\r
4487 return;\r
4488\r
4489 socket_error = PyErr_NewException("socket.error",\r
4490 PyExc_IOError, NULL);\r
4491 if (socket_error == NULL)\r
4492 return;\r
4493 PySocketModuleAPI.error = socket_error;\r
4494 Py_INCREF(socket_error);\r
4495 PyModule_AddObject(m, "error", socket_error);\r
4496 socket_herror = PyErr_NewException("socket.herror",\r
4497 socket_error, NULL);\r
4498 if (socket_herror == NULL)\r
4499 return;\r
4500 Py_INCREF(socket_herror);\r
4501 PyModule_AddObject(m, "herror", socket_herror);\r
4502 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,\r
4503 NULL);\r
4504 if (socket_gaierror == NULL)\r
4505 return;\r
4506 Py_INCREF(socket_gaierror);\r
4507 PyModule_AddObject(m, "gaierror", socket_gaierror);\r
4508 socket_timeout = PyErr_NewException("socket.timeout",\r
4509 socket_error, NULL);\r
4510 if (socket_timeout == NULL)\r
4511 return;\r
4512 Py_INCREF(socket_timeout);\r
4513 PyModule_AddObject(m, "timeout", socket_timeout);\r
4514 Py_INCREF((PyObject *)&sock_type);\r
4515 if (PyModule_AddObject(m, "SocketType",\r
4516 (PyObject *)&sock_type) != 0)\r
4517 return;\r
4518 Py_INCREF((PyObject *)&sock_type);\r
4519 if (PyModule_AddObject(m, "socket",\r
4520 (PyObject *)&sock_type) != 0)\r
4521 return;\r
4522\r
4523#ifdef ENABLE_IPV6\r
4524 has_ipv6 = Py_True;\r
4525#else\r
4526 has_ipv6 = Py_False;\r
4527#endif\r
4528 Py_INCREF(has_ipv6);\r
4529 PyModule_AddObject(m, "has_ipv6", has_ipv6);\r
4530\r
4531 /* Export C API */\r
4532 if (PyModule_AddObject(m, PySocket_CAPI_NAME,\r
4533 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)\r
4534 ) != 0)\r
4535 return;\r
4536\r
4537 /* Address families (we only support AF_INET and AF_UNIX) */\r
4538#ifdef AF_UNSPEC\r
4539 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);\r
4540#endif\r
4541 PyModule_AddIntConstant(m, "AF_INET", AF_INET);\r
4542#ifdef AF_INET6\r
4543 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);\r
4544#endif /* AF_INET6 */\r
4545#if defined(AF_UNIX)\r
4546 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);\r
4547#endif /* AF_UNIX */\r
4548#ifdef AF_AX25\r
4549 /* Amateur Radio AX.25 */\r
4550 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);\r
4551#endif\r
4552#ifdef AF_IPX\r
4553 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */\r
4554#endif\r
4555#ifdef AF_APPLETALK\r
4556 /* Appletalk DDP */\r
4557 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);\r
4558#endif\r
4559#ifdef AF_NETROM\r
4560 /* Amateur radio NetROM */\r
4561 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);\r
4562#endif\r
4563#ifdef AF_BRIDGE\r
4564 /* Multiprotocol bridge */\r
4565 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);\r
4566#endif\r
4567#ifdef AF_ATMPVC\r
4568 /* ATM PVCs */\r
4569 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);\r
4570#endif\r
4571#ifdef AF_AAL5\r
4572 /* Reserved for Werner's ATM */\r
4573 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);\r
4574#endif\r
4575#ifdef AF_X25\r
4576 /* Reserved for X.25 project */\r
4577 PyModule_AddIntConstant(m, "AF_X25", AF_X25);\r
4578#endif\r
4579#ifdef AF_INET6\r
4580 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */\r
4581#endif\r
4582#ifdef AF_ROSE\r
4583 /* Amateur Radio X.25 PLP */\r
4584 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);\r
4585#endif\r
4586#ifdef AF_DECnet\r
4587 /* Reserved for DECnet project */\r
4588 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);\r
4589#endif\r
4590#ifdef AF_NETBEUI\r
4591 /* Reserved for 802.2LLC project */\r
4592 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);\r
4593#endif\r
4594#ifdef AF_SECURITY\r
4595 /* Security callback pseudo AF */\r
4596 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);\r
4597#endif\r
4598#ifdef AF_KEY\r
4599 /* PF_KEY key management API */\r
4600 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);\r
4601#endif\r
4602#ifdef AF_NETLINK\r
4603 /* */\r
4604 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);\r
4605 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);\r
4606#ifdef NETLINK_SKIP\r
4607 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);\r
4608#endif\r
4609#ifdef NETLINK_W1\r
4610 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);\r
4611#endif\r
4612 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);\r
4613 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);\r
4614#ifdef NETLINK_TCPDIAG\r
4615 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);\r
4616#endif\r
4617#ifdef NETLINK_NFLOG\r
4618 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);\r
4619#endif\r
4620#ifdef NETLINK_XFRM\r
4621 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);\r
4622#endif\r
4623#ifdef NETLINK_ARPD\r
4624 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);\r
4625#endif\r
4626#ifdef NETLINK_ROUTE6\r
4627 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);\r
4628#endif\r
4629 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);\r
4630#ifdef NETLINK_DNRTMSG\r
4631 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);\r
4632#endif\r
4633#ifdef NETLINK_TAPBASE\r
4634 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);\r
4635#endif\r
4636#endif /* AF_NETLINK */\r
4637#ifdef AF_ROUTE\r
4638 /* Alias to emulate 4.4BSD */\r
4639 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);\r
4640#endif\r
4641#ifdef AF_ASH\r
4642 /* Ash */\r
4643 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);\r
4644#endif\r
4645#ifdef AF_ECONET\r
4646 /* Acorn Econet */\r
4647 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);\r
4648#endif\r
4649#ifdef AF_ATMSVC\r
4650 /* ATM SVCs */\r
4651 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);\r
4652#endif\r
4653#ifdef AF_SNA\r
4654 /* Linux SNA Project (nutters!) */\r
4655 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);\r
4656#endif\r
4657#ifdef AF_IRDA\r
4658 /* IRDA sockets */\r
4659 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);\r
4660#endif\r
4661#ifdef AF_PPPOX\r
4662 /* PPPoX sockets */\r
4663 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);\r
4664#endif\r
4665#ifdef AF_WANPIPE\r
4666 /* Wanpipe API Sockets */\r
4667 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);\r
4668#endif\r
4669#ifdef AF_LLC\r
4670 /* Linux LLC */\r
4671 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);\r
4672#endif\r
4673\r
4674#ifdef USE_BLUETOOTH\r
4675 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);\r
4676 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);\r
4677 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);\r
4678 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);\r
4679#if !defined(__NetBSD__) && !defined(__DragonFly__)\r
4680 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);\r
4681#endif\r
4682#if !defined(__FreeBSD__)\r
4683#if !defined(__NetBSD__) && !defined(__DragonFly__)\r
4684 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);\r
4685#endif\r
4686 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);\r
4687 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);\r
4688#endif\r
4689 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);\r
4690 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");\r
4691 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");\r
4692#endif\r
4693\r
4694#ifdef AF_PACKET\r
4695 PyModule_AddIntMacro(m, AF_PACKET);\r
4696#endif\r
4697#ifdef PF_PACKET\r
4698 PyModule_AddIntMacro(m, PF_PACKET);\r
4699#endif\r
4700#ifdef PACKET_HOST\r
4701 PyModule_AddIntMacro(m, PACKET_HOST);\r
4702#endif\r
4703#ifdef PACKET_BROADCAST\r
4704 PyModule_AddIntMacro(m, PACKET_BROADCAST);\r
4705#endif\r
4706#ifdef PACKET_MULTICAST\r
4707 PyModule_AddIntMacro(m, PACKET_MULTICAST);\r
4708#endif\r
4709#ifdef PACKET_OTHERHOST\r
4710 PyModule_AddIntMacro(m, PACKET_OTHERHOST);\r
4711#endif\r
4712#ifdef PACKET_OUTGOING\r
4713 PyModule_AddIntMacro(m, PACKET_OUTGOING);\r
4714#endif\r
4715#ifdef PACKET_LOOPBACK\r
4716 PyModule_AddIntMacro(m, PACKET_LOOPBACK);\r
4717#endif\r
4718#ifdef PACKET_FASTROUTE\r
4719 PyModule_AddIntMacro(m, PACKET_FASTROUTE);\r
4720#endif\r
4721\r
4722#ifdef HAVE_LINUX_TIPC_H\r
4723 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);\r
4724\r
4725 /* for addresses */\r
4726 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);\r
4727 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);\r
4728 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);\r
4729\r
4730 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);\r
4731 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);\r
4732 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);\r
4733\r
4734 /* for setsockopt() */\r
4735 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);\r
4736 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);\r
4737 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);\r
4738 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",\r
4739 TIPC_DEST_DROPPABLE);\r
4740 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);\r
4741\r
4742 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",\r
4743 TIPC_LOW_IMPORTANCE);\r
4744 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",\r
4745 TIPC_MEDIUM_IMPORTANCE);\r
4746 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",\r
4747 TIPC_HIGH_IMPORTANCE);\r
4748 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",\r
4749 TIPC_CRITICAL_IMPORTANCE);\r
4750\r
4751 /* for subscriptions */\r
4752 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);\r
4753 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);\r
4754#ifdef TIPC_SUB_CANCEL\r
4755 /* doesn't seem to be available everywhere */\r
4756 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);\r
4757#endif\r
4758 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);\r
4759 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);\r
4760 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);\r
4761 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);\r
4762 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);\r
4763 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);\r
4764#endif\r
4765\r
4766 /* Socket types */\r
4767 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);\r
4768 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);\r
4769#ifndef __BEOS__\r
4770/* We have incomplete socket support. */\r
4771 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);\r
4772 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);\r
4773#if defined(SOCK_RDM)\r
4774 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);\r
4775#endif\r
4776#endif\r
4777\r
4778#ifdef SO_DEBUG\r
4779 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);\r
4780#endif\r
4781#ifdef SO_ACCEPTCONN\r
4782 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);\r
4783#endif\r
4784#ifdef SO_REUSEADDR\r
4785 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);\r
4786#endif\r
4787#ifdef SO_EXCLUSIVEADDRUSE\r
4788 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);\r
4789#endif\r
4790\r
4791#ifdef SO_KEEPALIVE\r
4792 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);\r
4793#endif\r
4794#ifdef SO_DONTROUTE\r
4795 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);\r
4796#endif\r
4797#ifdef SO_BROADCAST\r
4798 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);\r
4799#endif\r
4800#ifdef SO_USELOOPBACK\r
4801 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);\r
4802#endif\r
4803#ifdef SO_LINGER\r
4804 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);\r
4805#endif\r
4806#ifdef SO_OOBINLINE\r
4807 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);\r
4808#endif\r
4809#ifdef SO_REUSEPORT\r
4810 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);\r
4811#endif\r
4812#ifdef SO_SNDBUF\r
4813 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);\r
4814#endif\r
4815#ifdef SO_RCVBUF\r
4816 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);\r
4817#endif\r
4818#ifdef SO_SNDLOWAT\r
4819 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);\r
4820#endif\r
4821#ifdef SO_RCVLOWAT\r
4822 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);\r
4823#endif\r
4824#ifdef SO_SNDTIMEO\r
4825 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);\r
4826#endif\r
4827#ifdef SO_RCVTIMEO\r
4828 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);\r
4829#endif\r
4830#ifdef SO_ERROR\r
4831 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);\r
4832#endif\r
4833#ifdef SO_TYPE\r
4834 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);\r
4835#endif\r
4836#ifdef SO_SETFIB\r
4837 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);\r
4838#endif\r
4839\r
4840 /* Maximum number of connections for "listen" */\r
4841#ifdef SOMAXCONN\r
4842 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);\r
4843#else\r
4844 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */\r
4845#endif\r
4846\r
4847 /* Flags for send, recv */\r
4848#ifdef MSG_OOB\r
4849 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);\r
4850#endif\r
4851#ifdef MSG_PEEK\r
4852 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);\r
4853#endif\r
4854#ifdef MSG_DONTROUTE\r
4855 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);\r
4856#endif\r
4857#ifdef MSG_DONTWAIT\r
4858 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);\r
4859#endif\r
4860#ifdef MSG_EOR\r
4861 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);\r
4862#endif\r
4863#ifdef MSG_TRUNC\r
4864 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);\r
4865#endif\r
4866#ifdef MSG_CTRUNC\r
4867 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);\r
4868#endif\r
4869#ifdef MSG_WAITALL\r
4870 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);\r
4871#endif\r
4872#ifdef MSG_BTAG\r
4873 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);\r
4874#endif\r
4875#ifdef MSG_ETAG\r
4876 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);\r
4877#endif\r
4878\r
4879 /* Protocol level and numbers, usable for [gs]etsockopt */\r
4880#ifdef SOL_SOCKET\r
4881 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);\r
4882#endif\r
4883#ifdef SOL_IP\r
4884 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);\r
4885#else\r
4886 PyModule_AddIntConstant(m, "SOL_IP", 0);\r
4887#endif\r
4888#ifdef SOL_IPX\r
4889 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);\r
4890#endif\r
4891#ifdef SOL_AX25\r
4892 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);\r
4893#endif\r
4894#ifdef SOL_ATALK\r
4895 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);\r
4896#endif\r
4897#ifdef SOL_NETROM\r
4898 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);\r
4899#endif\r
4900#ifdef SOL_ROSE\r
4901 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);\r
4902#endif\r
4903#ifdef SOL_TCP\r
4904 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);\r
4905#else\r
4906 PyModule_AddIntConstant(m, "SOL_TCP", 6);\r
4907#endif\r
4908#ifdef SOL_UDP\r
4909 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);\r
4910#else\r
4911 PyModule_AddIntConstant(m, "SOL_UDP", 17);\r
4912#endif\r
4913#ifdef IPPROTO_IP\r
4914 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);\r
4915#else\r
4916 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);\r
4917#endif\r
4918#ifdef IPPROTO_HOPOPTS\r
4919 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);\r
4920#endif\r
4921#ifdef IPPROTO_ICMP\r
4922 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);\r
4923#else\r
4924 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);\r
4925#endif\r
4926#ifdef IPPROTO_IGMP\r
4927 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);\r
4928#endif\r
4929#ifdef IPPROTO_GGP\r
4930 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);\r
4931#endif\r
4932#ifdef IPPROTO_IPV4\r
4933 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);\r
4934#endif\r
4935#ifdef IPPROTO_IPV6\r
4936 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);\r
4937#endif\r
4938#ifdef IPPROTO_IPIP\r
4939 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);\r
4940#endif\r
4941#ifdef IPPROTO_TCP\r
4942 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);\r
4943#else\r
4944 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);\r
4945#endif\r
4946#ifdef IPPROTO_EGP\r
4947 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);\r
4948#endif\r
4949#ifdef IPPROTO_PUP\r
4950 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);\r
4951#endif\r
4952#ifdef IPPROTO_UDP\r
4953 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);\r
4954#else\r
4955 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);\r
4956#endif\r
4957#ifdef IPPROTO_IDP\r
4958 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);\r
4959#endif\r
4960#ifdef IPPROTO_HELLO\r
4961 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);\r
4962#endif\r
4963#ifdef IPPROTO_ND\r
4964 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);\r
4965#endif\r
4966#ifdef IPPROTO_TP\r
4967 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);\r
4968#endif\r
4969#ifdef IPPROTO_IPV6\r
4970 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);\r
4971#endif\r
4972#ifdef IPPROTO_ROUTING\r
4973 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);\r
4974#endif\r
4975#ifdef IPPROTO_FRAGMENT\r
4976 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);\r
4977#endif\r
4978#ifdef IPPROTO_RSVP\r
4979 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);\r
4980#endif\r
4981#ifdef IPPROTO_GRE\r
4982 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);\r
4983#endif\r
4984#ifdef IPPROTO_ESP\r
4985 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);\r
4986#endif\r
4987#ifdef IPPROTO_AH\r
4988 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);\r
4989#endif\r
4990#ifdef IPPROTO_MOBILE\r
4991 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);\r
4992#endif\r
4993#ifdef IPPROTO_ICMPV6\r
4994 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);\r
4995#endif\r
4996#ifdef IPPROTO_NONE\r
4997 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);\r
4998#endif\r
4999#ifdef IPPROTO_DSTOPTS\r
5000 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);\r
5001#endif\r
5002#ifdef IPPROTO_XTP\r
5003 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);\r
5004#endif\r
5005#ifdef IPPROTO_EON\r
5006 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);\r
5007#endif\r
5008#ifdef IPPROTO_PIM\r
5009 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);\r
5010#endif\r
5011#ifdef IPPROTO_IPCOMP\r
5012 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);\r
5013#endif\r
5014#ifdef IPPROTO_VRRP\r
5015 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);\r
5016#endif\r
5017#ifdef IPPROTO_BIP\r
5018 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);\r
5019#endif\r
5020/**/\r
5021#ifdef IPPROTO_RAW\r
5022 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);\r
5023#else\r
5024 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);\r
5025#endif\r
5026#ifdef IPPROTO_MAX\r
5027 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);\r
5028#endif\r
5029\r
5030 /* Some port configuration */\r
5031#ifdef IPPORT_RESERVED\r
5032 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);\r
5033#else\r
5034 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);\r
5035#endif\r
5036#ifdef IPPORT_USERRESERVED\r
5037 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);\r
5038#else\r
5039 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);\r
5040#endif\r
5041\r
5042 /* Some reserved IP v.4 addresses */\r
5043#ifdef INADDR_ANY\r
5044 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);\r
5045#else\r
5046 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);\r
5047#endif\r
5048#ifdef INADDR_BROADCAST\r
5049 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);\r
5050#else\r
5051 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);\r
5052#endif\r
5053#ifdef INADDR_LOOPBACK\r
5054 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);\r
5055#else\r
5056 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);\r
5057#endif\r
5058#ifdef INADDR_UNSPEC_GROUP\r
5059 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);\r
5060#else\r
5061 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);\r
5062#endif\r
5063#ifdef INADDR_ALLHOSTS_GROUP\r
5064 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",\r
5065 INADDR_ALLHOSTS_GROUP);\r
5066#else\r
5067 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);\r
5068#endif\r
5069#ifdef INADDR_MAX_LOCAL_GROUP\r
5070 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",\r
5071 INADDR_MAX_LOCAL_GROUP);\r
5072#else\r
5073 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);\r
5074#endif\r
5075#ifdef INADDR_NONE\r
5076 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);\r
5077#else\r
5078 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);\r
5079#endif\r
5080\r
5081 /* IPv4 [gs]etsockopt options */\r
5082#ifdef IP_OPTIONS\r
5083 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);\r
5084#endif\r
5085#ifdef IP_HDRINCL\r
5086 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);\r
5087#endif\r
5088#ifdef IP_TOS\r
5089 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);\r
5090#endif\r
5091#ifdef IP_TTL\r
5092 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);\r
5093#endif\r
5094#ifdef IP_RECVOPTS\r
5095 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);\r
5096#endif\r
5097#ifdef IP_RECVRETOPTS\r
5098 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);\r
5099#endif\r
5100#ifdef IP_RECVDSTADDR\r
5101 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);\r
5102#endif\r
5103#ifdef IP_RETOPTS\r
5104 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);\r
5105#endif\r
5106#ifdef IP_MULTICAST_IF\r
5107 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);\r
5108#endif\r
5109#ifdef IP_MULTICAST_TTL\r
5110 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);\r
5111#endif\r
5112#ifdef IP_MULTICAST_LOOP\r
5113 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);\r
5114#endif\r
5115#ifdef IP_ADD_MEMBERSHIP\r
5116 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);\r
5117#endif\r
5118#ifdef IP_DROP_MEMBERSHIP\r
5119 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);\r
5120#endif\r
5121#ifdef IP_DEFAULT_MULTICAST_TTL\r
5122 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",\r
5123 IP_DEFAULT_MULTICAST_TTL);\r
5124#endif\r
5125#ifdef IP_DEFAULT_MULTICAST_LOOP\r
5126 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",\r
5127 IP_DEFAULT_MULTICAST_LOOP);\r
5128#endif\r
5129#ifdef IP_MAX_MEMBERSHIPS\r
5130 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);\r
5131#endif\r
5132\r
5133 /* IPv6 [gs]etsockopt options, defined in RFC2553 */\r
5134#ifdef IPV6_JOIN_GROUP\r
5135 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);\r
5136#endif\r
5137#ifdef IPV6_LEAVE_GROUP\r
5138 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);\r
5139#endif\r
5140#ifdef IPV6_MULTICAST_HOPS\r
5141 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);\r
5142#endif\r
5143#ifdef IPV6_MULTICAST_IF\r
5144 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);\r
5145#endif\r
5146#ifdef IPV6_MULTICAST_LOOP\r
5147 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);\r
5148#endif\r
5149#ifdef IPV6_UNICAST_HOPS\r
5150 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);\r
5151#endif\r
5152 /* Additional IPV6 socket options, defined in RFC 3493 */\r
5153#ifdef IPV6_V6ONLY\r
5154 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);\r
5155#endif\r
5156 /* Advanced IPV6 socket options, from RFC 3542 */\r
5157#ifdef IPV6_CHECKSUM\r
5158 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);\r
5159#endif\r
5160#ifdef IPV6_DONTFRAG\r
5161 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);\r
5162#endif\r
5163#ifdef IPV6_DSTOPTS\r
5164 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);\r
5165#endif\r
5166#ifdef IPV6_HOPLIMIT\r
5167 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);\r
5168#endif\r
5169#ifdef IPV6_HOPOPTS\r
5170 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);\r
5171#endif\r
5172#ifdef IPV6_NEXTHOP\r
5173 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);\r
5174#endif\r
5175#ifdef IPV6_PATHMTU\r
5176 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);\r
5177#endif\r
5178#ifdef IPV6_PKTINFO\r
5179 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);\r
5180#endif\r
5181#ifdef IPV6_RECVDSTOPTS\r
5182 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);\r
5183#endif\r
5184#ifdef IPV6_RECVHOPLIMIT\r
5185 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);\r
5186#endif\r
5187#ifdef IPV6_RECVHOPOPTS\r
5188 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);\r
5189#endif\r
5190#ifdef IPV6_RECVPKTINFO\r
5191 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);\r
5192#endif\r
5193#ifdef IPV6_RECVRTHDR\r
5194 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);\r
5195#endif\r
5196#ifdef IPV6_RECVTCLASS\r
5197 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);\r
5198#endif\r
5199#ifdef IPV6_RTHDR\r
5200 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);\r
5201#endif\r
5202#ifdef IPV6_RTHDRDSTOPTS\r
5203 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);\r
5204#endif\r
5205#ifdef IPV6_RTHDR_TYPE_0\r
5206 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);\r
5207#endif\r
5208#ifdef IPV6_RECVPATHMTU\r
5209 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);\r
5210#endif\r
5211#ifdef IPV6_TCLASS\r
5212 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);\r
5213#endif\r
5214#ifdef IPV6_USE_MIN_MTU\r
5215 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);\r
5216#endif\r
5217\r
5218 /* TCP options */\r
5219#ifdef TCP_NODELAY\r
5220 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);\r
5221#endif\r
5222#ifdef TCP_MAXSEG\r
5223 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);\r
5224#endif\r
5225#ifdef TCP_CORK\r
5226 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);\r
5227#endif\r
5228#ifdef TCP_KEEPIDLE\r
5229 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);\r
5230#endif\r
5231#ifdef TCP_KEEPINTVL\r
5232 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);\r
5233#endif\r
5234#ifdef TCP_KEEPCNT\r
5235 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);\r
5236#endif\r
5237#ifdef TCP_SYNCNT\r
5238 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);\r
5239#endif\r
5240#ifdef TCP_LINGER2\r
5241 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);\r
5242#endif\r
5243#ifdef TCP_DEFER_ACCEPT\r
5244 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);\r
5245#endif\r
5246#ifdef TCP_WINDOW_CLAMP\r
5247 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);\r
5248#endif\r
5249#ifdef TCP_INFO\r
5250 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);\r
5251#endif\r
5252#ifdef TCP_QUICKACK\r
5253 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);\r
5254#endif\r
5255\r
5256\r
5257 /* IPX options */\r
5258#ifdef IPX_TYPE\r
5259 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);\r
5260#endif\r
5261\r
5262 /* get{addr,name}info parameters */\r
5263#ifdef EAI_ADDRFAMILY\r
5264 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);\r
5265#endif\r
5266#ifdef EAI_AGAIN\r
5267 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);\r
5268#endif\r
5269#ifdef EAI_BADFLAGS\r
5270 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);\r
5271#endif\r
5272#ifdef EAI_FAIL\r
5273 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);\r
5274#endif\r
5275#ifdef EAI_FAMILY\r
5276 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);\r
5277#endif\r
5278#ifdef EAI_MEMORY\r
5279 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);\r
5280#endif\r
5281#ifdef EAI_NODATA\r
5282 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);\r
5283#endif\r
5284#ifdef EAI_NONAME\r
5285 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);\r
5286#endif\r
5287#ifdef EAI_OVERFLOW\r
5288 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);\r
5289#endif\r
5290#ifdef EAI_SERVICE\r
5291 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);\r
5292#endif\r
5293#ifdef EAI_SOCKTYPE\r
5294 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);\r
5295#endif\r
5296#ifdef EAI_SYSTEM\r
5297 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);\r
5298#endif\r
5299#ifdef EAI_BADHINTS\r
5300 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);\r
5301#endif\r
5302#ifdef EAI_PROTOCOL\r
5303 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);\r
5304#endif\r
5305#ifdef EAI_MAX\r
5306 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);\r
5307#endif\r
5308#ifdef AI_PASSIVE\r
5309 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);\r
5310#endif\r
5311#ifdef AI_CANONNAME\r
5312 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);\r
5313#endif\r
5314#ifdef AI_NUMERICHOST\r
5315 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);\r
5316#endif\r
5317#ifdef AI_NUMERICSERV\r
5318 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);\r
5319#endif\r
5320#ifdef AI_MASK\r
5321 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);\r
5322#endif\r
5323#ifdef AI_ALL\r
5324 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);\r
5325#endif\r
5326#ifdef AI_V4MAPPED_CFG\r
5327 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);\r
5328#endif\r
5329#ifdef AI_ADDRCONFIG\r
5330 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);\r
5331#endif\r
5332#ifdef AI_V4MAPPED\r
5333 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);\r
5334#endif\r
5335#ifdef AI_DEFAULT\r
5336 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);\r
5337#endif\r
5338#ifdef NI_MAXHOST\r
5339 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);\r
5340#endif\r
5341#ifdef NI_MAXSERV\r
5342 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);\r
5343#endif\r
5344#ifdef NI_NOFQDN\r
5345 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);\r
5346#endif\r
5347#ifdef NI_NUMERICHOST\r
5348 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);\r
5349#endif\r
5350#ifdef NI_NAMEREQD\r
5351 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);\r
5352#endif\r
5353#ifdef NI_NUMERICSERV\r
5354 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);\r
5355#endif\r
5356#ifdef NI_DGRAM\r
5357 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);\r
5358#endif\r
5359\r
5360 /* shutdown() parameters */\r
5361#ifdef SHUT_RD\r
5362 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);\r
5363#elif defined(SD_RECEIVE)\r
5364 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);\r
5365#else\r
5366 PyModule_AddIntConstant(m, "SHUT_RD", 0);\r
5367#endif\r
5368#ifdef SHUT_WR\r
5369 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);\r
5370#elif defined(SD_SEND)\r
5371 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);\r
5372#else\r
5373 PyModule_AddIntConstant(m, "SHUT_WR", 1);\r
5374#endif\r
5375#ifdef SHUT_RDWR\r
5376 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);\r
5377#elif defined(SD_BOTH)\r
5378 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);\r
5379#else\r
5380 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);\r
5381#endif\r
5382\r
5383#ifdef SIO_RCVALL\r
5384 {\r
5385 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};\r
5386 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};\r
5387 int i;\r
5388 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {\r
5389 PyObject *tmp;\r
5390 tmp = PyLong_FromUnsignedLong(codes[i]);\r
5391 if (tmp == NULL)\r
5392 return;\r
5393 PyModule_AddObject(m, names[i], tmp);\r
5394 }\r
5395 }\r
5396 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);\r
5397 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);\r
5398 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);\r
5399#ifdef RCVALL_IPLEVEL\r
5400 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);\r
5401#endif\r
5402#ifdef RCVALL_MAX\r
5403 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);\r
5404#endif\r
5405#endif /* _MSTCPIP_ */\r
5406\r
5407 /* Initialize gethostbyname lock */\r
5408#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
5409 netdb_lock = PyThread_allocate_lock();\r
5410#endif\r
5411}\r
5412\r
5413\r
5414#ifndef HAVE_INET_PTON\r
5415#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)\r
5416\r
5417/* Simplistic emulation code for inet_pton that only works for IPv4 */\r
5418/* These are not exposed because they do not set errno properly */\r
5419\r
5420int\r
5421inet_pton(int af, const char *src, void *dst)\r
5422{\r
5423 if (af == AF_INET) {\r
5424#if (SIZEOF_INT != 4)\r
5425#error "Not sure if in_addr_t exists and int is not 32-bits."\r
5426#endif\r
5427 unsigned int packed_addr;\r
5428 packed_addr = inet_addr(src);\r
5429 if (packed_addr == INADDR_NONE)\r
5430 return 0;\r
5431 memcpy(dst, &packed_addr, 4);\r
5432 return 1;\r
5433 }\r
5434 /* Should set errno to EAFNOSUPPORT */\r
5435 return -1;\r
5436}\r
5437\r
5438const char *\r
5439inet_ntop(int af, const void *src, char *dst, socklen_t size)\r
5440{\r
5441 if (af == AF_INET) {\r
5442 struct in_addr packed_addr;\r
5443 if (size < 16)\r
5444 /* Should set errno to ENOSPC. */\r
5445 return NULL;\r
5446 memcpy(&packed_addr, src, sizeof(packed_addr));\r
5447 return strncpy(dst, inet_ntoa(packed_addr), size);\r
5448 }\r
5449 /* Should set errno to EAFNOSUPPORT */\r
5450 return NULL;\r
5451}\r
5452\r
5453#endif\r
5454#endif\r