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