14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Socket module */
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis module provides an interface to Berkeley socket IPC.
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLimitations:
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  under Linux.
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- No read/write operations (use sendall/recv or makefile instead).
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- Additional restrictions apply on some non-Unix platforms (compensated
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  for by socket.py).
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmModule interface:
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.error: exception raised for socket specific errors
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    a subclass of socket.error
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.herror: exception raised for gethostby* errors,
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    a subclass of socket.error
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from an existing file descriptor)
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getprotobyname(protocolname) --> protocol number
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getservbyname(servicename[, protocolname]) --> port number
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getservbyport(portnumber[, protocolname]) --> service name
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.socket([family[, type [, proto]]]) --> new socket object
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.ntohs(16 bit value) --> new int object
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.ntohl(32 bit value) --> new int object
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.htons(16 bit value) --> new int object
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.htonl(32 bit value) --> new int object
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    --> List of (family, socktype, proto, canonname, sockaddr)
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getnameinfo(sockaddr, flags) --> (host, port)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.has_ipv6: boolean value indicating if IPv6 is supported
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.inet_aton(IP address) -> 32-bit packed IP representation
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.inet_ntoa(packed IP) -> IP address string
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.getdefaulttimeout() -> None | float
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- socket.setdefaulttimeout(None | float)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- an Internet socket address is a pair (hostname, port)
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  where hostname can be anything recognized by gethostbyname()
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  (including the dd.dd.dd.dd notation) and port is in host byte order
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- where a hostname is returned, the dd.dd.dd.dd notation is used
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- a UNIX domain socket address is a string specifying the pathname
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- an AF_PACKET socket address is a tuple containing a string
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  specifying the ethernet interface and an integer specifying
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  the Ethernet protocol number to be received. For example:
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  ("eth0",0x1234).  Optional 3rd,4th,5th elements in the tuple
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  specify packet-type and ha-type/addr.
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- an AF_TIPC socket address is expressed as
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  and scope can be one of:
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  The meaning of v1, v2 and v3 depends on the value of addr_type:
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if addr_type is TIPC_ADDR_NAME:
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1 is the server type
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2 is the port identifier
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3 is ignored
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if addr_type is TIPC_ADDR_NAMESEQ:
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1 is the server type
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2 is the lower port number
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3 is the upper port number
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if addr_type is TIPC_ADDR_ID:
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1 is the node
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2 is the ref
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3 is ignored
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLocal naming conventions:
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- names starting with sock_ are socket object methods
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- names starting with socket_ are module-level functions
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- names starting with PySocket are exported through socketmodule.h
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  /*
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * inet_aton is not available on OSX 10.3, yet we want to use a binary
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * that was build on 10.4 or later to work on that release, weak linking
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * comes to the rescue.
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   */
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# pragma weak inet_aton
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structmember.h"
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef MAX
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define MAX(x, y) ((x) < (y) ? (y) : (x))
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Socket object documentation */
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sock_doc,
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"socket([family[, type[, proto]]]) -> socket object\n\
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmOpen a socket of the given type.  The family argument specifies the\n\
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmaddress family; it defaults to AF_INET.  The type argument specifies\n\
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhether this is a stream (SOCK_STREAM, this is the default)\n\
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmor datagram (SOCK_DGRAM) socket.  The protocol argument defaults to 0,\n\
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspecifying the default protocol.  Keyword arguments are accepted.\n\
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA socket object represents one endpoint of a network connection.\n\
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMethods of socket objects (keyword arguments not allowed):\n\
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmaccept() -- accept a connection, returning new socket and client address\n\
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbind(addr) -- bind the socket to a local address\n\
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclose() -- close the socket\n\
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconnect(addr) -- connect the socket to a remote address\n\
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconnect_ex(addr) -- connect, return an error code instead of an exception\n\
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdup() -- return a new socket object identical to the current one [*]\n\
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfileno() -- return underlying file descriptor\n\
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetpeername() -- return remote address [*]\n\
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsockname() -- return local address\n\
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsockopt(level, optname[, buflen]) -- get socket options\n\
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgettimeout() -- return timeout or None\n\
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlisten(n) -- start listening for incoming connections\n\
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecv(buflen[, flags]) -- receive data\n\
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecvfrom_into(buffer[, nbytes, [, flags])\n\
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  -- receive data and sender\'s address (into a buffer)\n\
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsendall(data[, flags]) -- send all data\n\
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsend(data[, flags]) -- send data, may not send all of it\n\
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsendto(data[, flags], addr) -- send data to a given address\n\
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetblocking(0 | 1) -- set or clear the blocking I/O flag\n\
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetsockopt(level, optname, value) -- set socket options\n\
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsettimeout(None | float) -- set or clear the timeout\n\
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmshutdown(how) -- shut down traffic in one or both directions\n\
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm [*] not available on all platforms!");
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   I hope some day someone can clean this up please... */
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Hacks for gethostbyname_r().  On some non-Linux platforms, the configure
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   script doesn't get this right, so we hardcode some platform checks below.
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   On the other hand, not all Linux versions agree, so there the settings
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   computed by the configure script are needed! */
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef linux
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# undef HAVE_GETHOSTBYNAME_R_3_ARG
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# undef HAVE_GETHOSTBYNAME_R_5_ARG
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# undef HAVE_GETHOSTBYNAME_R_6_ARG
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef WITH_THREAD
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# undef HAVE_GETHOSTBYNAME_R
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(_AIX) || defined(__osf__)
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define HAVE_GETHOSTBYNAME_R_3_ARG
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# elif defined(__sun) || defined(__sgi)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define HAVE_GETHOSTBYNAME_R_5_ARG
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# elif defined(linux)
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Rely on the configure script */
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  undef HAVE_GETHOSTBYNAME_R
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    !defined(MS_WINDOWS)
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define USE_GETHOSTBYNAME_LOCK
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* To use __FreeBSD_version */
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_PARAM_H
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/param.h>
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* On systems on which getaddrinfo() is believed to not be thread-safe,
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   (this includes the getaddrinfo emulation) protect access with a lock. */
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(WITH_THREAD) && (defined(__APPLE__) || \
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    defined(__OpenBSD__) || defined(__NetBSD__) || \
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    defined(__VMS) || !defined(HAVE_GETADDRINFO))
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define USE_GETADDRINFO_LOCK
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_GETADDRINFO_LOCK
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define ACQUIRE_GETADDRINFO_LOCK
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define RELEASE_GETADDRINFO_LOCK
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include "pythread.h"
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYCC_VACPP)
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <types.h>
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <io.h>
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <sys/ioctl.h>
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <utils.h>
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <ctype.h>
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__VMS)
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <ioctl.h>
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2)
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define  INCL_DOS
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define  INCL_DOSERRORS
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define  INCL_NOPMAPI
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <os2.h>
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* make sure that the reentrant (gethostbyaddr_r etc)
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   functions are declared correctly if compiling with
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   MIPSPro 7.x in ANSI C mode (default) */
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX Using _SGIAPI is the wrong thing,
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   but I don't know what the right thing is. */
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef _SGIAPI /* to avoid warning */
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _SGIAPI 1
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef _XOPEN_SOURCE
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/socket.h>
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h>
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <netinet/in.h>
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef _SS_ALIGNSIZE
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_GETADDRINFO 1
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_GETNAMEINFO 1
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_INET_PTON
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <netdb.h>
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Irix 6.5 fails to define this variable at all. This is needed
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   for both GCC and SGI's compiler. I'd say that the SGI headers
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   are just busted. Same thing for Solaris. */
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INET_ADDRSTRLEN 16
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Generic includes */
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_TYPES_H
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h>
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Generic socket object definitions and includes */
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PySocket_BUILDING_SOCKET
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "socketmodule.h"
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Addressing includes */
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef MS_WINDOWS
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Non-MS WINDOWS includes */
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# include <netdb.h>
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Headers needed for inet_ntoa() and inet_addr() */
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ifdef __BEOS__
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <net/netdb.h>
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <netdb.h>
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef size_t socklen_t;
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#   include <arpa/inet.h>
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ifndef RISCOS
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <fcntl.h>
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <sys/ioctl.h>
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <socklib.h>
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define NO_DUP
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint h_errno; /* not used */
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define INET_ADDRSTRLEN 16
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* MS_WINDOWS includes */
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ifdef HAVE_FCNTL_H
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include <fcntl.h>
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stddef.h>
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef offsetof
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define offsetof(type, member) ((size_t)(&((type *)0)->member))
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef O_NONBLOCK
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define O_NONBLOCK O_NDELAY
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* include Python's addrinfo.h unless it causes trouble */
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  /* Do not include addinfo.h on some newer IRIX versions.
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * for example, but not by 6.5.10.
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   */
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(_MSC_VER) && _MSC_VER>1201
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   * EAI_* constants are defined in (the already included) ws2tcpip.h.
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   */
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  include "addrinfo.h"
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef HAVE_INET_PTON
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint inet_pton(int af, const char *src, void *dst);
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* On OS X, getaddrinfo returns no error indication of lookup
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   failure, so we must use the emulation instead of the libinfo
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   implementation. Unfortunately, performing an autoconf test
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   for this bug would require DNS access for the machine performing
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the configuration, which is not acceptable. Therefore, we
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   determine the bug just by checking for __APPLE__. If this bug
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   gets ever fixed, perhaps checking for sys/version.h would be
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   appropriate, which is 10/0 on the system with the bug. */
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef HAVE_GETNAMEINFO
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This bug seems to be fixed in Jaguar. Ths easiest way I could
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Find to check for Jaguar is that it has getnameinfo(), which
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   older releases don't have */
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef HAVE_GETADDRINFO
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INET_ATON
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define USE_INET_ATON_WEAKLINK
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* I know this is a bad practice, but it is the easiest... */
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_GETADDRINFO)
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* avoid clashes with the C library definition of the symbol. */
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define getaddrinfo fake_getaddrinfo
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define gai_strerror fake_gai_strerror
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define freeaddrinfo fake_freeaddrinfo
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "getaddrinfo.c"
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_GETNAMEINFO)
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define getnameinfo fake_getnameinfo
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "getnameinfo.c"
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) || defined(__BEOS__)
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* seem to be a few differences in the API */
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SOCKETCLOSE closesocket
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WIN32
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define EAFNOSUPPORT WSAEAFNOSUPPORT
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define snprintf _snprintf
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && !defined(PYCC_GCC)
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SOCKETCLOSE soclose
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef SOCKETCLOSE
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SOCKETCLOSE close
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define USE_BLUETOOTH 1
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__FreeBSD__)
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SOL_HCI SOL_HCI_RAW
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HCI_FILTER SO_HCI_RAW_FILTER
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_l2 sockaddr_l2cap
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_rc sockaddr_rfcomm
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define hci_dev hci_node
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(__NetBSD__) || defined(__DragonFly__)
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_l2 sockaddr_bt
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_rc sockaddr_bt
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_hci sockaddr_bt
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define sockaddr_sco sockaddr_bt
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SOL_HCI BTPROTO_HCI
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HCI_DATA_DIR SO_HCI_DIRECTION
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SEGMENT_SIZE (32 * 1024 -1)
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SAS2SA(x)       ((struct sockaddr *)(x))
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Constants for getnameinfo()
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(NI_MAXHOST)
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NI_MAXHOST 1025
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(NI_MAXSERV)
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NI_MAXSERV 32
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX There's a problem here: *static* functions are not supposed to have
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   a Py prefix (or use CapitalizedWords).  Later... */
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Global variable holding the exception type for errors detected
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   by this module (but not argument type or memory errors, etc.). */
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *socket_error;
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *socket_herror;
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *socket_gaierror;
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *socket_timeout;
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int taskwindow;
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A forward reference to the socket type object.
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The sock_type variable contains pointers to various functions,
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   some of which call new_sockobject(), which uses sock_type, so
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   there has to be a circular reference. */
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject sock_type;
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_POLL_H)
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <poll.h>
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_SYS_POLL_H)
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/poll.h>
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Platform can select file descriptors beyond FD_SETSIZE */
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define IS_SELECTABLE(s) 1
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_POLL)
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Instead of select(), we'll use poll() since poll() works on any fd. */
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define IS_SELECTABLE(s) 1
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Can we call select() with this socket without a buffer overrun? */
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* POSIX says selecting file descriptors beyond FD_SETSIZE
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   has undefined behaviour.  If there's no timeout left, we don't have to
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   call select, so it's a safe, little white lie. */
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmselect_error(void)
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(socket_error, "unable to select on socket");
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Convenience function to raise an error according to errno
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   and return a NULL pointer from a function. */
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_error(void)
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int err_no = WSAGetLastError();
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       recognizes the error codes used by both GetLastError() and
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       WSAGetLastError */
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (err_no)
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_SetExcFromWindowsErr(socket_error, err_no);
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && !defined(PYCC_GCC)
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sock_errno() != NO_ERROR) {
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        APIRET rc;
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ULONG  msglen;
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char outbuf[100];
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int myerrorcode = sock_errno();
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Retrieve socket-related error message from MPTN.MSG file */
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           myerrorcode - SOCBASEERR + 26,
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           "mptn.msg",
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           &msglen);
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (rc == NO_ERROR) {
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *v;
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* OS/2 doesn't guarantee a terminator */
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            outbuf[msglen] = '\0';
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (strlen(outbuf) > 0) {
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* If non-empty msg, trim CRLF */
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *lastc = &outbuf[ strlen(outbuf)-1 ];
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (lastc > outbuf &&
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       isspace(Py_CHARMASK(*lastc))) {
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* Trim trailing whitespace (CRLF) */
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *lastc-- = '\0';
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            v = Py_BuildValue("(is)", myerrorcode, outbuf);
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (v != NULL) {
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetObject(socket_error, v);
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(v);
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(RISCOS)
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (_inet_error.errnum != NULL) {
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v;
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = Py_BuildValue("(is)", errno, _inet_err());
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v != NULL) {
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetObject(socket_error, v);
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(v);
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyErr_SetFromErrno(socket_error);
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_herror(int h_error)
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_HSTRERROR
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = Py_BuildValue("(is)", h_error, "host not found");
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v != NULL) {
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetObject(socket_herror, v);
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_gaierror(int error)
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_SYSTEM
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* EAI_SYSTEM is not available on Windows XP. */
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error == EAI_SYSTEM)
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return set_error();
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GAI_STRERROR
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = Py_BuildValue("(is)", error, gai_strerror(error));
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = Py_BuildValue("(is)", error, "getaddrinfo failed");
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v != NULL) {
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetObject(socket_gaierror, v);
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Function to send in segments */
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsendsegmented(int sock_fd, char *buf, int len, int flags)
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n = 0;
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int remaining = len;
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (remaining > 0) {
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int segment;
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = send(sock_fd, buf, segment, flags);
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (n < 0) {
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return n;
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        remaining -= segment;
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf += segment;
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } /* end while */
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return len;
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Function to perform the setting of socket blocking mode
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   internally. block = (1 | 0). */
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminternal_setblocking(PySocketSockObject *s, int block)
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef RISCOS
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef MS_WINDOWS
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int delay_flag;
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __BEOS__
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = !block;
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               (void *)(&block), sizeof(int));
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef RISCOS
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef MS_WINDOWS
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && !defined(PYCC_GCC)
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = !block;
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(__VMS)
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = !block;
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else  /* !PYOS_OS2 && !__VMS */
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (block)
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        delay_flag &= (~O_NONBLOCK);
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        delay_flag |= O_NONBLOCK;
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fcntl(s->sock_fd, F_SETFL, delay_flag);
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !PYOS_OS2 */
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* MS_WINDOWS */
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = !block;
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* RISCOS */
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = !block;
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* RISCOS */
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __BEOS__ */
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Since these don't return anything */
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The argument writing indicates the direction.
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This does not raise an exception; we'll let our caller do that
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   after they've reacquired the interpreter lock.
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Returns 1 on timeout, -1 on error, 0 otherwise. */
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminternal_select(PySocketSockObject *s, int writing)
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n;
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Nothing to do unless we're in timeout mode (not non-blocking) */
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_timeout <= 0.0)
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Guard against closed socket */
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_fd < 0)
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Prefer poll, if available, since you can poll() any fd
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * which can't be done with select(). */
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_POLL
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct pollfd pollfd;
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int timeout;
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pollfd.fd = s->sock_fd;
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pollfd.events = writing ? POLLOUT : POLLIN;
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* s->sock_timeout is in seconds, timeout in ms */
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = (int)(s->sock_timeout * 1000 + 0.5);
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = poll(&pollfd, 1, timeout);
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Construct the arguments to select */
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fd_set fds;
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct timeval tv;
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tv.tv_sec = (int)s->sock_timeout;
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FD_ZERO(&fds);
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FD_SET(s->sock_fd, &fds);
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* See if the socket is ready */
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (writing)
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n == 0)
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Initialize a new socket object. */
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic double defaulttimeout = -1.0; /* Default timeout for new sockets */
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminit_sockobject(PySocketSockObject *s,
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                SOCKET_T fd, int family, int type, int proto)
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int block = 1;
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_fd = fd;
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_family = family;
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_type = type;
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_proto = proto;
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_timeout = defaulttimeout;
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->errorhandler = &set_error;
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (defaulttimeout >= 0.0)
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        internal_setblocking(s, 0);
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (taskwindow)
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a new socket object.
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This just creates the object and initializes it.
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   If the creation fails, return NULL and set an exception (implicit
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   in NEWOBJ()). */
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PySocketSockObject *
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnew_sockobject(SOCKET_T fd, int family, int type, int proto)
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySocketSockObject *s;
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = (PySocketSockObject *)
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyType_GenericNew(&sock_type, NULL, NULL);
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s != NULL)
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        init_sockobject(s, fd, family, type, proto);
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return s;
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Lock to allow python interpreter to continue, but only allow one
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   thread to be in gethostbyname or getaddrinfo */
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyThread_type_lock netdb_lock;
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Convert a string specifying a host name or one of a few symbolic
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   names to a numeric IP address.  This usually calls gethostbyname()
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   to do the work; the names "" and "<broadcast>" are special.
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Return the length (IPv4 should be 4 bytes), or negative if
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   an error occurred; then an exception is raised. */
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct addrinfo hints, *res;
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int error;
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int d1, d2, d3, d4;
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char ch;
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset((void *) addr_ret, '\0', sizeof(*addr_ret));
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (name[0] == '\0') {
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int siz;
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memset(&hints, 0, sizeof(hints));
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hints.ai_family = af;
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hints.ai_socktype = SOCK_DGRAM;         /*dummy*/
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hints.ai_flags = AI_PASSIVE;
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_BEGIN_ALLOW_THREADS
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ACQUIRE_GETADDRINFO_LOCK
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = getaddrinfo(NULL, "0", &hints, &res);
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_END_ALLOW_THREADS
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* We assume that those thread-unsafe getaddrinfo() versions
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           *are* safe regarding their return value, ie. that a
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           subsequent call to getaddrinfo() does not destroy the
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           outcome of the first call. */
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        RELEASE_GETADDRINFO_LOCK
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (error) {
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            set_gaierror(error);
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (res->ai_family) {
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case AF_INET:
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            siz = 4;
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case AF_INET6:
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            siz = 16;
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            freeaddrinfo(res);
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "unsupported address family");
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (res->ai_next) {
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            freeaddrinfo(res);
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "wildcard resolved to multiple address");
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (res->ai_addrlen < addr_ret_size)
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr_ret_size = res->ai_addrlen;
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(addr_ret, res->ai_addr, addr_ret_size);
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        freeaddrinfo(res);
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return siz;
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in *sin;
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (af != AF_INET && af != AF_UNSPEC) {
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "address family mismatched");
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin = (struct sockaddr_in *)addr_ret;
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memset((void *) sin, '\0', sizeof(*sin));
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_family = AF_INET;
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKADDR_SA_LEN
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_len = sizeof(*sin);
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_addr.s_addr = INADDR_BROADCAST;
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return sizeof(sin->sin_addr);
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in *sin;
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin = (struct sockaddr_in *)addr_ret;
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_addr.s_addr = htonl(
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ((long) d1 << 24) | ((long) d2 << 16) |
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ((long) d3 << 8) | ((long) d4 << 0));
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_family = AF_INET;
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKADDR_SA_LEN
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin->sin_len = sizeof(*sin);
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 4;
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&hints, 0, sizeof(hints));
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_family = af;
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ACQUIRE_GETADDRINFO_LOCK
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error = getaddrinfo(name, NULL, &hints, &res);
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__digital__) && defined(__unix__)
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error == EAI_NONAME && af == AF_UNSPEC) {
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* On Tru64 V5.1, numeric-to-addr conversion fails
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           if no address family is given. Assume IPv4 for now.*/
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hints.ai_family = AF_INET;
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = getaddrinfo(name, NULL, &hints, &res);
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_gaierror(error);
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res->ai_addrlen < addr_ret_size)
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr_ret_size = res->ai_addrlen;
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    freeaddrinfo(res);
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (addr_ret->sa_family) {
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 4;
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 16;
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "unknown address family");
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a string object representing an IP address.
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This is always a string of the form 'dd.dd.dd.dd' (with variable
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   size numbers). */
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakeipaddr(struct sockaddr *addr, int addrlen)
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[NI_MAXHOST];
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int error;
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NI_NUMERICHOST);
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_gaierror(error);
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(buf);
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_BLUETOOTH
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Convert a string representation of a Bluetooth address into a numeric
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   address.  Returns the length (6), or raises an exception and returns -1 if
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   an error occurred. */
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetbdaddr(char *name, bdaddr_t *bdaddr)
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned int b0, b1, b2, b3, b4, b5;
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char ch;
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               &b5, &b4, &b3, &b2, &b1, &b0, &ch);
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[0] = b0;
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[1] = b1;
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[2] = b2;
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[3] = b3;
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[4] = b4;
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[5] = b5;
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 6;
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "bad bluetooth address");
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a string representation of the Bluetooth address.  This is always a
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   value (zero padded if necessary). */
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakebdaddr(bdaddr_t *bdaddr)
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[(6 * 2) + 5 + 1];
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(buf);
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create an object representing the given socket address,
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   suitable for passing it back to bind(), connect() etc.
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The family field of the sockaddr structure is inspected
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   to determine what kind of address it really is. */
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (addrlen == 0) {
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* No address -- may be recvfrom() from known socket */
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_None);
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_None;
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __BEOS__
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* XXX: BeOS version of accept() doesn't set family correctly */
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    addr->sa_family = AF_INET;
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (addr->sa_family) {
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in *a;
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *addrobj = makeipaddr(addr, sizeof(*a));
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *ret = NULL;
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (addrobj) {
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a = (struct sockaddr_in *)addr;
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(addrobj);
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ret;
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_UNIX)
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_UNIX:
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_un *a = (struct sockaddr_un *) addr;
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef linux
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (a->sun_path[0] == 0) {  /* Linux abstract namespace */
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addrlen -= offsetof(struct sockaddr_un, sun_path);
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyString_FromStringAndSize(a->sun_path,
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                              addrlen);
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* linux */
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* regular NULL-terminated string */
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyString_FromString(a->sun_path);
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_UNIX */
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_NETLINK)
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       case AF_NETLINK:
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           return Py_BuildValue("II", a->nl_pid, a->nl_groups);
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       }
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_NETLINK */
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in6 *a;
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *addrobj = makeipaddr(addr, sizeof(*a));
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *ret = NULL;
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (addrobj) {
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            a = (struct sockaddr_in6 *)addr;
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ret = Py_BuildValue("Oiii",
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                addrobj,
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                ntohs(a->sin6_port),
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                a->sin6_flowinfo,
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                a->sin6_scope_id);
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(addrobj);
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ret;
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_BLUETOOTH
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_BLUETOOTH:
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (proto) {
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_L2CAP:
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *ret = NULL;
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (addrobj) {
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ret = Py_BuildValue("Oi",
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    addrobj,
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    _BT_L2_MEMB(a, psm));
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(addrobj);
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret;
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_RFCOMM:
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *ret = NULL;
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (addrobj) {
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ret = Py_BuildValue("Oi",
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    addrobj,
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    _BT_RC_MEMB(a, channel));
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(addrobj);
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret;
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_HCI:
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__NetBSD__) || defined(__DragonFly__)
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *ret = NULL;
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret;
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__FreeBSD__)
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_SCO:
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError,
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "Unknown Bluetooth protocol");
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_PACKET:
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *ifname = "";
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct ifreq ifr;
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* need to look up interface name give index */
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (a->sll_ifindex) {
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ifr.ifr_ifindex = a->sll_ifindex;
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ifname = ifr.ifr_name;
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_BuildValue("shbhs#",
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             ifname,
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             ntohs(a->sll_protocol),
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             a->sll_pkttype,
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             a->sll_hatype,
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             a->sll_addr,
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             a->sll_halen);
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LINUX_TIPC_H
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_TIPC:
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (a->addrtype == TIPC_ADDR_NAMESEQ) {
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Py_BuildValue("IIIII",
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addrtype,
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.nameseq.type,
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.nameseq.lower,
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.nameseq.upper,
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->scope);
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (a->addrtype == TIPC_ADDR_NAME) {
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Py_BuildValue("IIIII",
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addrtype,
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.name.name.type,
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.name.name.instance,
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.name.name.instance,
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->scope);
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (a->addrtype == TIPC_ADDR_ID) {
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Py_BuildValue("IIIII",
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addrtype,
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.id.node,
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->addr.id.ref,
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            0,
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            a->scope);
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError,
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "Invalid address type");
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* More cases here... */
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* If we don't know the address family, don't raise an
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           exception -- return it as a tuple. */
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_BuildValue("is#",
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             addr->sa_family,
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             addr->sa_data,
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             sizeof(addr->sa_data));
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Parse a socket address argument according to the socket object's
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   address family.  Return 1 if the address was in the proper format,
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   0 of not.  The address is returned through addr_ret, its length
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   through len_ret. */
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsockaddrarg(PySocketSockObject *s, PyObject *args,
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               struct sockaddr *addr_ret, int *len_ret)
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (s->sock_family) {
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_UNIX)
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_UNIX:
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_un* addr;
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *path;
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int len;
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_Parse(args, "t#", &path, &len))
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr = (struct sockaddr_un*)addr_ret;
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef linux
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (len > 0 && path[0] == 0) {
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Linux abstract namespace extension */
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (len > sizeof addr->sun_path) {
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error,
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "AF_UNIX path too long");
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* linux */
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* regular NULL-terminated string */
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (len >= sizeof addr->sun_path) {
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error,
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "AF_UNIX path too long");
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->sun_path[len] = 0;
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sun_family = s->sock_family;
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(addr->sun_path, path, len);
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2)
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof(*addr);
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = len + offsetof(struct sockaddr_un, sun_path);
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_UNIX */
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_NETLINK)
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_NETLINK:
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_nl* addr;
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int pid, groups;
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr = (struct sockaddr_nl *)addr_ret;
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyTuple_Check(args)) {
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_TypeError,
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: "
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "AF_NETLINK address must be tuple, not %.500s",
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_TYPE(args)->tp_name);
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->nl_family = AF_NETLINK;
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->nl_pid = pid;
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->nl_groups = groups;
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof(*addr);
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in* addr;
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *host;
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int port, result;
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyTuple_Check(args)) {
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_TypeError,
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: "
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "AF_INET address must be tuple, not %.500s",
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_TYPE(args)->tp_name);
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "idna", &host, &port))
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr=(struct sockaddr_in*)addr_ret;
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = setipaddr(host, (struct sockaddr *)addr,
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           sizeof(*addr),  AF_INET);
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_Free(host);
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (result < 0)
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (port < 0 || port > 0xffff) {
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_OverflowError,
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: port must be 0-65535.");
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin_family = AF_INET;
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin_port = htons((short)port);
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof *addr;
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in6* addr;
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *host;
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int port, flowinfo, scope_id, result;
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        flowinfo = scope_id = 0;
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyTuple_Check(args)) {
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_TypeError,
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: "
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "AF_INET6 address must be tuple, not %.500s",
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_TYPE(args)->tp_name);
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args, "eti|ii",
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "idna", &host, &port, &flowinfo,
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              &scope_id)) {
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr = (struct sockaddr_in6*)addr_ret;
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = setipaddr(host, (struct sockaddr *)addr,
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           sizeof(*addr), AF_INET6);
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyMem_Free(host);
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (result < 0)
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (port < 0 || port > 0xffff) {
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_OverflowError,
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: port must be 0-65535.");
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin6_family = s->sock_family;
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin6_port = htons((short)port);
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin6_flowinfo = flowinfo;
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sin6_scope_id = scope_id;
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof *addr;
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_BLUETOOTH
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_BLUETOOTH:
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (s->sock_proto) {
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_L2CAP:
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_l2 *addr;
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *straddr;
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr = (struct sockaddr_l2 *)addr_ret;
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memset(addr, 0, sizeof(struct sockaddr_l2));
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyArg_ParseTuple(args, "si", &straddr,
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  &_BT_L2_MEMB(addr, psm))) {
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error, "getsockaddrarg: "
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "wrong format");
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof *addr;
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_RFCOMM:
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_rc *addr;
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *straddr;
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr = (struct sockaddr_rc *)addr_ret;
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyArg_ParseTuple(args, "si", &straddr,
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  &_BT_RC_MEMB(addr, channel))) {
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error, "getsockaddrarg: "
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "wrong format");
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof *addr;
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_HCI:
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__NetBSD__) || defined(__DragonFly__)
1372c9f4d4838ce92a6c2fb4faf5f46faa3b057b4deedaryl.mcdaniel			char *straddr = PyBytes_AS_STRING(args);
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1374c9f4d4838ce92a6c2fb4faf5f46faa3b057b4deedaryl.mcdaniel			_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (straddr == NULL) {
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error, "getsockaddrarg: "
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "wrong format");
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error, "getsockaddrarg: "
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "wrong format");
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof *addr;
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__FreeBSD__)
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_SCO:
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_sco *addr;
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *straddr;
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr = (struct sockaddr_sco *)addr_ret;
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            straddr = PyString_AsString(args);
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (straddr == NULL) {
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(socket_error, "getsockaddrarg: "
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "wrong format");
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof *addr;
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_PACKET:
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_ll* addr;
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct ifreq ifr;
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *interfaceName;
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int protoNumber;
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int hatype = 0;
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int pkttype = 0;
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *haddr = NULL;
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int halen = 0;
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyTuple_Check(args)) {
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_TypeError,
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: "
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "AF_PACKET address must be tuple, not %.500s",
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_TYPE(args)->tp_name);
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              &protoNumber, &pkttype, &hatype,
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              &haddr, &halen))
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s->errorhandler();
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (halen > 8) {
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          PyErr_SetString(PyExc_ValueError,
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          "Hardware address must be 8 bytes or less");
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          return 0;
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (protoNumber < 0 || protoNumber > 0xffff) {
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_OverflowError,
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: protoNumber must be 0-65535.");
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr = (struct sockaddr_ll*)addr_ret;
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_family = AF_PACKET;
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_protocol = htons((short)protoNumber);
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_ifindex = ifr.ifr_ifindex;
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_pkttype = pkttype;
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_hatype = hatype;
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (halen != 0) {
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          memcpy(&addr->sll_addr, haddr, halen);
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->sll_halen = halen;
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof *addr;
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LINUX_TIPC_H
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_TIPC:
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int atype, v1, v2, v3;
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int scope = TIPC_CLUSTER_SCOPE;
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_tipc *addr;
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyTuple_Check(args)) {
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyExc_TypeError,
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "getsockaddrarg: "
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "AF_TIPC address must be tuple, not %.500s",
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_TYPE(args)->tp_name);
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args,
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "IIII|I;Invalid TIPC address format",
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                &atype, &v1, &v2, &v3, &scope))
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr = (struct sockaddr_tipc *) addr_ret;
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memset(addr, 0, sizeof(struct sockaddr_tipc));
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->family = AF_TIPC;
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->scope = scope;
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        addr->addrtype = atype;
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (atype == TIPC_ADDR_NAMESEQ) {
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.nameseq.type = v1;
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.nameseq.lower = v2;
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.nameseq.upper = v3;
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (atype == TIPC_ADDR_NAME) {
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.name.name.type = v1;
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.name.name.instance = v2;
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (atype == TIPC_ADDR_ID) {
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.id.node = v1;
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr->addr.id.ref = v2;
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Shouldn't happen */
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_TypeError, "Invalid address type");
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof(*addr);
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* More cases here... */
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "getsockaddrarg: bad family");
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get the address length according to the socket object's address family.
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Return 1 if the family is known, 0 otherwise.  The length is returned
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   through len_ret. */
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (s->sock_family) {
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_UNIX)
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_UNIX:
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof (struct sockaddr_un);
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_UNIX */
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_NETLINK)
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       case AF_NETLINK:
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           *len_ret = sizeof (struct sockaddr_nl);
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           return 1;
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       }
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof (struct sockaddr_in);
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof (struct sockaddr_in6);
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_BLUETOOTH
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_BLUETOOTH:
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch(s->sock_proto)
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_L2CAP:
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof (struct sockaddr_l2);
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_RFCOMM:
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof (struct sockaddr_rc);
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_HCI:
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof (struct sockaddr_hci);
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__FreeBSD__)
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BTPROTO_SCO:
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *len_ret = sizeof (struct sockaddr_sco);
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error, "getsockaddrlen: "
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "unknown BT protocol");
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_NETPACKET_PACKET_H
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_PACKET:
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof (struct sockaddr_ll);
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LINUX_TIPC_H
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_TIPC:
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *len_ret = sizeof (struct sockaddr_tipc);
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* More cases here... */
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "getsockaddrlen: bad family");
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.accept() method */
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_accept(PySocketSockObject *s)
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T newfd;
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socklen_t addrlen;
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sock = NULL;
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *addr = NULL;
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res = NULL;
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int timeout;
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrlen(s, &addrlen))
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&addrbuf, 0, addrlen);
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newfd = INVALID_SOCKET;
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newfd = -1;
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s))
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return select_error();
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = internal_select(s, 0);
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!timeout)
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newfd == INVALID_SOCKET)
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newfd < 0)
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Create the new object with unspecified family,
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       to avoid calls to bind() etc. on it. */
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock = (PyObject *) new_sockobject(newfd,
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_family,
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_type,
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_proto);
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sock == NULL) {
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        SOCKETCLOSE(newfd);
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto finally;
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        addrlen, s->sock_proto);
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (addr == NULL)
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto finally;
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyTuple_Pack(2, sock, addr);
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally:
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(sock);
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(addr);
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(accept_doc,
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"accept() -> (socket object, address info)\n\
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWait for an incoming connection.  Return a new socket representing the\n\
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconnection, and the address of the client.  For IP sockets, the address\n\
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminfo is a pair (hostaddr, port).");
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.setblocking(flag) method.  Argument:
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   False -- non-blocking mode; same as settimeout(0)
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   True -- blocking mode; same as settimeout(None)
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_setblocking(PySocketSockObject *s, PyObject *arg)
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int block;
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = PyInt_AsLong(arg);
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (block == -1 && PyErr_Occurred())
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_timeout = block ? -1.0 : 0.0;
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    internal_setblocking(s, block);
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setblocking_doc,
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setblocking(flag)\n\
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the socket to blocking (flag is true) or non-blocking (false).\n\
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetblocking(True) is equivalent to settimeout(None);\n\
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetblocking(False) is equivalent to settimeout(0.0).");
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.settimeout(timeout) method.  Argument:
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   None -- no timeout, blocking mode; same as setblocking(True)
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   0.0  -- non-blocking mode; same as setblocking(False)
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   > 0  -- timeout mode; operations time out after timeout seconds
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   < 0  -- illegal; raises an exception
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_settimeout(PySocketSockObject *s, PyObject *arg)
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    double timeout;
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (arg == Py_None)
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = -1.0;
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = PyFloat_AsDouble(arg);
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (timeout < 0.0) {
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyErr_Occurred())
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_ValueError,
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "Timeout value out of range");
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s->sock_timeout = timeout;
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    internal_setblocking(s, timeout < 0.0);
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(settimeout_doc,
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"settimeout(timeout)\n\
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet a timeout on socket operations.  'timeout' can be a float,\n\
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgiving in seconds, or None.  Setting a timeout of None disables\n\
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe timeout feature and is equivalent to setblocking(1).\n\
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSetting a timeout of zero is the same as setblocking(0).");
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.gettimeout() method.
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Returns the timeout associated with a socket. */
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_gettimeout(PySocketSockObject *s)
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_timeout < 0.0) {
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_None);
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_None;
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyFloat_FromDouble(s->sock_timeout);
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gettimeout_doc,
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gettimeout() -> timeout\n\
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturns the timeout in floating seconds associated with socket \n\
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoperations. A timeout of None indicates that timeouts on socket \n\
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoperations are disabled.");
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.sleeptaskw(1 | 0) method */
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int block;
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    block = PyInt_AsLong(arg);
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (block == -1 && PyErr_Occurred())
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sleeptaskw_doc,
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sleeptaskw(flag)\n\
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAllow sleeps in taskwindows.");
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.setsockopt() method.
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   With an integer third argument, sets an integer option.
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   With a string third argument, sets an option from a buffer;
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   use optional built-in module 'struct' to encode the string. */
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_setsockopt(PySocketSockObject *s, PyObject *args)
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int level;
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int optname;
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *buf;
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int buflen;
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int flag;
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(args, "iii:setsockopt",
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         &level, &optname, &flag)) {
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf = (char *) &flag;
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buflen = sizeof flag;
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(args, "iis#:setsockopt",
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              &level, &optname, &buf, &buflen))
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setsockopt_doc,
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setsockopt(level, option, value)\n\
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet a socket option.  See the Unix manual for level and option.\n\
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe value argument can either be an integer or a string.");
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.getsockopt() method.
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   With two arguments, retrieves an integer option.
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   With a third integer argument, retrieves a string buffer of that size;
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   use optional built-in module 'struct' to decode the string. */
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_getsockopt(PySocketSockObject *s, PyObject *args)
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int level;
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int optname;
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *buf;
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socklen_t buflen = 0;
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __BEOS__
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* We have incomplete socket support. */
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(socket_error, "getsockopt not supported");
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &level, &optname, &buflen))
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buflen == 0) {
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int flag = 0;
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        socklen_t flagsize = sizeof flag;
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = getsockopt(s->sock_fd, level, optname,
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         (void *)&flag, &flagsize);
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (res < 0)
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return s->errorhandler();
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyInt_FromLong(flag);
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* socklen_t is unsigned so no negative test is needed,
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       test buflen == 0 is previously done */
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buflen > 1024) {
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buflen <= 0 || buflen > 1024) {
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "getsockopt buflen out of range");
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = PyString_FromStringAndSize((char *)NULL, buflen);
19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buf == NULL)
19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = getsockopt(s->sock_fd, level, optname,
19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     (void *)PyString_AS_STRING(buf), &buflen);
19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0) {
19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(buf);
19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _PyString_Resize(&buf, buflen);
19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return buf;
19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __BEOS__ */
19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getsockopt_doc,
19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getsockopt(level, option[, buffersize]) -> value\n\
19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmGet a socket option.  See the Unix manual for level and option.\n\
19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf a nonzero buffersize argument is given, the return value is a\n\
19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring of that length; otherwise it is an integer.");
19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.bind(sockaddr) method */
19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_bind(PySocketSockObject *s, PyObject *addro)
19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int addrlen;
19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(bind_doc,
19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"bind(address)\n\
19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmBind the socket to a local address.  For IP sockets, the address is a\n\
19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpair (host, port); the host must refer to the local host. For raw packet\n\
19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.close() method.
19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Set the file descriptor to -1 so operations tried subsequently
19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   will surely fail. */
19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_close(PySocketSockObject *s)
19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T fd;
19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((fd = s->sock_fd) != -1) {
19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->sock_fd = -1;
19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_BEGIN_ALLOW_THREADS
19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (void) SOCKETCLOSE(fd);
19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_END_ALLOW_THREADS
19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(close_doc,
19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"close()\n\
19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClose the socket.  It cannot be used after this call.");
19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminternal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 int *timeoutp)
19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res, timeout;
19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = 0;
19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = connect(s->sock_fd, addr, addrlen);
19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_timeout > 0.0) {
19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            IS_SELECTABLE(s)) {
19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* This is a mess.  Best solution: trust select */
19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fd_set fds;
19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fd_set fds_exc;
19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct timeval tv;
19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tv.tv_sec = (int)s->sock_timeout;
19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FD_ZERO(&fds);
19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FD_SET(s->sock_fd, &fds);
19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FD_ZERO(&fds_exc);
19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FD_SET(s->sock_fd, &fds_exc);
19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (res == 0) {
19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                res = WSAEWOULDBLOCK;
20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                timeout = 1;
20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else if (res > 0) {
20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (FD_ISSET(s->sock_fd, &fds))
20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* The socket is in the writeable set - this
20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       means connected */
20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    res = 0;
20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else {
20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* As per MS docs, we need to call getsockopt()
20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       to get the underlying error */
20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    int res_size = sizeof res;
20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* It must be in the exception set */
20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    assert(FD_ISSET(s->sock_fd, &fds_exc));
20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        (char *)&res, &res_size))
20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        /* getsockopt also clears WSAGetLastError,
20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           so reset it back. */
20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        WSASetLastError(res);
20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    else
20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        res = WSAGetLastError();
20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* else if (res < 0) an error occurred */
20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = WSAGetLastError();
20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_timeout > 0.0) {
20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            timeout = internal_select(s, 1);
20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (timeout == 0) {
20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Bug #1019808: in case of an EINPROGRESS,
20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   use getsockopt(SO_ERROR) to get the real
20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   error. */
20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                socklen_t res_size = sizeof res;
20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (void)getsockopt(s->sock_fd, SOL_SOCKET,
20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 SO_ERROR, &res, &res_size);
20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (res == EISCONN)
20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    res = 0;
20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                errno = res;
20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (timeout == -1) {
20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                res = errno;            /* had error */
20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                res = EWOULDBLOCK;                      /* timed out */
20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = errno;
20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *timeoutp = timeout;
20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.connect(sockaddr) method */
20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_connect(PySocketSockObject *s, PyObject *addro)
20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int addrlen;
20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int timeout;
20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res != 0)
20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(connect_doc,
20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"connect(address)\n\
20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConnect the socket to a remote address.  For IP sockets, the address\n\
20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis a pair (host, port).");
20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.connect_ex(sockaddr) method */
20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_connect_ex(PySocketSockObject *s, PyObject *addro)
20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int addrlen;
21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int timeout;
21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Signals are not errors (though they may raise exceptions).  Adapted
21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       from PyErr_SetFromErrnoWithFilenameObject(). */
21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EINTR
21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res == EINTR && PyErr_CheckSignals())
21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) res);
21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(connect_ex_doc,
21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"connect_ex(address) -> errno\n\
21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis is like connect(address), but returns an error code (the errno value)\n\
21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminstead of raising an exception when an error occurs.");
21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.fileno() method */
21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_fileno(PySocketSockObject *s)
21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_SOCKET_T <= SIZEOF_LONG
21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) s->sock_fd);
21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fileno_doc,
21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fileno() -> integer\n\
21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the integer file descriptor of the socket.");
21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.dup() method */
21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_dup(PySocketSockObject *s)
21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T newfd;
21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sock;
21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    newfd = dup(s->sock_fd);
21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (newfd < 0)
21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock = (PyObject *) new_sockobject(newfd,
21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_family,
21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_type,
21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       s->sock_proto);
21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sock == NULL)
21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        SOCKETCLOSE(newfd);
21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return sock;
21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(dup_doc,
21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"dup() -> socket object\n\
21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a new socket object connected to the same system resource.");
21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.getsockname() method */
21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_getsockname(PySocketSockObject *s)
21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socklen_t addrlen;
21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrlen(s, &addrlen))
21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&addrbuf, 0, addrlen);
21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        s->sock_proto);
21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getsockname_doc,
21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getsockname() -> address info\n\
21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the address of the local endpoint.  For IP sockets, the address\n\
22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminfo is a pair (hostaddr, port).");
22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETPEERNAME         /* Cray APP doesn't have this :-( */
22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.getpeername() method */
22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_getpeername(PySocketSockObject *s)
22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socklen_t addrlen;
22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrlen(s, &addrlen))
22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&addrbuf, 0, addrlen);
22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        s->sock_proto);
22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getpeername_doc,
22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getpeername() -> address info\n\
22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the address of the remote endpoint.  For IP sockets, the address\n\
22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminfo is a pair (hostaddr, port).");
22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_GETPEERNAME */
22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.listen(n) method */
22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_listen(PySocketSockObject *s, PyObject *arg)
22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int backlog;
22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    backlog = PyInt_AsLong(arg);
22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (backlog == -1 && PyErr_Occurred())
22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* To avoid problems on systems that don't allow a negative backlog
22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * (which doesn't make sense anyway) we force a minimum value of 0. */
22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (backlog < 0)
22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        backlog = 0;
22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = listen(s->sock_fd, backlog);
22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(listen_doc,
22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"listen(backlog)\n\
22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmEnable a server to accept connections.  The backlog argument must be at\n\
22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmleast 0 (if it is lower, it is set to 0); it specifies the number of\n\
22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmunaccepted connections that the system will allow before refusing new\n\
22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconnections.");
22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.makefile(mode) method.
22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Create a new open file object referring to a dupped version of
22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the socket's file descriptor.  (The dup() call is necessary so
22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   that the open file and socket objects may be closed independent
22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   of each other.)
22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The mode argument specifies 'r' or 'w' passed to fdopen(). */
22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_makefile(PySocketSockObject *s, PyObject *args)
22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    extern int fclose(FILE *);
22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *mode = "r";
22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int bufsize = -1;
22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WIN32
22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_intptr_t fd;
22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int fd;
22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FILE *fp;
22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *f;
22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *mode_r = "r";
22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *mode_w = "w";
22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp(mode,"rb") == 0) {
22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        mode = mode_r;
22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (strcmp(mode,"wb") == 0) {
23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mode = mode_w;
23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WIN32
23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (fd >= 0)
23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            SOCKETCLOSE(fd);
23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    f = PyFile_FromFile(fp, "<socket>", mode, fclose);
23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (f != NULL)
23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyFile_SetBufSize(f, bufsize);
23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return f;
23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(makefile_doc,
23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"makefile([mode[, buffersize]]) -> file object\n\
23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a regular file object corresponding to the socket.\n\
23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe mode and buffersize arguments are as for the built-in open() function.");
23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* NO_DUP */
23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This is the guts of the recv() and recv_into() methods, which reads into a
23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * char buffer.  If you have any inc/dec ref to do to the objects that contain
23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the buffer, do it in the caller.  This function returns the number of bytes
23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * successfully read.  If there was an error, it returns -1.  Note that it is
23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * also possible that we return a number of bytes smaller than the request
23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * bytes.
23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic ssize_t
23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t outlen = -1;
23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int timeout;
23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int remaining;
23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *read_buf;
23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s)) {
23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        select_error();
23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef __VMS
23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = internal_select(s, 0);
23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!timeout)
23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        outlen = recv(s->sock_fd, cbuf, len, flags);
23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outlen < 0) {
23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Note: the call to errorhandler() ALWAYS indirectly returned
23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           NULL, so ignore its return value */
23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->errorhandler();
23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    read_buf = cbuf;
23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    remaining = len;
23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (remaining != 0) {
23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int segment;
23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int nread = -1;
23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        segment = remaining /SEGMENT_SIZE;
23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (segment != 0) {
23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            segment = SEGMENT_SIZE;
23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            segment = remaining;
23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_BEGIN_ALLOW_THREADS
23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = internal_select(s, 0);
23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!timeout)
23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nread = recv(s->sock_fd, read_buf, segment, flags);
23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_END_ALLOW_THREADS
23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (timeout == 1) {
23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_timeout, "timed out");
23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (nread < 0) {
23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s->errorhandler();
23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (nread != remaining) {
24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            read_buf += nread;
24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        remaining -= segment;
24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        read_buf += segment;
24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    outlen = read_buf - cbuf;
24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !__VMS */
24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return outlen;
24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.recv(nbytes [,flags]) method */
24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recv(PySocketSockObject *s, PyObject *args)
24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int recvlen, flags = 0;
24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t outlen;
24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *buf;
24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen < 0) {
24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "negative buffersize in recv");
24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Allocate a new string. */
24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = PyString_FromStringAndSize((char *) 0, recvlen);
24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buf == NULL)
24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Call the guts */
24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outlen < 0) {
24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* An error occurred, release the string and return an
24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           error. */
24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(buf);
24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outlen != recvlen) {
24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* We did not read as many bytes as we anticipated, resize the
24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           string if possible and be successful. */
24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (_PyString_Resize(&buf, outlen) < 0)
24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Oopsy, not so successful after all. */
24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return buf;
24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(recv_doc,
24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"recv(buffersize[, flags]) -> data\n\
24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReceive up to buffersize bytes from the socket.  For the optional flags\n\
24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmargument, see the Unix manual.  When no data is available, block until\n\
24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmat least one byte is available or until the remote end is closed.  When\n\
24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe remote end is closed and all data is read, return the empty string.");
24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.recv_into(buffer, [nbytes [,flags]]) method */
24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int recvlen = 0, flags = 0;
24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t readlen;
24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_buffer buf;
24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t buflen;
24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Get the buffer's memory */
24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &buf, &recvlen, &flags))
24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buflen = buf.len;
24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(buf.buf != 0 && buflen > 0);
24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen < 0) {
24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "negative buffersize in recv_into");
24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen == 0) {
24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* If nbytes was not specified, use the buffer's length */
24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        recvlen = buflen;
24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check if the buffer is large enough */
24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buflen < recvlen) {
24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "buffer too small for requested bytes");
24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Call the guts */
25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (readlen < 0) {
25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Return an error. */
25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&buf);
25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Return the number of bytes read.  Note that we do not do anything
25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       special here in the case that readlen < recvlen. */
25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(readlen);
25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmerror:
25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&buf);
25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(recv_into_doc,
25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA version of recv() that stores its data into a buffer rather than creating \n\
25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma new string.  Receive up to buffersize bytes from the socket.  If buffersize \n\
25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis not specified (or 0), receive up to the size available in the given buffer.\n\
25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee recv() for documentation about the flags.");
25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * into a char buffer.  If you have any inc/def ref to do to the objects that
25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * contain the buffer, do it in the caller.  This function returns the number
25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of bytes successfully read.  If there was an error, it returns -1.  Note
25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * that it is also possible that we return a number of bytes smaller than the
25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * request bytes.
25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 'addr' is a return value for the address object.  Note that you must decref
25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * it yourself.
25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic ssize_t
25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   PyObject** addr)
25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int timeout;
25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t n = -1;
25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socklen_t addrlen;
25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *addr = NULL;
25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrlen(s, &addrlen))
25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s)) {
25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        select_error();
25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&addrbuf, 0, addrlen);
25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = internal_select(s, 0);
25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!timeout) {
25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef MS_WINDOWS
25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && !defined(PYCC_GCC)
25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = recvfrom(s->sock_fd, cbuf, len, flags,
25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     SAS2SA(&addrbuf), &addrlen);
25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = recvfrom(s->sock_fd, cbuf, len, flags,
25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     (void *) &addrbuf, &addrlen);
25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = recvfrom(s->sock_fd, cbuf, len, flags,
25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     SAS2SA(&addrbuf), &addrlen);
25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0) {
25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->errorhandler();
25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               addrlen, s->sock_proto)))
25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return n;
25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.recvfrom(nbytes [,flags]) method */
25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recvfrom(PySocketSockObject *s, PyObject *args)
25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *buf = NULL;
26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *addr = NULL;
26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *ret = NULL;
26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int recvlen, flags = 0;
26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t outlen;
26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen < 0) {
26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "negative buffersize in recvfrom");
26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = PyString_FromStringAndSize((char *) 0, recvlen);
26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (buf == NULL)
26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                recvlen, flags, &addr);
26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outlen < 0) {
26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto finally;
26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outlen != recvlen) {
26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* We did not read as many bytes as we anticipated, resize the
26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           string if possible and be successful. */
26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (_PyString_Resize(&buf, outlen) < 0)
26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Oopsy, not so successful after all. */
26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto finally;
26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = PyTuple_Pack(2, buf, addr);
26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally:
26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(buf);
26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(addr);
26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(recvfrom_doc,
26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"recvfrom(buffersize[, flags]) -> (data, address info)\n\
26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike recv(buffersize, flags) but also return the sender's address info.");
26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int recvlen = 0, flags = 0;
26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ssize_t readlen;
26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_buffer buf;
26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int buflen;
26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *addr = NULL;
26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     kwlist, &buf,
26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &recvlen, &flags))
26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buflen = buf.len;
26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(buf.buf != 0 && buflen > 0);
26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen < 0) {
26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "negative buffersize in recvfrom_into");
26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (recvlen == 0) {
26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* If nbytes was not specified, use the buffer's length */
26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        recvlen = buflen;
26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (readlen < 0) {
26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Return an error */
26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&buf);
26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Return the number of bytes read and the address.  Note that we do
26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       not do anything special here in the case that readlen < recvlen. */
26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_BuildValue("lN", readlen, addr);
26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmerror:
26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(addr);
26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&buf);
26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(recvfrom_into_doc,
26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.send(data [,flags]) method */
27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_send(PySocketSockObject *s, PyObject *args)
27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *buf;
27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len, n = -1, flags = 0, timeout;
27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_buffer pbuf;
27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s)) {
27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyBuffer_Release(&pbuf);
27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return select_error();
27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = pbuf.buf;
27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = pbuf.len;
27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = internal_select(s, 1);
27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!timeout)
27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = sendsegmented(s->sock_fd, buf, len, flags);
27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = send(s->sock_fd, buf, len, flags);
27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&pbuf);
27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long)n);
27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(send_doc,
27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"send(data[, flags]) -> count\n\
27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSend a data string to the socket.  For the optional flags\n\
27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmargument, see the Unix manual.  Return the number of bytes\n\
27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsent; this may be less than len(data) if the network is busy.");
27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.sendall(data [,flags]) method */
27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_sendall(PySocketSockObject *s, PyObject *args)
27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *buf;
27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len, n = -1, flags = 0, timeout, saved_errno;
27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_buffer pbuf;
27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = pbuf.buf;
27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = pbuf.len;
27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s)) {
27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyBuffer_Release(&pbuf);
27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return select_error();
27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    do {
27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_BEGIN_ALLOW_THREADS
27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = internal_select(s, 1);
27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = -1;
27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!timeout) {
27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = sendsegmented(s->sock_fd, buf, len, flags);
27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = send(s->sock_fd, buf, len, flags);
27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_END_ALLOW_THREADS
27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (timeout == 1) {
27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyBuffer_Release(&pbuf);
27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_timeout, "timed out");
27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* PyErr_CheckSignals() might change errno */
27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        saved_errno = errno;
27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* We must run our signal handlers before looping again.
27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           send() can return a successful partial write when it is
27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           interrupted, so we can't restrict ourselves to EINTR. */
27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyErr_CheckSignals()) {
27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyBuffer_Release(&pbuf);
27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (n < 0) {
27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* If interrupted, try again */
27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (saved_errno == EINTR)
27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                continue;
27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf += n;
28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        len -= n;
28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } while (len > 0);
28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&pbuf);
28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sendall_doc,
28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sendall(data[, flags])\n\
28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSend a data string to the socket.  For the optional flags\n\
28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmargument, see the Unix manual.  This calls send() repeatedly\n\
28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmuntil all data is sent.  If an error occurs, it's impossible\n\
28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto tell how much data has been sent.");
28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.sendto(data, [flags,] sockaddr) method */
28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_sendto(PySocketSockObject *s, PyObject *args)
28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_buffer pbuf;
2827c9f4d4838ce92a6c2fb4faf5f46faa3b057b4deedaryl.mcdaniel    PyObject *addro;
28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *buf;
28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t len;
28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int addrlen, n = -1, flags, timeout;
28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int arglen;
28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    flags = 0;
28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arglen = PyTuple_Size(args);
28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch(arglen) {
28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 2:
28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case 3:
28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         " arguments (%d given)", arglen);
28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred())
28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf = pbuf.buf;
28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    len = pbuf.len;
28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!IS_SELECTABLE(s)) {
28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyBuffer_Release(&pbuf);
28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return select_error();
28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyBuffer_Release(&pbuf);
28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    timeout = internal_select(s, 1);
28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!timeout)
28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyBuffer_Release(&pbuf);
28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (timeout == 1) {
28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_timeout, "timed out");
28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n < 0)
28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long)n);
28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sendto_doc,
28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sendto(data[, flags], address) -> count\n\
28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike send(data, flags) but allows specifying the destination address.\n\
28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFor IP sockets, the address is a pair (hostaddr, port).");
28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s.shutdown(how) method */
28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_shutdown(PySocketSockObject *s, PyObject *arg)
28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int how;
28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    how = PyInt_AsLong(arg);
28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (how == -1 && PyErr_Occurred())
28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = shutdown(s->sock_fd, how);
28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return s->errorhandler();
29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(shutdown_doc,
29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"shutdown(flag)\n\
29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmShut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmof the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_ioctl(PySocketSockObject *s, PyObject *arg)
29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long cmd = SIO_RCVALL;
29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *argO;
29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    DWORD recv;
29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (cmd) {
29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case SIO_RCVALL: {
29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int option = RCVALL_ON;
29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return set_error();
29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyLong_FromUnsignedLong(recv); }
29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case SIO_KEEPALIVE_VALS: {
29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct tcp_keepalive ka;
29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return set_error();
29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyLong_FromUnsignedLong(recv); }
29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sock_ioctl_doc,
29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"ioctl(cmd, option) -> long\n\
29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmControl the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSIO_RCVALL:  'option' must be one of the socket.RCVALL_* constants.\n\
29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSIO_KEEPALIVE_VALS:  'option' is a tuple of (onoff, timeout, interval).");
29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* List of methods for socket objects */
29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef sock_methods[] = {
29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"accept",            (PyCFunction)sock_accept, METH_NOARGS,
29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      accept_doc},
29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"bind",              (PyCFunction)sock_bind, METH_O,
29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      bind_doc},
29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"close",             (PyCFunction)sock_close, METH_NOARGS,
29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      close_doc},
29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"connect",           (PyCFunction)sock_connect, METH_O,
29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      connect_doc},
29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"connect_ex",        (PyCFunction)sock_connect_ex, METH_O,
29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      connect_ex_doc},
29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"dup",               (PyCFunction)sock_dup, METH_NOARGS,
29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      dup_doc},
29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fileno",            (PyCFunction)sock_fileno, METH_NOARGS,
29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      fileno_doc},
29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETPEERNAME
29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getpeername",       (PyCFunction)sock_getpeername,
29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      METH_NOARGS, getpeername_doc},
29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getsockname",       (PyCFunction)sock_getsockname,
29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      METH_NOARGS, getsockname_doc},
29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getsockopt",        (PyCFunction)sock_getsockopt, METH_VARARGS,
29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      getsockopt_doc},
29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"ioctl",             (PyCFunction)sock_ioctl, METH_VARARGS,
29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sock_ioctl_doc},
29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"listen",            (PyCFunction)sock_listen, METH_O,
29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      listen_doc},
29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"makefile",          (PyCFunction)sock_makefile, METH_VARARGS,
29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      makefile_doc},
29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"recv",              (PyCFunction)sock_recv, METH_VARARGS,
29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      recv_doc},
29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"recv_into",         (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      recv_into_doc},
29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"recvfrom",          (PyCFunction)sock_recvfrom, METH_VARARGS,
29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      recvfrom_doc},
30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"recvfrom_into",  (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      recvfrom_into_doc},
30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"send",              (PyCFunction)sock_send, METH_VARARGS,
30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      send_doc},
30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"sendall",           (PyCFunction)sock_sendall, METH_VARARGS,
30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sendall_doc},
30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"sendto",            (PyCFunction)sock_sendto, METH_VARARGS,
30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sendto_doc},
30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setblocking",       (PyCFunction)sock_setblocking, METH_O,
30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      setblocking_doc},
30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"settimeout",    (PyCFunction)sock_settimeout, METH_O,
30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      settimeout_doc},
30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gettimeout",    (PyCFunction)sock_gettimeout, METH_NOARGS,
30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      gettimeout_doc},
30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setsockopt",        (PyCFunction)sock_setsockopt, METH_VARARGS,
30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      setsockopt_doc},
30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"shutdown",          (PyCFunction)sock_shutdown, METH_O,
30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      shutdown_doc},
30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"sleeptaskw",        (PyCFunction)sock_sleeptaskw, METH_O,
30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      sleeptaskw_doc},
30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL,                      NULL}           /* sentinel */
30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* SockObject members */
30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMemberDef sock_memberlist[] = {
30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       {0},
30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Deallocate a socket object in response to the last Py_DECREF().
30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   First close the file description. */
30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_dealloc(PySocketSockObject *s)
30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_fd != -1)
30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (void) SOCKETCLOSE(s->sock_fd);
30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(s)->tp_free((PyObject *)s);
30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_repr(PySocketSockObject *s)
30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[512];
30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_SOCKET_T > SIZEOF_LONG
30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s->sock_fd > LONG_MAX) {
30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* this can occur on Win64, and actually there is a special
30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           ugly printf formatter for decimal pointer length integer
30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           printing, only bother if necessary*/
30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "no printf formatter to display "
30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "the socket descriptor in decimal");
30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(
30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf, sizeof(buf),
30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (long)s->sock_fd, s->sock_family,
30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->sock_type,
30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s->sock_proto);
30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(buf);
30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a new, uninitialized socket object. */
30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *new;
30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    new = type->tp_alloc(type, 0);
30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (new != NULL) {
30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((PySocketSockObject *)new)->sock_fd = -1;
30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((PySocketSockObject *)new)->sock_timeout = -1.0;
30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ((PySocketSockObject *)new)->errorhandler = &set_error;
30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return new;
30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Initialize a new socket object. */
30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySocketSockObject *s = (PySocketSockObject *)self;
30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T fd;
30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int family = AF_INET, type = SOCK_STREAM, proto = 0;
30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *keywords[] = {"family", "type", "proto", 0};
30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwds,
31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     "|iii:socket", keywords,
31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &family, &type, &proto))
31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fd = socket(family, type, proto);
31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fd == INVALID_SOCKET)
31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fd < 0)
31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_error();
31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    init_sockobject(s, fd, family, type, proto);
31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Type object for socket objects. */
31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject sock_type = {
31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(0, 0)         /* Must fill in type value later */
31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "_socket.socket",                           /* tp_name */
31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(PySocketSockObject),                 /* tp_basicsize */
31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_itemsize */
31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (destructor)sock_dealloc,                   /* tp_dealloc */
31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_print */
31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getattr */
31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattr */
31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_compare */
31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (reprfunc)sock_repr,                        /* tp_repr */
31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_number */
31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_sequence */
31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_mapping */
31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_hash */
31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_call */
31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_str */
31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,                    /* tp_getattro */
31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_setattro */
31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_as_buffer */
31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_doc,                                   /* tp_doc */
31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_traverse */
31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_clear */
31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_richcompare */
31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_weaklistoffset */
31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iter */
31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_iternext */
31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_methods,                               /* tp_methods */
31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_memberlist,                            /* tp_members */
31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_getset */
31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_base */
31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dict */
31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_get */
31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_descr_set */
31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                          /* tp_dictoffset */
31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_initobj,                               /* tp_init */
31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyType_GenericAlloc,                        /* tp_alloc */
31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_new,                                   /* tp_new */
31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_Del,                               /* tp_free */
31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to gethostname(). */
31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_gethostname(PyObject *self, PyObject *unused)
31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[1024];
31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int res;
31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = gethostname(buf, (int) sizeof buf - 1);
31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res < 0)
31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return set_error();
31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    buf[sizeof buf - 1] = '\0';
31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(buf);
31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gethostname_doc,
31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gethostname() -> string\n\
31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current host name.");
31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to gethostbyname(name). */
31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_gethostbyname(PyObject *self, PyObject *args)
31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sock_addr_t addrbuf;
32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (setipaddr(name, SAS2SA(&addrbuf),  sizeof(addrbuf), AF_INET) < 0)
32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gethostbyname_doc,
32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gethostbyname(host) -> address\n\
32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the IP address (a string of the form '255.255.255.255') for a host.");
32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Convenience function common to gethostbyname_ex and gethostbyaddr */
32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char **pch;
32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *rtn_tuple = (PyObject *)NULL;
32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *name_list = (PyObject *)NULL;
32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *addr_list = (PyObject *)NULL;
32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tmp;
32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (h == NULL) {
32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Let's get real error message to return */
32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef RISCOS
32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_herror(h_errno);
32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "host not found");
32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (h->h_addrtype != af) {
32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Let's get real error message to return */
32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        (char *)strerror(EAFNOSUPPORT));
32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (af) {
32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (alen < sizeof(struct sockaddr_in))
32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (alen < sizeof(struct sockaddr_in6))
32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((name_list = PyList_New(0)) == NULL)
32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto err;
32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((addr_list = PyList_New(0)) == NULL)
32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto err;
32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* SF #1511317: h_aliases can be NULL */
32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (h->h_aliases) {
32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (pch = h->h_aliases; *pch != NULL; pch++) {
32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int status;
32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tmp = PyString_FromString(*pch);
32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (tmp == NULL)
32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto err;
32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            status = PyList_Append(name_list, tmp);
32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(tmp);
32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (status)
32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto err;
32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (pch = h->h_addr_list; *pch != NULL; pch++) {
32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int status;
32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (af) {
32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case AF_INET:
32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            {
32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_in sin;
32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memset(&sin, 0, sizeof(sin));
32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sin.sin_family = af;
32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKADDR_SA_LEN
32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sin.sin_len = sizeof(sin);
32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (pch == h->h_addr_list && alen >= sizeof(sin))
32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                memcpy((char *) addr, &sin, sizeof(sin));
32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case AF_INET6:
33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            {
33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct sockaddr_in6 sin6;
33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memset(&sin6, 0, sizeof(sin6));
33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sin6.sin6_family = af;
33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKADDR_SA_LEN
33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sin6.sin6_len = sizeof(sin6);
33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tmp = makeipaddr((struct sockaddr *)&sin6,
33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sizeof(sin6));
33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (pch == h->h_addr_list && alen >= sizeof(sin6))
33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                memcpy((char *) addr, &sin6, sizeof(sin6));
33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:                /* can't happen */
33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "unsupported address family");
33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (tmp == NULL)
33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto err;
33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        status = PyList_Append(addr_list, tmp);
33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(tmp);
33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (status)
33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto err;
33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err:
33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(name_list);
33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(addr_list);
33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return rtn_tuple;
33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to gethostbyname_ex(name). */
33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_gethostbyname_ex(PyObject *self, PyObject *args)
33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent *h;
33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr_storage addr;
33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr_in addr;
33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr *sa;
33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *ret;
33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R
33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent hp_allocated;
33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent_data data;
33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[16384];
33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int buf_len = (sizeof buf) - 1;
33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int errnop;
33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_GETHOSTBYNAME_R */
33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R
33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if   defined(HAVE_GETHOSTBYNAME_R_6_ARG)
33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             &h, &errnop);
33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset((void *) &data, '\0', sizeof(data));
33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = gethostbyname_r(name, &hp_allocated, &data);
33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = (result != 0) ? NULL : &hp_allocated;
33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* not HAVE_GETHOSTBYNAME_R */
33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_GETHOSTBYNAME_LOCK
33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_acquire_lock(netdb_lock, 1);
33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = gethostbyname(name);
33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_GETHOSTBYNAME_R */
33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Some C libraries would require addr.__ss_family instead of
33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       addr.ss_family.
34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       Therefore, we cast the sockaddr_storage into sockaddr to
34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       access sa_family. */
34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sa = (struct sockaddr*)&addr;
34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         sa->sa_family);
34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_GETHOSTBYNAME_LOCK
34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_release_lock(netdb_lock);
34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(ghbn_ex_doc,
34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the true host name, a list of aliases, and a list of IP addresses,\n\
34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor a host.  The host argument is a string giving a host name or IP number.");
34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to gethostbyaddr(IP). */
34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_gethostbyaddr(PyObject *self, PyObject *args)
34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr_storage addr;
34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr_in addr;
34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct sockaddr *sa = (struct sockaddr *)&addr;
34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *ip_num;
34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent *h;
34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *ret;
34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R
34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent hp_allocated;
34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct hostent_data data;
34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* glibcs up to 2.10 assume that the buf argument to
34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       does not ensure. The attribute below instructs the compiler
34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       to maintain this alignment. */
34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[16384] Py_ALIGNED(8);
34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int buf_len = (sizeof buf) - 1;
34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int errnop;
34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_GETHOSTBYNAME_R */
34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *ap;
34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int al;
34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int af;
34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    af = AF_UNSPEC;
34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    af = sa->sa_family;
34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ap = NULL;
34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (af) {
34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "unsupported address family");
34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GETHOSTBYNAME_R
34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if   defined(HAVE_GETHOSTBYNAME_R_6_ARG)
34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = gethostbyaddr_r(ap, al, af,
34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        &hp_allocated, buf, buf_len,
34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        &h, &errnop);
34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = gethostbyaddr_r(ap, al, af,
34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        &hp_allocated, buf, buf_len, &errnop);
34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset((void *) &data, '\0', sizeof(data));
34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = (result != 0) ? NULL : &hp_allocated;
34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* not HAVE_GETHOSTBYNAME_R */
34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_GETHOSTBYNAME_LOCK
34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_acquire_lock(netdb_lock, 1);
34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    h = gethostbyaddr(ap, al, af);
34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_GETHOSTBYNAME_R */
34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_GETHOSTBYNAME_LOCK
34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_release_lock(netdb_lock);
35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gethostbyaddr_doc,
35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the true host name, a list of aliases, and a list of IP addresses,\n\
35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor a host.  The host argument is a string giving a host name or IP number.");
35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to getservbyname(name).
35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This only returns the port number, since the other info is already
35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   known or not useful (like the list of aliases). */
35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getservbyname(PyObject *self, PyObject *args)
35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name, *proto=NULL;
35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct servent *sp;
35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sp = getservbyname(name, proto);
35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sp == NULL) {
35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "service/proto not found");
35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) ntohs(sp->s_port));
35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getservbyname_doc,
35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getservbyname(servicename[, protocolname]) -> integer\n\
35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a port number from a service name and protocol name.\n\
35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe optional protocol name, if given, should be 'tcp' or 'udp',\n\
35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmotherwise any protocol will match.");
35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to getservbyport(port).
35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This only returns the service name, since the other info is already
35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   known or not useful (like the list of aliases). */
35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getservbyport(PyObject *self, PyObject *args)
35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int port;
35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *proto=NULL;
35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct servent *sp;
35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (port < 0 || port > 0xffff) {
35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyExc_OverflowError,
35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "getservbyport: port must be 0-65535.");
35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
35604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
35614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sp = getservbyport(htons((short)port), proto);
35624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
35634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sp == NULL) {
35644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "port/proto not found");
35654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
35674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(sp->s_name);
35684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getservbyport_doc,
35714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getservbyport(port[, protocolname]) -> string\n\
35724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
35734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the service name from a port number and protocol name.\n\
35744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe optional protocol name, if given, should be 'tcp' or 'udp',\n\
35754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmotherwise any protocol will match.");
35764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to getprotobyname(name).
35784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This only returns the protocol number, since the other info is
35794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   already known or not useful (like the list of aliases). */
35804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
35824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getprotobyname(PyObject *self, PyObject *args)
35844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
35864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct protoent *sp;
35874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __BEOS__
35884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Not available in BeOS yet. - [cjh] */
35894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(socket_error, "getprotobyname not supported");
35904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
35914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
35924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
35934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
35954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sp = getprotobyname(name);
35964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
35974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sp == NULL) {
35984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "protocol not found");
35994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
36004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
36014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long) sp->p_proto);
36024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
36034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
36044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getprotobyname_doc,
36064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getprotobyname(name) -> integer\n\
36074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
36084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the protocol number for the named protocol.  (Rarely used.)");
36094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKETPAIR
36124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a pair of sockets using the socketpair() function.
36134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Arguments as for socket() except the default family is AF_UNIX if
36144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   defined on the platform; otherwise, the default is AF_INET. */
36154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
36174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
36184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_socketpair(PyObject *self, PyObject *args)
36194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
36204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySocketSockObject *s0 = NULL, *s1 = NULL;
36214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T sv[2];
36224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int family, type = SOCK_STREAM, proto = 0;
36234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res = NULL;
36244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_UNIX)
36264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    family = AF_UNIX;
36274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
36284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    family = AF_INET;
36294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
36304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|iii:socketpair",
36314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &family, &type, &proto))
36324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
36334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Create a pair of socket fds */
36344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (socketpair(family, type, proto, sv) < 0)
36354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return set_error();
36364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s0 = new_sockobject(sv[0], family, type, proto);
36374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s0 == NULL)
36384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto finally;
36394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s1 = new_sockobject(sv[1], family, type, proto);
36404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s1 == NULL)
36414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto finally;
36424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyTuple_Pack(2, s0, s1);
36434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally:
36454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res == NULL) {
36464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s0 == NULL)
36474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            SOCKETCLOSE(sv[0]);
36484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s1 == NULL)
36494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            SOCKETCLOSE(sv[1]);
36504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
36514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(s0);
36524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(s1);
36534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
36544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
36554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(socketpair_doc,
36574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
36584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
36594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmCreate a pair of socket objects from the sockets returned by the platform\n\
36604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocketpair() function.\n\
36614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe arguments are the same as for socket() except the default family is\n\
36624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
36634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_SOCKETPAIR */
36654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
36684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create a socket object from a numeric file description.
36694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Useful e.g. if stdin is a socket.
36704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Additional arguments as for socket(). */
36714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
36734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
36744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_fromfd(PyObject *self, PyObject *args)
36754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
36764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySocketSockObject *s;
36774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SOCKET_T fd;
36784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int family, type, proto = 0;
36794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "iii|i:fromfd",
36804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &fd, &family, &type, &proto))
36814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
36824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Dup the fd so it and the socket can be closed independently */
36834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fd = dup(fd);
36844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fd < 0)
36854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return set_error();
36864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = new_sockobject(fd, family, type, proto);
36874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *) s;
36884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
36894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(fromfd_doc,
36914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"fromfd(fd, family, type[, proto]) -> socket object\n\
36924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
36934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmCreate a socket object from a duplicate of the given\n\
36944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfile descriptor.\n\
36954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe remaining arguments are the same as for socket().");
36964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* NO_DUP */
36984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
36994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_ntohs(PyObject *self, PyObject *args)
37024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int x1, x2;
37044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
37064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x1 < 0) {
37094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
37104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "can't convert negative number to unsigned long");
37114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x2 = (unsigned int)ntohs((unsigned short)x1);
37144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(x2);
37154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(ntohs_doc,
37184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"ntohs(integer) -> integer\n\
37194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
37204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert a 16-bit integer from network to host byte order.");
37214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_ntohl(PyObject *self, PyObject *arg)
37254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long x;
37274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyInt_Check(arg)) {
37294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyInt_AS_LONG(arg);
37304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
37314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
37324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((long)x < 0) {
37334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_OverflowError,
37344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              "can't convert negative number to unsigned long");
37354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
37364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
37374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyLong_Check(arg)) {
37394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyLong_AsUnsignedLong(arg);
37404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
37414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
37424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_LONG > 4
37434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
37444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            unsigned long y;
37454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* only want the trailing 32 bits */
37464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            y = x & 0xFFFFFFFFUL;
37474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (y ^ x)
37484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_Format(PyExc_OverflowError,
37494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "long int larger than 32 bits");
37504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x = y;
37514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
37524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
37534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
37554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_Format(PyExc_TypeError,
37564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "expected int/long, %s found",
37574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_TYPE(arg)->tp_name);
37584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x == (unsigned long) -1 && PyErr_Occurred())
37594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong(ntohl(x));
37614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(ntohl_doc,
37644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"ntohl(integer) -> integer\n\
37654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
37664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert a 32-bit integer from network to host byte order.");
37674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_htons(PyObject *self, PyObject *args)
37714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int x1, x2;
37734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
37754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (x1 < 0) {
37784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_OverflowError,
37794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "can't convert negative number to unsigned long");
37804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
37814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
37824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x2 = (unsigned int)htons((unsigned short)x1);
37834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(x2);
37844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
37854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(htons_doc,
37874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"htons(integer) -> integer\n\
37884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
37894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert a 16-bit integer from host to network byte order.");
37904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
37934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_htonl(PyObject *self, PyObject *arg)
37944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
37954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long x;
37964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
37974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyInt_Check(arg)) {
37984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyInt_AS_LONG(arg);
37994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
38004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
38014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((long)x < 0) {
38024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_OverflowError,
38034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              "can't convert negative number to unsigned long");
38044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
38054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
38064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
38074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyLong_Check(arg)) {
38084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyLong_AsUnsignedLong(arg);
38094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (x == (unsigned long) -1 && PyErr_Occurred())
38104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
38114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_LONG > 4
38124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
38134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            unsigned long y;
38144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* only want the trailing 32 bits */
38154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            y = x & 0xFFFFFFFFUL;
38164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (y ^ x)
38174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyErr_Format(PyExc_OverflowError,
38184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "long int larger than 32 bits");
38194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x = y;
38204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
38214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
38234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
38244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_Format(PyExc_TypeError,
38254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "expected int/long, %s found",
38264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            Py_TYPE(arg)->tp_name);
38274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong(htonl((unsigned long)x));
38284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
38294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(htonl_doc,
38314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"htonl(integer) -> integer\n\
38324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
38334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert a 32-bit integer from host to network byte order.");
38344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* socket.inet_aton() and socket.inet_ntoa() functions. */
38364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(inet_aton_doc,
38384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"inet_aton(string) -> packed 32-bit IP representation\n\
38394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
38404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
38414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbinary format used in low-level network functions.");
38424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
38444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_inet_aton(PyObject *self, PyObject *args)
38454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
38464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef INADDR_NONE
38474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INADDR_NONE (-1)
38484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INET_ATON
38504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct in_addr buf;
38514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
38544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (SIZEOF_INT != 4)
38554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#error "Not sure if in_addr_t exists and int is not 32-bits."
38564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Have to use inet_addr() instead */
38584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned int packed_addr;
38594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *ip_addr;
38614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
38634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
38644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INET_ATON
38674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_INET_ATON_WEAKLINK
38694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (inet_aton != NULL) {
38704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (inet_aton(ip_addr, &buf))
38724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize((char *)(&buf),
38734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                          sizeof(buf));
38744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(socket_error,
38764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "illegal IP address string passed to inet_aton");
38774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
38784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_INET_ATON_WEAKLINK
38804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   } else {
38814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
38844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
38864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* special-case this address as inet_addr might return INADDR_NONE
38884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * for this */
38894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp(ip_addr, "255.255.255.255") == 0) {
38904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        packed_addr = 0xFFFFFFFF;
38914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
38924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        packed_addr = inet_addr(ip_addr);
38944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
38954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (packed_addr == INADDR_NONE) {               /* invalid address */
38964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
38974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "illegal IP address string passed to inet_aton");
38984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
38994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
39004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromStringAndSize((char *) &packed_addr,
39024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      sizeof(packed_addr));
39034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_INET_ATON_WEAKLINK
39054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   }
39064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
39074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
39094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(inet_ntoa_doc,
39124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"inet_ntoa(packed_ip) -> ip_address_string\n\
39134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
39144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert an IP address from 32-bit packed binary format to string format");
39154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
39174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_inet_ntoa(PyObject *self, PyObject *args)
39184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *packed_str;
39204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int addr_len;
39214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct in_addr packed_addr;
39224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
39244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (addr_len != sizeof(packed_addr)) {
39284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
39294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "packed IP wrong length for inet_ntoa");
39304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memcpy(&packed_addr, packed_str, addr_len);
39344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(inet_ntoa(packed_addr));
39364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INET_PTON
39394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(inet_pton_doc,
39414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"inet_pton(af, ip) -> packed IP address string\n\
39424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
39434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert an IP address from string format to a packed string suitable\n\
39444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor use with low-level network functions.");
39454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
39474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_inet_pton(PyObject *self, PyObject *args)
39484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int af;
39504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char* ip;
39514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int retval;
39524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
39534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
39544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
39554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char packed[sizeof(struct in_addr)];
39564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
39574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
39584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(ENABLE_IPV6) && defined(AF_INET6)
39624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if(af == AF_INET6) {
39634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
39644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "can't use AF_INET6, IPv6 is disabled");
39654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
39684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    retval = inet_pton(af, ip, packed);
39704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (retval < 0) {
39714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetFromErrno(socket_error);
39724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (retval == 0) {
39744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
39754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "illegal IP address string passed to inet_pton");
39764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (af == AF_INET) {
39784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(packed,
39794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sizeof(struct in_addr));
39804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
39814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (af == AF_INET6) {
39824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromStringAndSize(packed,
39834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sizeof(struct in6_addr));
39844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
39854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
39864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "unknown address family");
39874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
39884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
39894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
39904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(inet_ntop_doc,
39924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"inet_ntop(af, packed_ip) -> string formatted IP address\n\
39934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
39944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConvert a packed IP address of the given family to string format.");
39954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
39964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
39974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_inet_ntop(PyObject *self, PyObject *args)
39984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
39994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int af;
40004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char* packed;
40014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len;
40024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char* retval;
40034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
40044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
40054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
40064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char ip[INET_ADDRSTRLEN + 1];
40074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
40084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Guarantee NUL-termination for PyString_FromString() below */
40104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset((void *) &ip[0], '\0', sizeof(ip));
40114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
40134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (af == AF_INET) {
40174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (len != sizeof(struct in_addr)) {
40184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError,
40194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "invalid length of packed IP address string");
40204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
40214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
40224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
40234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (af == AF_INET6) {
40244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (len != sizeof(struct in6_addr)) {
40254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError,
40264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "invalid length of packed IP address string");
40274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
40284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
40294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
40304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
40314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_ValueError,
40324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "unknown address family %d", af);
40334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    retval = inet_ntop(af, packed, ip, sizeof(ip));
40374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!retval) {
40384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetFromErrno(socket_error);
40394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
40414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString(retval);
40424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* NOTREACHED */
40454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
40464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
40474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
40484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_INET_PTON */
40504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to getaddrinfo(host, port). */
40524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
40544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
40554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getaddrinfo(PyObject *self, PyObject *args)
40564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
40574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct addrinfo hints, *res;
40584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct addrinfo *res0 = NULL;
40594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *hobj = NULL;
40604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *pobj = (PyObject *)NULL;
40614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char pbuf[30];
40624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *hptr, *pptr;
40634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int family, socktype, protocol, flags;
40644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int error;
40654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *all = (PyObject *)NULL;
40664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *single = (PyObject *)NULL;
40674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *idna = NULL;
40684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
40694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    family = socktype = protocol = flags = 0;
40704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    family = AF_UNSPEC;
40714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
40724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &hobj, &pobj, &family, &socktype,
40734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &protocol, &flags)) {
40744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (hobj == Py_None) {
40774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hptr = NULL;
40784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyUnicode_Check(hobj)) {
40794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
40804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!idna)
40814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
40824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hptr = PyString_AsString(idna);
40834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyString_Check(hobj)) {
40844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        hptr = PyString_AsString(hobj);
40854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
40864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
40874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "getaddrinfo() argument 1 must be string or None");
40884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
40894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
40904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyInt_Check(pobj)) {
40914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
40924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pptr = pbuf;
40934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyString_Check(pobj)) {
40944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pptr = PyString_AsString(pobj);
40954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (pobj == Py_None) {
40964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pptr = (char *)NULL;
40974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
40984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error, "Int or String expected");
40994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto err;
41004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&hints, 0, sizeof(hints));
41024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_family = family;
41034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_socktype = socktype;
41044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_protocol = protocol;
41054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_flags = flags;
41064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
41074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ACQUIRE_GETADDRINFO_LOCK
41084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error = getaddrinfo(hptr, pptr, &hints, &res0);
41094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
41104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */
41114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
41124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_gaierror(error);
41134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto err;
41144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((all = PyList_New(0)) == NULL)
41174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto err;
41184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (res = res0; res; res = res->ai_next) {
41194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *addr =
41204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
41214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (addr == NULL)
41224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto err;
41234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        single = Py_BuildValue("iiisO", res->ai_family,
41244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res->ai_socktype, res->ai_protocol,
41254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res->ai_canonname ? res->ai_canonname : "",
41264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            addr);
41274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(addr);
41284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (single == NULL)
41294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto err;
41304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyList_Append(all, single))
41324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto err;
41334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(single);
41344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(idna);
41364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res0)
41374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        freeaddrinfo(res0);
41384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return all;
41394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err:
41404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(single);
41414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(all);
41424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(idna);
41434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res0)
41444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        freeaddrinfo(res0);
41454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)NULL;
41464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
41474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getaddrinfo_doc,
41494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
41504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    -> list of (family, socktype, proto, canonname, sockaddr)\n\
41514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
41524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmResolve host and port into addrinfo struct.");
41534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interface to getnameinfo(sa, flags). */
41554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*ARGSUSED*/
41574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
41584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getnameinfo(PyObject *self, PyObject *args)
41594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
41604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sa = (PyObject *)NULL;
41614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int flags;
41624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *hostp;
41634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int port, flowinfo, scope_id;
41644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
41654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct addrinfo hints, *res = NULL;
41664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int error;
41674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *ret = (PyObject *)NULL;
41684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
41694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    flags = flowinfo = scope_id = 0;
41704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
41714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
41724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyTuple_Check(sa)) {
41734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError,
41744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "getnameinfo() argument 1 must be a tuple");
41754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
41764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(sa, "si|ii",
41784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &hostp, &port, &flowinfo, &scope_id))
41794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
41804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
41814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&hints, 0, sizeof(hints));
41824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_family = AF_UNSPEC;
41834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hints.ai_socktype = SOCK_DGRAM;     /* make numeric port happy */
41844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
41854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ACQUIRE_GETADDRINFO_LOCK
41864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error = getaddrinfo(hostp, pbuf, &hints, &res);
41874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
41884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */
41894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
41904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_gaierror(error);
41914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto fail;
41924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res->ai_next) {
41944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(socket_error,
41954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "sockaddr resolved to multiple addresses");
41964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto fail;
41974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
41984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (res->ai_family) {
41994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET:
42004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
42014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyTuple_GET_SIZE(sa) != 2) {
42024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(socket_error,
42034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                "IPv4 sockaddr must be 2 tuple");
42044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto fail;
42054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
42064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
42074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
42084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
42094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case AF_INET6:
42104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
42114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct sockaddr_in6 *sin6;
42124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin6 = (struct sockaddr_in6 *)res->ai_addr;
42134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin6->sin6_flowinfo = flowinfo;
42144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sin6->sin6_scope_id = scope_id;
42154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
42164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
42174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
42184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error = getnameinfo(res->ai_addr, res->ai_addrlen,
42204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
42214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
42224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        set_gaierror(error);
42234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto fail;
42244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = Py_BuildValue("ss", hbuf, pbuf);
42264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfail:
42284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res)
42294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        freeaddrinfo(res);
42304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
42314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
42324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getnameinfo_doc,
42344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getnameinfo(sockaddr, flags) --> (host, port)\n\
42354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
42364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmGet host and port for a sockaddr.");
42374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python API to getting and setting the default timeout value. */
42404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
42424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_getdefaulttimeout(PyObject *self)
42434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
42444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (defaulttimeout < 0.0) {
42454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_None);
42464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_None;
42474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
42494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyFloat_FromDouble(defaulttimeout);
42504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
42514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getdefaulttimeout_doc,
42534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getdefaulttimeout() -> timeout\n\
42544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
42554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturns the default timeout in floating seconds for new socket objects.\n\
42564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA value of None indicates that new socket objects have no timeout.\n\
42574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWhen the socket module is first imported, the default is None.");
42584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
42604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsocket_setdefaulttimeout(PyObject *self, PyObject *arg)
42614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
42624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    double timeout;
42634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (arg == Py_None)
42654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = -1.0;
42664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
42674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        timeout = PyFloat_AsDouble(arg);
42684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (timeout < 0.0) {
42694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyErr_Occurred())
42704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_ValueError,
42714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "Timeout value out of range");
42724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
42734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
42744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
42754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    defaulttimeout = timeout;
42774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
42794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
42804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
42814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setdefaulttimeout_doc,
42834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setdefaulttimeout(timeout)\n\
42844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
42854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the default timeout in floating seconds for new socket objects.\n\
42864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmA value of None indicates that new socket objects have no timeout.\n\
42874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWhen the socket module is first imported, the default is None.");
42884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* List of functions exported by this module. */
42914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
42924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef socket_methods[] = {
42934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gethostbyname",           socket_gethostbyname,
42944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, gethostbyname_doc},
42954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gethostbyname_ex",        socket_gethostbyname_ex,
42964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, ghbn_ex_doc},
42974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gethostbyaddr",           socket_gethostbyaddr,
42984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, gethostbyaddr_doc},
42994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gethostname",             socket_gethostname,
43004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS,  gethostname_doc},
43014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getservbyname",           socket_getservbyname,
43024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, getservbyname_doc},
43034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getservbyport",           socket_getservbyport,
43044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, getservbyport_doc},
43054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getprotobyname",          socket_getprotobyname,
43064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, getprotobyname_doc},
43074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef NO_DUP
43084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"fromfd",                  socket_fromfd,
43094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, fromfd_doc},
43104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
43114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SOCKETPAIR
43124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"socketpair",              socket_socketpair,
43134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, socketpair_doc},
43144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
43154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"ntohs",                   socket_ntohs,
43164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, ntohs_doc},
43174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"ntohl",                   socket_ntohl,
43184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_O, ntohl_doc},
43194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"htons",                   socket_htons,
43204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, htons_doc},
43214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"htonl",                   socket_htonl,
43224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_O, htonl_doc},
43234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"inet_aton",               socket_inet_aton,
43244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, inet_aton_doc},
43254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"inet_ntoa",               socket_inet_ntoa,
43264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, inet_ntoa_doc},
43274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INET_PTON
43284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"inet_pton",               socket_inet_pton,
43294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, inet_pton_doc},
43304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"inet_ntop",               socket_inet_ntop,
43314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, inet_ntop_doc},
43324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
43334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getaddrinfo",             socket_getaddrinfo,
43344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, getaddrinfo_doc},
43354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getnameinfo",             socket_getnameinfo,
43364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, getnameinfo_doc},
43374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getdefaulttimeout",       (PyCFunction)socket_getdefaulttimeout,
43384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, getdefaulttimeout_doc},
43394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setdefaulttimeout",       socket_setdefaulttimeout,
43404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_O, setdefaulttimeout_doc},
43414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL,                      NULL}            /* Sentinel */
43424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
43434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
43464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define OS_INIT_DEFINED
43474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
43494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmos_init(void)
43504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
43514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _kernel_swi_regs r;
43524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    r.r[0] = 0;
43544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _kernel_swi(0x43380, &r, &r);
43554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    taskwindow = r.r[0];
43564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
43584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
43594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* RISCOS */
43614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
43644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define OS_INIT_DEFINED
43654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Additional initialization and cleanup for Windows */
43674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
43694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmos_cleanup(void)
43704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
43714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    WSACleanup();
43724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
43734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
43744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
43754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmos_init(void)
43764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
43774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    WSADATA WSAData;
43784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int ret;
43794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[100];
43804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ret = WSAStartup(0x0101, &WSAData);
43814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (ret) {
43824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case 0:     /* No error */
43834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_AtExit(os_cleanup);
43844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1; /* Success */
43854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case WSASYSNOTREADY:
43864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ImportError,
43874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "WSAStartup failed: network not ready");
43884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
43894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case WSAVERNOTSUPPORTED:
43904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case WSAEINVAL:
43914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
43924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyExc_ImportError,
43934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "WSAStartup failed: requested version not supported");
43944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
43954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
43964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, sizeof(buf),
43974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "WSAStartup failed: error code %d", ret);
43984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ImportError, buf);
43994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break;
44004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
44014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0; /* Failure */
44024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
44034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
44054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PYOS_OS2
44084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define OS_INIT_DEFINED
44094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Additional initialization for OS/2 */
44114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
44134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmos_init(void)
44144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
44154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PYCC_GCC
44164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char reason[64];
44174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int rc = sock_init();
44184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (rc == 0) {
44204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1; /* Success */
44214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
44224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(reason, sizeof(reason),
44244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  "OS/2 TCP/IP Error# %d", sock_errno());
44254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_ImportError, reason);
44264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;  /* Failure */
44284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
44294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* No need to initialize sockets with GCC/EMX */
44304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1; /* Success */
44314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
44324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
44334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* PYOS_OS2 */
44354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef OS_INIT_DEFINED
44384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
44394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmos_init(void)
44404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
44414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1; /* Success */
44424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
44434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
44444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* C API table - always add new things to the end for binary
44474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   compatibility. */
44484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic
44494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySocketModule_APIObject PySocketModuleAPI =
44504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
44514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &sock_type,
44524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    NULL
44534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
44544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Initialize the _socket module.
44574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This module is actually called "_socket", and there's a wrapper
44594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   "socket.py" which implements some additional functionality.  On some
44604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   platforms (e.g. Windows and OS/2), socket.py also implements a
44614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   wrapper for the socket type that provides missing functionality such
44624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   as makefile(), dup() and fromfd().  The import of "_socket" may fail
44634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   with an ImportError exception if os-specific initialization fails.
44644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   On Windows, this does WINSOCK initialization.  When WINSOCK is
44654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   initialized successfully, a call to WSACleanup() is scheduled to be
44664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   made at exit time.
44674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
44684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(socket_doc,
44704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Implementation module for socket operations.\n\
44714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
44724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee the socket module for documentation.");
44734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC
44754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminit_socket(void)
44764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
44774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m, *has_ipv6;
44784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!os_init())
44804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
44814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(&sock_type) = &PyType_Type;
44834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = Py_InitModule3(PySocket_MODULE_NAME,
44844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       socket_methods,
44854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       socket_doc);
44864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
44874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
44884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socket_error = PyErr_NewException("socket.error",
44904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      PyExc_IOError, NULL);
44914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (socket_error == NULL)
44924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
44934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySocketModuleAPI.error = socket_error;
44944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(socket_error);
44954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "error", socket_error);
44964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socket_herror = PyErr_NewException("socket.herror",
44974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                       socket_error, NULL);
44984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (socket_herror == NULL)
44994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(socket_herror);
45014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "herror", socket_herror);
45024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
45034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NULL);
45044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (socket_gaierror == NULL)
45054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(socket_gaierror);
45074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "gaierror", socket_gaierror);
45084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    socket_timeout = PyErr_NewException("socket.timeout",
45094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        socket_error, NULL);
45104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (socket_timeout == NULL)
45114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(socket_timeout);
45134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "timeout", socket_timeout);
45144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF((PyObject *)&sock_type);
45154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyModule_AddObject(m, "SocketType",
45164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           (PyObject *)&sock_type) != 0)
45174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF((PyObject *)&sock_type);
45194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyModule_AddObject(m, "socket",
45204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           (PyObject *)&sock_type) != 0)
45214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef ENABLE_IPV6
45244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    has_ipv6 = Py_True;
45254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
45264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    has_ipv6 = Py_False;
45274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(has_ipv6);
45294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "has_ipv6", has_ipv6);
45304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Export C API */
45324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyModule_AddObject(m, PySocket_CAPI_NAME,
45334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
45344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             ) != 0)
45354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
45364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
45374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Address families (we only support AF_INET and AF_UNIX) */
45384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_UNSPEC
45394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
45404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_INET", AF_INET);
45424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_INET6
45434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
45444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_INET6 */
45454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(AF_UNIX)
45464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
45474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_UNIX */
45484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_AX25
45494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Amateur Radio AX.25 */
45504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
45514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_IPX
45534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
45544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_APPLETALK
45564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Appletalk DDP */
45574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
45584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_NETROM
45604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Amateur radio NetROM */
45614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
45624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_BRIDGE
45644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Multiprotocol bridge */
45654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
45664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ATMPVC
45684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* ATM PVCs */
45694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
45704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_AAL5
45724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Reserved for Werner's ATM */
45734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
45744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_X25
45764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Reserved for X.25 project */
45774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_X25", AF_X25);
45784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_INET6
45804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
45814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ROSE
45834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Amateur Radio X.25 PLP */
45844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
45854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_DECnet
45874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Reserved for DECnet project */
45884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
45894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_NETBEUI
45914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Reserved for 802.2LLC project */
45924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
45934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_SECURITY
45954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Security callback pseudo AF */
45964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
45974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
45984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_KEY
45994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* PF_KEY key management API */
46004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
46014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_NETLINK
46034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*  */
46044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
46054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
46064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_SKIP
46074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
46084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_W1
46104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
46114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
46134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
46144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_TCPDIAG
46154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
46164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_NFLOG
46184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
46194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_XFRM
46214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
46224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_ARPD
46244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
46254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_ROUTE6
46274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
46284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
46304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_DNRTMSG
46314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
46324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NETLINK_TAPBASE
46344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
46354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* AF_NETLINK */
46374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ROUTE
46384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Alias to emulate 4.4BSD */
46394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
46404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ASH
46424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Ash */
46434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
46444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ECONET
46464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Acorn Econet */
46474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
46484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_ATMSVC
46504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* ATM SVCs */
46514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
46524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_SNA
46544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Linux SNA Project (nutters!) */
46554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
46564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_IRDA
46584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* IRDA sockets */
46594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
46604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_PPPOX
46624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* PPPoX sockets */
46634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
46644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_WANPIPE
46664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Wanpipe API Sockets */
46674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
46684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_LLC
46704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Linux LLC */
46714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
46724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_BLUETOOTH
46754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
46764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
46774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
46784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
46794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__NetBSD__) && !defined(__DragonFly__)
46804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
46814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__FreeBSD__)
46834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__NetBSD__) && !defined(__DragonFly__)
46844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
46854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
46874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
46884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
46904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
46914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
46924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
46944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AF_PACKET
46954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, AF_PACKET);
46964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
46974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PF_PACKET
46984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PF_PACKET);
46994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_HOST
47014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_HOST);
47024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_BROADCAST
47044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_BROADCAST);
47054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_MULTICAST
47074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_MULTICAST);
47084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_OTHERHOST
47104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_OTHERHOST);
47114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_OUTGOING
47134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_OUTGOING);
47144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_LOOPBACK
47164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_LOOPBACK);
47174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PACKET_FASTROUTE
47194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntMacro(m, PACKET_FASTROUTE);
47204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LINUX_TIPC_H
47234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
47244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* for addresses */
47264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
47274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
47284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
47294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
47314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
47324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
47334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* for setsockopt() */
47354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
47364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
47374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
47384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
47394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TIPC_DEST_DROPPABLE);
47404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
47414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
47434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TIPC_LOW_IMPORTANCE);
47444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
47454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TIPC_MEDIUM_IMPORTANCE);
47464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
47474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TIPC_HIGH_IMPORTANCE);
47484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
47494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TIPC_CRITICAL_IMPORTANCE);
47504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* for subscriptions */
47524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
47534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
47544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef TIPC_SUB_CANCEL
47554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* doesn't seem to be available everywhere */
47564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
47574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
47594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
47604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
47614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
47624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
47634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
47644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Socket types */
47674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
47684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
47694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef __BEOS__
47704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* We have incomplete socket support. */
47714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
47724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
47734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(SOCK_RDM)
47744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
47754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_DEBUG
47794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
47804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_ACCEPTCONN
47824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
47834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_REUSEADDR
47854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
47864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SO_EXCLUSIVEADDRUSE
47884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
47894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
47914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_KEEPALIVE
47924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
47934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_DONTROUTE
47954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
47964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
47974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_BROADCAST
47984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
47994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_USELOOPBACK
48014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
48024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_LINGER
48044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
48054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_OOBINLINE
48074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
48084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_REUSEPORT
48104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
48114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_SNDBUF
48134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
48144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_RCVBUF
48164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
48174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_SNDLOWAT
48194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
48204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_RCVLOWAT
48224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
48234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_SNDTIMEO
48254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
48264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_RCVTIMEO
48284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
48294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_ERROR
48314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
48324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SO_TYPE
48344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
48354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SO_SETFIB
48374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
48384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
48404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Maximum number of connections for "listen" */
48414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOMAXCONN
48424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
48434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
48444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
48454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
48474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Flags for send, recv */
48484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_OOB
48494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
48504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_PEEK
48524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
48534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_DONTROUTE
48554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
48564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_DONTWAIT
48584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
48594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_EOR
48614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
48624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_TRUNC
48644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
48654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_CTRUNC
48674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
48684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_WAITALL
48704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
48714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_BTAG
48734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
48744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  MSG_ETAG
48764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
48774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
48794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Protocol level and numbers, usable for [gs]etsockopt */
48804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_SOCKET
48814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
48824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_IP
48844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
48854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
48864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_IP", 0);
48874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_IPX
48894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
48904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_AX25
48924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
48934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_ATALK
48954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
48964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
48974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_NETROM
48984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
48994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_ROSE
49014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
49024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_TCP
49044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
49054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_TCP", 6);
49074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  SOL_UDP
49094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
49104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SOL_UDP", 17);
49124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IP
49144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
49154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
49174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_HOPOPTS
49194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
49204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_ICMP
49224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
49234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
49254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IGMP
49274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
49284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_GGP
49304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
49314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IPV4
49334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
49344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IPV6
49364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
49374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IPIP
49394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
49404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_TCP
49424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
49434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
49454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_EGP
49474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
49484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_PUP
49504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
49514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_UDP
49534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
49544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
49554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
49564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IDP
49584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
49594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_HELLO
49614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
49624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_ND
49644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
49654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_TP
49674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
49684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IPV6
49704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
49714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_ROUTING
49734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
49744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_FRAGMENT
49764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
49774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_RSVP
49794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
49804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_GRE
49824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
49834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_ESP
49854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
49864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_AH
49884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
49894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_MOBILE
49914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
49924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_ICMPV6
49944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
49954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_NONE
49974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
49984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
49994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_DSTOPTS
50004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
50014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_XTP
50034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
50044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_EON
50064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
50074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_PIM
50094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
50104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_IPCOMP
50124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
50134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_VRRP
50154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
50164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_BIP
50184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
50194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/**/
50214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_RAW
50224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
50234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
50254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPROTO_MAX
50274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
50284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
50304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Some port configuration */
50314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPORT_RESERVED
50324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
50334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
50354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPPORT_USERRESERVED
50374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
50384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
50404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
50424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Some reserved IP v.4 addresses */
50434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_ANY
50444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
50454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
50474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_BROADCAST
50494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
50504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
50524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_LOOPBACK
50544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
50554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
50574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_UNSPEC_GROUP
50594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
50604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
50624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_ALLHOSTS_GROUP
50644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
50654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            INADDR_ALLHOSTS_GROUP);
50664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
50684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_MAX_LOCAL_GROUP
50704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
50714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            INADDR_MAX_LOCAL_GROUP);
50724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
50744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  INADDR_NONE
50764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
50774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
50784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
50794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
50814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* IPv4 [gs]etsockopt options */
50824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_OPTIONS
50834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
50844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_HDRINCL
50864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
50874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_TOS
50894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
50904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_TTL
50924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
50934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_RECVOPTS
50954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
50964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
50974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_RECVRETOPTS
50984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
50994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_RECVDSTADDR
51014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
51024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_RETOPTS
51044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
51054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_MULTICAST_IF
51074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
51084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_MULTICAST_TTL
51104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
51114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_MULTICAST_LOOP
51134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
51144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_ADD_MEMBERSHIP
51164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
51174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_DROP_MEMBERSHIP
51194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
51204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_DEFAULT_MULTICAST_TTL
51224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
51234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            IP_DEFAULT_MULTICAST_TTL);
51244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_DEFAULT_MULTICAST_LOOP
51264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
51274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            IP_DEFAULT_MULTICAST_LOOP);
51284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IP_MAX_MEMBERSHIPS
51304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
51314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
51334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* IPv6 [gs]etsockopt options, defined in RFC2553 */
51344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_JOIN_GROUP
51354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
51364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_LEAVE_GROUP
51384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
51394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_MULTICAST_HOPS
51414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
51424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_MULTICAST_IF
51444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
51454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_MULTICAST_LOOP
51474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
51484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPV6_UNICAST_HOPS
51504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
51514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Additional IPV6 socket options, defined in RFC 3493 */
51534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_V6ONLY
51544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
51554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Advanced IPV6 socket options, from RFC 3542 */
51574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_CHECKSUM
51584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
51594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_DONTFRAG
51614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
51624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_DSTOPTS
51644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
51654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_HOPLIMIT
51674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
51684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_HOPOPTS
51704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
51714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_NEXTHOP
51734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
51744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_PATHMTU
51764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
51774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_PKTINFO
51794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
51804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVDSTOPTS
51824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
51834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVHOPLIMIT
51854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
51864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVHOPOPTS
51884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
51894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVPKTINFO
51914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
51924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVRTHDR
51944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
51954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVTCLASS
51974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
51984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
51994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RTHDR
52004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
52014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RTHDRDSTOPTS
52034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
52044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RTHDR_TYPE_0
52064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
52074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_RECVPATHMTU
52094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
52104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_TCLASS
52124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
52134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef IPV6_USE_MIN_MTU
52154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
52164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
52184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* TCP options */
52194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_NODELAY
52204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
52214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_MAXSEG
52234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
52244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_CORK
52264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
52274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_KEEPIDLE
52294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
52304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_KEEPINTVL
52324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
52334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_KEEPCNT
52354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
52364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_SYNCNT
52384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
52394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_LINGER2
52414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
52424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_DEFER_ACCEPT
52444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
52454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_WINDOW_CLAMP
52474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
52484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_INFO
52504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
52514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  TCP_QUICKACK
52534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
52544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
52564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
52574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* IPX options */
52584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  IPX_TYPE
52594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
52604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
52624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* get{addr,name}info parameters */
52634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_ADDRFAMILY
52644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
52654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_AGAIN
52674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
52684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_BADFLAGS
52704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
52714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_FAIL
52734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
52744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_FAMILY
52764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
52774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_MEMORY
52794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
52804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_NODATA
52824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
52834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_NONAME
52854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
52864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_OVERFLOW
52884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
52894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_SERVICE
52914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
52924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_SOCKTYPE
52944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
52954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_SYSTEM
52974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
52984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
52994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_BADHINTS
53004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
53014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_PROTOCOL
53034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
53044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef EAI_MAX
53064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
53074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_PASSIVE
53094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
53104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_CANONNAME
53124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
53134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_NUMERICHOST
53154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
53164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_NUMERICSERV
53184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
53194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_MASK
53214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
53224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_ALL
53244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
53254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_V4MAPPED_CFG
53274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
53284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_ADDRCONFIG
53304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
53314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_V4MAPPED
53334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
53344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef AI_DEFAULT
53364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
53374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_MAXHOST
53394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
53404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_MAXSERV
53424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
53434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_NOFQDN
53454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
53464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_NUMERICHOST
53484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
53494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_NAMEREQD
53514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
53524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_NUMERICSERV
53544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
53554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef NI_DGRAM
53574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
53584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
53604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* shutdown() parameters */
53614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SHUT_RD
53624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
53634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(SD_RECEIVE)
53644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
53654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
53664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RD", 0);
53674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SHUT_WR
53694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
53704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(SD_SEND)
53714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
53724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
53734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_WR", 1);
53744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SHUT_RDWR
53764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
53774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(SD_BOTH)
53784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
53794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
53804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
53814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
53824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
53834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIO_RCVALL
53844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
53854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
53864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
53874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
53884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
53894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *tmp;
53904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tmp = PyLong_FromUnsignedLong(codes[i]);
53914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (tmp == NULL)
53924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return;
53934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyModule_AddObject(m, names[i], tmp);
53944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
53954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
53964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
53974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
53984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
53994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RCVALL_IPLEVEL
54004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
54014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
54024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RCVALL_MAX
54034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
54044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
54054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* _MSTCPIP_ */
54064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Initialize gethostbyname lock */
54084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
54094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    netdb_lock = PyThread_allocate_lock();
54104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
54114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
54124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef HAVE_INET_PTON
54154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
54164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Simplistic emulation code for inet_pton that only works for IPv4 */
54184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* These are not exposed because they do not set errno properly */
54194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
54214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminet_pton(int af, const char *src, void *dst)
54224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
54234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (af == AF_INET) {
54244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (SIZEOF_INT != 4)
54254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#error "Not sure if in_addr_t exists and int is not 32-bits."
54264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
54274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned int packed_addr;
54284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        packed_addr = inet_addr(src);
54294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (packed_addr == INADDR_NONE)
54304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
54314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(dst, &packed_addr, 4);
54324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 1;
54334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
54344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Should set errno to EAFNOSUPPORT */
54354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return -1;
54364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
54374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char *
54394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminet_ntop(int af, const void *src, char *dst, socklen_t size)
54404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
54414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (af == AF_INET) {
54424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct in_addr packed_addr;
54434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (size < 16)
54444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Should set errno to ENOSPC. */
54454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
54464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memcpy(&packed_addr, src, sizeof(packed_addr));
54474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return strncpy(dst, inet_ntoa(packed_addr), size);
54484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
54494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Should set errno to EAFNOSUPPORT */
54504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
54514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
54524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
54544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
5455