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