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