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