| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1 | /* Socket module */ | 
 | 2 |  | 
 | 3 | /* | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 5 | This module provides an interface to Berkeley socket IPC. | 
 | 6 |  | 
 | 7 | Limitations: | 
 | 8 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 9 | - Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 10 |   portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported | 
 | 11 |   under Linux. | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 12 | - No read/write operations (use sendall/recv or makefile instead). | 
 | 13 | - Additional restrictions apply on some non-Unix platforms (compensated | 
 | 14 |   for by socket.py). | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 15 |  | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 16 | Module interface: | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 17 |  | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 18 | - socket.error: exception raised for socket specific errors | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 19 | - socket.gaierror: exception raised for getaddrinfo/getnameinfo errors, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 20 |     a subclass of socket.error | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 21 | - socket.herror: exception raised for gethostby* errors, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 22 |     a subclass of socket.error | 
| Guido van Rossum | 83a072d | 2002-09-03 19:10:18 +0000 | [diff] [blame] | 23 | - socket.fromfd(fd, family, type[, proto]) --> new socket object (created | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 24 |     from an existing file descriptor) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 25 | - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd') | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 26 | - socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...]) | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 27 | - socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com') | 
| Guido van Rossum | 25405c7 | 1996-12-19 16:42:52 +0000 | [diff] [blame] | 28 | - socket.getprotobyname(protocolname) --> protocol number | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 29 | - socket.getservbyname(servicename[, protocolname]) --> port number | 
 | 30 | - socket.getservbyport(portnumber[, protocolname]) --> service name | 
| Guido van Rossum | 83a072d | 2002-09-03 19:10:18 +0000 | [diff] [blame] | 31 | - socket.socket([family[, type [, proto]]]) --> new socket object | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 32 | - socket.socketpair([family[, type [, proto]]]) --> (socket, socket) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 33 | - socket.ntohs(16 bit value) --> new int object | 
 | 34 | - socket.ntohl(32 bit value) --> new int object | 
 | 35 | - socket.htons(16 bit value) --> new int object | 
 | 36 | - socket.htonl(32 bit value) --> new int object | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 37 | - socket.getaddrinfo(host, port [, family, socktype, proto, flags]) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 38 |     --> List of (family, socktype, proto, canonname, sockaddr) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 39 | - socket.getnameinfo(sockaddr, flags) --> (host, port) | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 40 | - socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h> | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 41 | - socket.has_ipv6: boolean value indicating if IPv6 is supported | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 42 | - socket.inet_aton(IP address) -> 32-bit packed IP representation | 
 | 43 | - socket.inet_ntoa(packed IP) -> IP address string | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 44 | - socket.getdefaulttimeout() -> None | float | 
 | 45 | - socket.setdefaulttimeout(None | float) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 46 | - an Internet socket address is a pair (hostname, port) | 
 | 47 |   where hostname can be anything recognized by gethostbyname() | 
 | 48 |   (including the dd.dd.dd.dd notation) and port is in host byte order | 
 | 49 | - where a hostname is returned, the dd.dd.dd.dd notation is used | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 50 | - a UNIX domain socket address is a string specifying the pathname | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 51 | - an AF_PACKET socket address is a tuple containing a string | 
 | 52 |   specifying the ethernet interface and an integer specifying | 
 | 53 |   the Ethernet protocol number to be received. For example: | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 54 |   ("eth0",0x1234).  Optional 3rd,4th,5th elements in the tuple | 
| Andrew M. Kuchling | b8e1717 | 2004-07-10 23:39:35 +0000 | [diff] [blame] | 55 |   specify packet-type and ha-type/addr. | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 56 | - an AF_TIPC socket address is expressed as | 
 | 57 |  (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 58 |     TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID; | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 59 |   and scope can be one of: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 60 |     TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE. | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 61 |   The meaning of v1, v2 and v3 depends on the value of addr_type: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 62 |     if addr_type is TIPC_ADDR_NAME: | 
 | 63 |         v1 is the server type | 
 | 64 |         v2 is the port identifier | 
 | 65 |         v3 is ignored | 
 | 66 |     if addr_type is TIPC_ADDR_NAMESEQ: | 
 | 67 |         v1 is the server type | 
 | 68 |         v2 is the lower port number | 
 | 69 |         v3 is the upper port number | 
 | 70 |     if addr_type is TIPC_ADDR_ID: | 
 | 71 |         v1 is the node | 
 | 72 |         v2 is the ref | 
 | 73 |         v3 is ignored | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 74 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 75 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 76 | Local naming conventions: | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 77 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 78 | - names starting with sock_ are socket object methods | 
 | 79 | - names starting with socket_ are module-level functions | 
 | 80 | - names starting with PySocket are exported through socketmodule.h | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 81 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 82 | */ | 
 | 83 |  | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 84 | #ifdef __APPLE__ | 
 | 85 |   /* | 
 | 86 |    * inet_aton is not available on OSX 10.3, yet we want to use a binary | 
 | 87 |    * that was build on 10.4 or later to work on that release, weak linking | 
 | 88 |    * comes to the rescue. | 
 | 89 |    */ | 
 | 90 | # pragma weak inet_aton | 
 | 91 | #endif | 
 | 92 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 93 | #include "Python.h" | 
| Georg Brandl | bc45a3f | 2006-03-17 19:17:34 +0000 | [diff] [blame] | 94 | #include "structmember.h" | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 95 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 96 | #undef MAX | 
 | 97 | #define MAX(x, y) ((x) < (y) ? (y) : (x)) | 
 | 98 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 99 | /* Socket object documentation */ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 100 | PyDoc_STRVAR(sock_doc, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 101 | "socket([family[, type[, proto]]]) -> socket object\n\ | 
 | 102 | \n\ | 
 | 103 | Open a socket of the given type.  The family argument specifies the\n\ | 
 | 104 | address family; it defaults to AF_INET.  The type argument specifies\n\ | 
 | 105 | whether this is a stream (SOCK_STREAM, this is the default)\n\ | 
 | 106 | or datagram (SOCK_DGRAM) socket.  The protocol argument defaults to 0,\n\ | 
 | 107 | specifying the default protocol.  Keyword arguments are accepted.\n\ | 
 | 108 | \n\ | 
 | 109 | A socket object represents one endpoint of a network connection.\n\ | 
 | 110 | \n\ | 
 | 111 | Methods of socket objects (keyword arguments not allowed):\n\ | 
 | 112 | \n\ | 
 | 113 | accept() -- accept a connection, returning new socket and client address\n\ | 
 | 114 | bind(addr) -- bind the socket to a local address\n\ | 
 | 115 | close() -- close the socket\n\ | 
 | 116 | connect(addr) -- connect the socket to a remote address\n\ | 
 | 117 | connect_ex(addr) -- connect, return an error code instead of an exception\n\ | 
 | 118 | dup() -- return a new socket object identical to the current one [*]\n\ | 
 | 119 | fileno() -- return underlying file descriptor\n\ | 
 | 120 | getpeername() -- return remote address [*]\n\ | 
 | 121 | getsockname() -- return local address\n\ | 
 | 122 | getsockopt(level, optname[, buflen]) -- get socket options\n\ | 
 | 123 | gettimeout() -- return timeout or None\n\ | 
 | 124 | listen(n) -- start listening for incoming connections\n\ | 
 | 125 | makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\ | 
 | 126 | recv(buflen[, flags]) -- receive data\n\ | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 127 | recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\ | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 128 | recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\ | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 129 | recvfrom_into(buffer[, nbytes, [, flags])\n\ | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 130 |   -- receive data and sender\'s address (into a buffer)\n\ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 131 | sendall(data[, flags]) -- send all data\n\ | 
 | 132 | send(data[, flags]) -- send data, may not send all of it\n\ | 
 | 133 | sendto(data[, flags], addr) -- send data to a given address\n\ | 
 | 134 | setblocking(0 | 1) -- set or clear the blocking I/O flag\n\ | 
 | 135 | setsockopt(level, optname, value) -- set socket options\n\ | 
 | 136 | settimeout(None | float) -- set or clear the timeout\n\ | 
 | 137 | shutdown(how) -- shut down traffic in one or both directions\n\ | 
 | 138 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 139 |  [*] not available on all platforms!"); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 140 |  | 
| Walter Dörwald | f0dfc7a | 2003-10-20 14:01:56 +0000 | [diff] [blame] | 141 | /* XXX This is a terrible mess of platform-dependent preprocessor hacks. | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 142 |    I hope some day someone can clean this up please... */ | 
 | 143 |  | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 144 | /* Hacks for gethostbyname_r().  On some non-Linux platforms, the configure | 
 | 145 |    script doesn't get this right, so we hardcode some platform checks below. | 
 | 146 |    On the other hand, not all Linux versions agree, so there the settings | 
 | 147 |    computed by the configure script are needed! */ | 
 | 148 |  | 
 | 149 | #ifndef linux | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 150 | # undef HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 151 | # undef HAVE_GETHOSTBYNAME_R_5_ARG | 
 | 152 | # undef HAVE_GETHOSTBYNAME_R_6_ARG | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 153 | #endif | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 154 |  | 
| Guido van Rossum | 7a12299 | 1999-04-13 04:07:32 +0000 | [diff] [blame] | 155 | #ifndef WITH_THREAD | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 156 | # undef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7a12299 | 1999-04-13 04:07:32 +0000 | [diff] [blame] | 157 | #endif | 
 | 158 |  | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 159 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 160 | # if defined(_AIX) || defined(__osf__) | 
 | 161 | #  define HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 162 | # elif defined(__sun) || defined(__sgi) | 
 | 163 | #  define HAVE_GETHOSTBYNAME_R_5_ARG | 
 | 164 | # elif defined(linux) | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 165 | /* Rely on the configure script */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 166 | # else | 
 | 167 | #  undef HAVE_GETHOSTBYNAME_R | 
 | 168 | # endif | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 169 | #endif | 
 | 170 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 171 | #if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \ | 
 | 172 |     !defined(MS_WINDOWS) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 173 | # define USE_GETHOSTBYNAME_LOCK | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 174 | #endif | 
 | 175 |  | 
| Hye-Shik Chang | 9ceebd5 | 2005-09-24 14:58:47 +0000 | [diff] [blame] | 176 | /* To use __FreeBSD_version */ | 
 | 177 | #ifdef HAVE_SYS_PARAM_H | 
 | 178 | #include <sys/param.h> | 
 | 179 | #endif | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 180 | /* On systems on which getaddrinfo() is believed to not be thread-safe, | 
| Just van Rossum | 09aecd7 | 2003-05-09 08:03:44 +0000 | [diff] [blame] | 181 |    (this includes the getaddrinfo emulation) protect access with a lock. */ | 
| Hye-Shik Chang | 9ceebd5 | 2005-09-24 14:58:47 +0000 | [diff] [blame] | 182 | #if defined(WITH_THREAD) && (defined(__APPLE__) || \ | 
 | 183 |     (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \ | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 184 |     defined(__OpenBSD__) || defined(__NetBSD__) || \ | 
 | 185 |     defined(__VMS) || !defined(HAVE_GETADDRINFO)) | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 186 | #define USE_GETADDRINFO_LOCK | 
 | 187 | #endif | 
 | 188 |  | 
 | 189 | #ifdef USE_GETADDRINFO_LOCK | 
 | 190 | #define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1); | 
 | 191 | #define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock); | 
 | 192 | #else | 
 | 193 | #define ACQUIRE_GETADDRINFO_LOCK | 
 | 194 | #define RELEASE_GETADDRINFO_LOCK | 
 | 195 | #endif | 
 | 196 |  | 
 | 197 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 198 | # include "pythread.h" | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 199 | #endif | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 200 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 201 | #if defined(PYCC_VACPP) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 202 | # include <types.h> | 
 | 203 | # include <io.h> | 
 | 204 | # include <sys/ioctl.h> | 
 | 205 | # include <utils.h> | 
 | 206 | # include <ctype.h> | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 207 | #endif | 
 | 208 |  | 
| Martin v. Löwis | 9e43730 | 2002-12-06 12:57:26 +0000 | [diff] [blame] | 209 | #if defined(__VMS) | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 210 | #  include <ioctl.h> | 
 | 211 | #endif | 
 | 212 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 213 | #if defined(PYOS_OS2) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 214 | # define  INCL_DOS | 
 | 215 | # define  INCL_DOSERRORS | 
 | 216 | # define  INCL_NOPMAPI | 
 | 217 | # include <os2.h> | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 218 | #endif | 
 | 219 |  | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 220 | #if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 221 | /* make sure that the reentrant (gethostbyaddr_r etc) | 
 | 222 |    functions are declared correctly if compiling with | 
 | 223 |    MIPSPro 7.x in ANSI C mode (default) */ | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 224 |  | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 225 | /* XXX Using _SGIAPI is the wrong thing, | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 226 |    but I don't know what the right thing is. */ | 
| Trent Mick | 8ea5bdf | 2004-09-13 17:48:41 +0000 | [diff] [blame] | 227 | #undef _SGIAPI /* to avoid warning */ | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 228 | #define _SGIAPI 1 | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 229 |  | 
| Trent Mick | 8ea5bdf | 2004-09-13 17:48:41 +0000 | [diff] [blame] | 230 | #undef _XOPEN_SOURCE | 
 | 231 | #include <sys/socket.h> | 
 | 232 | #include <sys/types.h> | 
 | 233 | #include <netinet/in.h> | 
 | 234 | #ifdef _SS_ALIGNSIZE | 
 | 235 | #define HAVE_GETADDRINFO 1 | 
 | 236 | #define HAVE_GETNAMEINFO 1 | 
 | 237 | #endif | 
 | 238 |  | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 239 | #define HAVE_INET_PTON | 
 | 240 | #include <netdb.h> | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 241 | #endif | 
 | 242 |  | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 243 | /* Irix 6.5 fails to define this variable at all. This is needed | 
 | 244 |    for both GCC and SGI's compiler. I'd say that the SGI headers | 
| Georg Brandl | dbd8339 | 2006-02-20 09:42:33 +0000 | [diff] [blame] | 245 |    are just busted. Same thing for Solaris. */ | 
 | 246 | #if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN) | 
| Anthony Baxter | bab23cf | 2003-10-04 08:00:49 +0000 | [diff] [blame] | 247 | #define INET_ADDRSTRLEN 16 | 
 | 248 | #endif | 
 | 249 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 250 | /* Generic includes */ | 
| Martin v. Löwis | 0e8bd7e | 2006-06-10 12:23:46 +0000 | [diff] [blame] | 251 | #ifdef HAVE_SYS_TYPES_H | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 252 | #include <sys/types.h> | 
| Martin v. Löwis | 0e8bd7e | 2006-06-10 12:23:46 +0000 | [diff] [blame] | 253 | #endif | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 254 |  | 
| Marc-André Lemburg | 976ade6 | 2002-02-16 18:47:07 +0000 | [diff] [blame] | 255 | /* Generic socket object definitions and includes */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 256 | #define PySocket_BUILDING_SOCKET | 
| Marc-André Lemburg | bb8b78b | 2002-02-16 18:44:52 +0000 | [diff] [blame] | 257 | #include "socketmodule.h" | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 258 |  | 
 | 259 | /* Addressing includes */ | 
 | 260 |  | 
| Guido van Rossum | 6f489d9 | 1996-06-28 20:15:15 +0000 | [diff] [blame] | 261 | #ifndef MS_WINDOWS | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 262 |  | 
 | 263 | /* Non-MS WINDOWS includes */ | 
 | 264 | # include <netdb.h> | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 265 |  | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 266 | /* Headers needed for inet_ntoa() and inet_addr() */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 267 | # ifdef __BEOS__ | 
 | 268 | #  include <net/netdb.h> | 
 | 269 | # elif defined(PYOS_OS2) && defined(PYCC_VACPP) | 
 | 270 | #  include <netdb.h> | 
| Tim Peters | 603c683 | 2001-11-05 02:45:59 +0000 | [diff] [blame] | 271 | typedef size_t socklen_t; | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 272 | # else | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 273 | #   include <arpa/inet.h> | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 274 | # endif | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 275 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 276 | # ifndef RISCOS | 
 | 277 | #  include <fcntl.h> | 
 | 278 | # else | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 279 | #  include <sys/ioctl.h> | 
 | 280 | #  include <socklib.h> | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 281 | #  define NO_DUP | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 282 | int h_errno; /* not used */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 283 | #  define INET_ADDRSTRLEN 16 | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 284 | # endif | 
 | 285 |  | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 286 | #else | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 287 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 288 | /* MS_WINDOWS includes */ | 
| Martin v. Löwis | 0e8bd7e | 2006-06-10 12:23:46 +0000 | [diff] [blame] | 289 | # ifdef HAVE_FCNTL_H | 
 | 290 | #  include <fcntl.h> | 
 | 291 | # endif | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 292 |  | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 293 | #endif | 
 | 294 |  | 
| Skip Montanaro | 7befb99 | 2004-02-10 16:50:21 +0000 | [diff] [blame] | 295 | #include <stddef.h> | 
| Martin v. Löwis | a45ecae | 2001-06-24 21:28:42 +0000 | [diff] [blame] | 296 |  | 
 | 297 | #ifndef offsetof | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 298 | # define offsetof(type, member) ((size_t)(&((type *)0)->member)) | 
| Martin v. Löwis | a45ecae | 2001-06-24 21:28:42 +0000 | [diff] [blame] | 299 | #endif | 
 | 300 |  | 
| Neal Norwitz | 39d22e5 | 2002-11-02 19:55:21 +0000 | [diff] [blame] | 301 | #ifndef O_NONBLOCK | 
 | 302 | # define O_NONBLOCK O_NDELAY | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 303 | #endif | 
 | 304 |  | 
| Trent Mick | a708d6e | 2004-09-07 17:48:26 +0000 | [diff] [blame] | 305 | /* include Python's addrinfo.h unless it causes trouble */ | 
 | 306 | #if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE) | 
 | 307 |   /* Do not include addinfo.h on some newer IRIX versions. | 
 | 308 |    * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21, | 
 | 309 |    * for example, but not by 6.5.10. | 
 | 310 |    */ | 
| Martin v. Löwis | 0e8bd7e | 2006-06-10 12:23:46 +0000 | [diff] [blame] | 311 | #elif defined(_MSC_VER) && _MSC_VER>1201 | 
| Trent Mick | a708d6e | 2004-09-07 17:48:26 +0000 | [diff] [blame] | 312 |   /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and | 
 | 313 |    * EAI_* constants are defined in (the already included) ws2tcpip.h. | 
 | 314 |    */ | 
 | 315 | #else | 
 | 316 | #  include "addrinfo.h" | 
 | 317 | #endif | 
| Jason Tishler | c246cb7 | 2004-08-09 13:25:59 +0000 | [diff] [blame] | 318 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 319 | #ifndef HAVE_INET_PTON | 
| Christian Heimes | e8954f8 | 2007-11-22 11:21:16 +0000 | [diff] [blame] | 320 | #if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN) | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 321 | int inet_pton(int af, const char *src, void *dst); | 
| Martin v. Löwis | c925b153 | 2001-07-21 09:42:15 +0000 | [diff] [blame] | 322 | const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 323 | #endif | 
| Christian Heimes | e8954f8 | 2007-11-22 11:21:16 +0000 | [diff] [blame] | 324 | #endif | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 325 |  | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 326 | #ifdef __APPLE__ | 
 | 327 | /* On OS X, getaddrinfo returns no error indication of lookup | 
 | 328 |    failure, so we must use the emulation instead of the libinfo | 
 | 329 |    implementation. Unfortunately, performing an autoconf test | 
 | 330 |    for this bug would require DNS access for the machine performing | 
 | 331 |    the configuration, which is not acceptable. Therefore, we | 
 | 332 |    determine the bug just by checking for __APPLE__. If this bug | 
 | 333 |    gets ever fixed, perhaps checking for sys/version.h would be | 
 | 334 |    appropriate, which is 10/0 on the system with the bug. */ | 
| Jack Jansen | 84262fb | 2002-07-02 14:40:42 +0000 | [diff] [blame] | 335 | #ifndef HAVE_GETNAMEINFO | 
 | 336 | /* This bug seems to be fixed in Jaguar. Ths easiest way I could | 
 | 337 |    Find to check for Jaguar is that it has getnameinfo(), which | 
 | 338 |    older releases don't have */ | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 339 | #undef HAVE_GETADDRINFO | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 340 | #endif | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 341 |  | 
 | 342 | #ifdef HAVE_INET_ATON | 
 | 343 | #define USE_INET_ATON_WEAKLINK | 
 | 344 | #endif | 
 | 345 |  | 
| Jack Jansen | 84262fb | 2002-07-02 14:40:42 +0000 | [diff] [blame] | 346 | #endif | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 347 |  | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 348 | /* I know this is a bad practice, but it is the easiest... */ | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 349 | #if !defined(HAVE_GETADDRINFO) | 
| Martin v. Löwis | fccac2e | 2003-05-01 05:20:46 +0000 | [diff] [blame] | 350 | /* avoid clashes with the C library definition of the symbol. */ | 
 | 351 | #define getaddrinfo fake_getaddrinfo | 
 | 352 | #define gai_strerror fake_gai_strerror | 
 | 353 | #define freeaddrinfo fake_freeaddrinfo | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 354 | #include "getaddrinfo.c" | 
 | 355 | #endif | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 356 | #if !defined(HAVE_GETNAMEINFO) | 
| Martin v. Löwis | fccac2e | 2003-05-01 05:20:46 +0000 | [diff] [blame] | 357 | #define getnameinfo fake_getnameinfo | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 358 | #include "getnameinfo.c" | 
 | 359 | #endif | 
 | 360 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 361 | #if defined(MS_WINDOWS) || defined(__BEOS__) | 
 | 362 | /* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */ | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 363 | /* seem to be a few differences in the API */ | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 364 | #define SOCKETCLOSE closesocket | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 365 | #define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */ | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 366 | #endif | 
 | 367 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 368 | #ifdef MS_WIN32 | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 369 | #define EAFNOSUPPORT WSAEAFNOSUPPORT | 
 | 370 | #define snprintf _snprintf | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 371 | #endif | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 372 |  | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 373 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 374 | #define SOCKETCLOSE soclose | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 375 | #define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */ | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 376 | #endif | 
 | 377 |  | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 378 | #ifndef SOCKETCLOSE | 
 | 379 | #define SOCKETCLOSE close | 
 | 380 | #endif | 
 | 381 |  | 
| Jesse Noller | 40a6164 | 2009-03-31 18:12:35 +0000 | [diff] [blame] | 382 | #if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H) &&  !defined(__NetBSD__) | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 383 | #define USE_BLUETOOTH 1 | 
 | 384 | #if defined(__FreeBSD__) | 
 | 385 | #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP | 
 | 386 | #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 387 | #define BTPROTO_HCI BLUETOOTH_PROTO_HCI | 
| Hye-Shik Chang | 82958f0 | 2007-06-05 18:16:52 +0000 | [diff] [blame] | 388 | #define SOL_HCI SOL_HCI_RAW | 
 | 389 | #define HCI_FILTER SO_HCI_RAW_FILTER | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 390 | #define sockaddr_l2 sockaddr_l2cap | 
 | 391 | #define sockaddr_rc sockaddr_rfcomm | 
| Hye-Shik Chang | 82958f0 | 2007-06-05 18:16:52 +0000 | [diff] [blame] | 392 | #define hci_dev hci_node | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 393 | #define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb) | 
 | 394 | #define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 395 | #define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) | 
| Matt Fleming | ec92650 | 2006-07-28 11:27:27 +0000 | [diff] [blame] | 396 | #elif defined(__NetBSD__) | 
 | 397 | #define sockaddr_l2 sockaddr_bt | 
 | 398 | #define sockaddr_rc sockaddr_bt | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 399 | #define sockaddr_hci sockaddr_bt | 
| Matt Fleming | ec92650 | 2006-07-28 11:27:27 +0000 | [diff] [blame] | 400 | #define sockaddr_sco sockaddr_bt | 
| Matt Fleming | ec92650 | 2006-07-28 11:27:27 +0000 | [diff] [blame] | 401 | #define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb) | 
 | 402 | #define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb) | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 403 | #define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb) | 
| Matt Fleming | ec92650 | 2006-07-28 11:27:27 +0000 | [diff] [blame] | 404 | #define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb) | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 405 | #else | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 406 | #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) | 
 | 407 | #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 408 | #define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb) | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 409 | #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) | 
 | 410 | #endif | 
 | 411 | #endif | 
 | 412 |  | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 413 | #ifdef __VMS | 
 | 414 | /* TCP/IP Services for VMS uses a maximum send/recv buffer length */ | 
 | 415 | #define SEGMENT_SIZE (32 * 1024 -1) | 
 | 416 | #endif | 
 | 417 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 418 | #define SAS2SA(x)       ((struct sockaddr *)(x)) | 
| Martin v. Löwis | 046c4d1 | 2006-12-03 11:23:45 +0000 | [diff] [blame] | 419 |  | 
| Martin v. Löwis | e941617 | 2003-05-03 10:12:45 +0000 | [diff] [blame] | 420 | /* | 
 | 421 |  * Constants for getnameinfo() | 
 | 422 |  */ | 
 | 423 | #if !defined(NI_MAXHOST) | 
 | 424 | #define NI_MAXHOST 1025 | 
 | 425 | #endif | 
 | 426 | #if !defined(NI_MAXSERV) | 
 | 427 | #define NI_MAXSERV 32 | 
 | 428 | #endif | 
 | 429 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 430 | /* XXX There's a problem here: *static* functions are not supposed to have | 
 | 431 |    a Py prefix (or use CapitalizedWords).  Later... */ | 
 | 432 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 433 | /* Global variable holding the exception type for errors detected | 
 | 434 |    by this module (but not argument type or memory errors, etc.). */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 435 | static PyObject *socket_error; | 
 | 436 | static PyObject *socket_herror; | 
 | 437 | static PyObject *socket_gaierror; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 438 | static PyObject *socket_timeout; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 439 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 440 | #ifdef RISCOS | 
 | 441 | /* Global variable which is !=0 if Python is running in a RISC OS taskwindow */ | 
 | 442 | static int taskwindow; | 
 | 443 | #endif | 
 | 444 |  | 
| Tim Peters | 643a7fc | 2002-02-17 04:13:21 +0000 | [diff] [blame] | 445 | /* A forward reference to the socket type object. | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 446 |    The sock_type variable contains pointers to various functions, | 
 | 447 |    some of which call new_sockobject(), which uses sock_type, so | 
| Tim Peters | 643a7fc | 2002-02-17 04:13:21 +0000 | [diff] [blame] | 448 |    there has to be a circular reference. */ | 
| Jeremy Hylton | 938ace6 | 2002-07-17 16:30:39 +0000 | [diff] [blame] | 449 | static PyTypeObject sock_type; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 450 |  | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 451 | #if defined(HAVE_POLL_H) | 
 | 452 | #include <poll.h> | 
 | 453 | #elif defined(HAVE_SYS_POLL_H) | 
 | 454 | #include <sys/poll.h> | 
 | 455 | #endif | 
 | 456 |  | 
| Martin v. Löwis | f84d1b9 | 2006-02-11 09:27:05 +0000 | [diff] [blame] | 457 | #ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE | 
 | 458 | /* Platform can select file descriptors beyond FD_SETSIZE */ | 
 | 459 | #define IS_SELECTABLE(s) 1 | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 460 | #elif defined(HAVE_POLL) | 
 | 461 | /* Instead of select(), we'll use poll() since poll() works on any fd. */ | 
 | 462 | #define IS_SELECTABLE(s) 1 | 
 | 463 | /* Can we call select() with this socket without a buffer overrun? */ | 
| Martin v. Löwis | f84d1b9 | 2006-02-11 09:27:05 +0000 | [diff] [blame] | 464 | #else | 
 | 465 | /* POSIX says selecting file descriptors beyond FD_SETSIZE | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 466 |    has undefined behaviour.  If there's no timeout left, we don't have to | 
 | 467 |    call select, so it's a safe, little white lie. */ | 
 | 468 | #define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0) | 
| Martin v. Löwis | f84d1b9 | 2006-02-11 09:27:05 +0000 | [diff] [blame] | 469 | #endif | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 470 |  | 
 | 471 | static PyObject* | 
 | 472 | select_error(void) | 
 | 473 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 474 |     PyErr_SetString(socket_error, "unable to select on socket"); | 
 | 475 |     return NULL; | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 476 | } | 
 | 477 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 478 | /* Convenience function to raise an error according to errno | 
 | 479 |    and return a NULL pointer from a function. */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 480 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 481 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 482 | set_error(void) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 483 | { | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 484 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 485 |     int err_no = WSAGetLastError(); | 
 | 486 |     /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which | 
 | 487 |        recognizes the error codes used by both GetLastError() and | 
 | 488 |        WSAGetLastError */ | 
 | 489 |     if (err_no) | 
 | 490 |         return PyErr_SetExcFromWindowsErr(socket_error, err_no); | 
| Guido van Rossum | 14ed0b2 | 1994-09-29 09:50:09 +0000 | [diff] [blame] | 491 | #endif | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 492 |  | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 493 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 494 |     if (sock_errno() != NO_ERROR) { | 
 | 495 |         APIRET rc; | 
 | 496 |         ULONG  msglen; | 
 | 497 |         char outbuf[100]; | 
 | 498 |         int myerrorcode = sock_errno(); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 499 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 500 |         /* Retrieve socket-related error message from MPTN.MSG file */ | 
 | 501 |         rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf), | 
 | 502 |                            myerrorcode - SOCBASEERR + 26, | 
 | 503 |                            "mptn.msg", | 
 | 504 |                            &msglen); | 
 | 505 |         if (rc == NO_ERROR) { | 
 | 506 |             PyObject *v; | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 507 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 508 |             /* OS/2 doesn't guarantee a terminator */ | 
 | 509 |             outbuf[msglen] = '\0'; | 
 | 510 |             if (strlen(outbuf) > 0) { | 
 | 511 |                 /* If non-empty msg, trim CRLF */ | 
 | 512 |                 char *lastc = &outbuf[ strlen(outbuf)-1 ]; | 
 | 513 |                 while (lastc > outbuf && | 
 | 514 |                        isspace(Py_CHARMASK(*lastc))) { | 
 | 515 |                     /* Trim trailing whitespace (CRLF) */ | 
 | 516 |                     *lastc-- = '\0'; | 
 | 517 |                 } | 
 | 518 |             } | 
 | 519 |             v = Py_BuildValue("(is)", myerrorcode, outbuf); | 
 | 520 |             if (v != NULL) { | 
 | 521 |                 PyErr_SetObject(socket_error, v); | 
 | 522 |                 Py_DECREF(v); | 
 | 523 |             } | 
 | 524 |             return NULL; | 
 | 525 |         } | 
 | 526 |     } | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 527 | #endif | 
 | 528 |  | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 529 | #if defined(RISCOS) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 530 |     if (_inet_error.errnum != NULL) { | 
 | 531 |         PyObject *v; | 
 | 532 |         v = Py_BuildValue("(is)", errno, _inet_err()); | 
 | 533 |         if (v != NULL) { | 
 | 534 |             PyErr_SetObject(socket_error, v); | 
 | 535 |             Py_DECREF(v); | 
 | 536 |         } | 
 | 537 |         return NULL; | 
 | 538 |     } | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 539 | #endif | 
 | 540 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 541 |     return PyErr_SetFromErrno(socket_error); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 542 | } | 
 | 543 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 544 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 545 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 546 | set_herror(int h_error) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 547 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 548 |     PyObject *v; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 549 |  | 
 | 550 | #ifdef HAVE_HSTRERROR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 551 |     v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error)); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 552 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 553 |     v = Py_BuildValue("(is)", h_error, "host not found"); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 554 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 555 |     if (v != NULL) { | 
 | 556 |         PyErr_SetObject(socket_herror, v); | 
 | 557 |         Py_DECREF(v); | 
 | 558 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 559 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 560 |     return NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 561 | } | 
 | 562 |  | 
 | 563 |  | 
 | 564 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 565 | set_gaierror(int error) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 566 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 567 |     PyObject *v; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 568 |  | 
| Martin v. Löwis | 272cb40 | 2002-03-01 08:31:07 +0000 | [diff] [blame] | 569 | #ifdef EAI_SYSTEM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 570 |     /* EAI_SYSTEM is not available on Windows XP. */ | 
 | 571 |     if (error == EAI_SYSTEM) | 
 | 572 |         return set_error(); | 
| Martin v. Löwis | 272cb40 | 2002-03-01 08:31:07 +0000 | [diff] [blame] | 573 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 574 |  | 
| Martin v. Löwis | f95dd0a | 2001-08-15 17:14:33 +0000 | [diff] [blame] | 575 | #ifdef HAVE_GAI_STRERROR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 576 |     v = Py_BuildValue("(is)", error, gai_strerror(error)); | 
| Martin v. Löwis | f95dd0a | 2001-08-15 17:14:33 +0000 | [diff] [blame] | 577 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 578 |     v = Py_BuildValue("(is)", error, "getaddrinfo failed"); | 
| Martin v. Löwis | f95dd0a | 2001-08-15 17:14:33 +0000 | [diff] [blame] | 579 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 580 |     if (v != NULL) { | 
 | 581 |         PyErr_SetObject(socket_gaierror, v); | 
 | 582 |         Py_DECREF(v); | 
 | 583 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 584 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 585 |     return NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 586 | } | 
 | 587 |  | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 588 | #ifdef __VMS | 
 | 589 | /* Function to send in segments */ | 
 | 590 | static int | 
 | 591 | sendsegmented(int sock_fd, char *buf, int len, int flags) | 
 | 592 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 593 |     int n = 0; | 
 | 594 |     int remaining = len; | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 595 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 596 |     while (remaining > 0) { | 
 | 597 |         unsigned int segment; | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 598 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 599 |         segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining); | 
 | 600 |         n = send(sock_fd, buf, segment, flags); | 
 | 601 |         if (n < 0) { | 
 | 602 |             return n; | 
 | 603 |         } | 
 | 604 |         remaining -= segment; | 
 | 605 |         buf += segment; | 
 | 606 |     } /* end while */ | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 607 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 608 |     return len; | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 609 | } | 
 | 610 | #endif | 
 | 611 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 612 | /* Function to perform the setting of socket blocking mode | 
 | 613 |    internally. block = (1 | 0). */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 614 | static int | 
 | 615 | internal_setblocking(PySocketSockObject *s, int block) | 
 | 616 | { | 
 | 617 | #ifndef RISCOS | 
 | 618 | #ifndef MS_WINDOWS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 619 |     int delay_flag; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 620 | #endif | 
 | 621 | #endif | 
 | 622 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 623 |     Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 624 | #ifdef __BEOS__ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 625 |     block = !block; | 
 | 626 |     setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK, | 
 | 627 |                (void *)(&block), sizeof(int)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 628 | #else | 
 | 629 | #ifndef RISCOS | 
 | 630 | #ifndef MS_WINDOWS | 
 | 631 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 632 |     block = !block; | 
 | 633 |     ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block)); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 634 | #elif defined(__VMS) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 635 |     block = !block; | 
 | 636 |     ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block); | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 637 | #else  /* !PYOS_OS2 && !__VMS */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 638 |     delay_flag = fcntl(s->sock_fd, F_GETFL, 0); | 
 | 639 |     if (block) | 
 | 640 |         delay_flag &= (~O_NONBLOCK); | 
 | 641 |     else | 
 | 642 |         delay_flag |= O_NONBLOCK; | 
 | 643 |     fcntl(s->sock_fd, F_SETFL, delay_flag); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 644 | #endif /* !PYOS_OS2 */ | 
 | 645 | #else /* MS_WINDOWS */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 646 |     block = !block; | 
 | 647 |     ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 648 | #endif /* MS_WINDOWS */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 649 | #else /* RISCOS */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 650 |     block = !block; | 
 | 651 |     socketioctl(s->sock_fd, FIONBIO, (u_long*)&block); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 652 | #endif /* RISCOS */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 653 | #endif /* __BEOS__ */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 654 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 655 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 656 |     /* Since these don't return anything */ | 
 | 657 |     return 1; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 658 | } | 
 | 659 |  | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 660 | /* Do a select()/poll() on the socket, if necessary (sock_timeout > 0). | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 661 |    The argument writing indicates the direction. | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 662 |    This does not raise an exception; we'll let our caller do that | 
 | 663 |    after they've reacquired the interpreter lock. | 
| Neal Norwitz | 9b0ca79 | 2006-08-02 06:46:21 +0000 | [diff] [blame] | 664 |    Returns 1 on timeout, -1 on error, 0 otherwise. */ | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 665 | static int | 
| Guido van Rossum | b9e916a | 2002-06-07 01:42:47 +0000 | [diff] [blame] | 666 | internal_select(PySocketSockObject *s, int writing) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 667 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 668 |     int n; | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 669 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 670 |     /* Nothing to do unless we're in timeout mode (not non-blocking) */ | 
 | 671 |     if (s->sock_timeout <= 0.0) | 
 | 672 |         return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 673 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 674 |     /* Guard against closed socket */ | 
 | 675 |     if (s->sock_fd < 0) | 
 | 676 |         return 0; | 
| Guido van Rossum | ad65490 | 2002-07-19 12:44:59 +0000 | [diff] [blame] | 677 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 678 |     /* Prefer poll, if available, since you can poll() any fd | 
 | 679 |      * which can't be done with select(). */ | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 680 | #ifdef HAVE_POLL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 681 |     { | 
 | 682 |         struct pollfd pollfd; | 
 | 683 |         int timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 684 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 685 |         pollfd.fd = s->sock_fd; | 
 | 686 |         pollfd.events = writing ? POLLOUT : POLLIN; | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 687 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 688 |         /* s->sock_timeout is in seconds, timeout in ms */ | 
 | 689 |         timeout = (int)(s->sock_timeout * 1000 + 0.5); | 
 | 690 |         n = poll(&pollfd, 1, timeout); | 
 | 691 |     } | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 692 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 693 |     { | 
 | 694 |         /* Construct the arguments to select */ | 
 | 695 |         fd_set fds; | 
 | 696 |         struct timeval tv; | 
 | 697 |         tv.tv_sec = (int)s->sock_timeout; | 
 | 698 |         tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6); | 
 | 699 |         FD_ZERO(&fds); | 
 | 700 |         FD_SET(s->sock_fd, &fds); | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 701 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 702 |         /* See if the socket is ready */ | 
 | 703 |         if (writing) | 
 | 704 |             n = select(s->sock_fd+1, NULL, &fds, NULL, &tv); | 
 | 705 |         else | 
 | 706 |             n = select(s->sock_fd+1, &fds, NULL, NULL, &tv); | 
 | 707 |     } | 
| Anthony Baxter | 93ab5fa | 2006-07-11 02:04:09 +0000 | [diff] [blame] | 708 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 709 |  | 
 | 710 |     if (n < 0) | 
 | 711 |         return -1; | 
 | 712 |     if (n == 0) | 
 | 713 |         return 1; | 
 | 714 |     return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 715 | } | 
 | 716 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 717 | /* Initialize a new socket object. */ | 
 | 718 |  | 
| Tim Peters | a12b4cf | 2002-07-18 22:38:44 +0000 | [diff] [blame] | 719 | static double defaulttimeout = -1.0; /* Default timeout for new sockets */ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 720 |  | 
| Mark Hammond | 62b1ab1 | 2002-07-23 06:31:15 +0000 | [diff] [blame] | 721 | PyMODINIT_FUNC | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 722 | init_sockobject(PySocketSockObject *s, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 723 |                 SOCKET_T fd, int family, int type, int proto) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 724 | { | 
 | 725 | #ifdef RISCOS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 726 |     int block = 1; | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 727 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 728 |     s->sock_fd = fd; | 
 | 729 |     s->sock_family = family; | 
 | 730 |     s->sock_type = type; | 
 | 731 |     s->sock_proto = proto; | 
 | 732 |     s->sock_timeout = defaulttimeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 733 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 734 |     s->errorhandler = &set_error; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 735 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 736 |     if (defaulttimeout >= 0.0) | 
 | 737 |         internal_setblocking(s, 0); | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 738 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 739 | #ifdef RISCOS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 740 |     if (taskwindow) | 
 | 741 |         socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 742 | #endif | 
 | 743 | } | 
 | 744 |  | 
 | 745 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 746 | /* Create a new socket object. | 
 | 747 |    This just creates the object and initializes it. | 
 | 748 |    If the creation fails, return NULL and set an exception (implicit | 
 | 749 |    in NEWOBJ()). */ | 
 | 750 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 751 | static PySocketSockObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 752 | new_sockobject(SOCKET_T fd, int family, int type, int proto) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 753 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 754 |     PySocketSockObject *s; | 
 | 755 |     s = (PySocketSockObject *) | 
 | 756 |         PyType_GenericNew(&sock_type, NULL, NULL); | 
 | 757 |     if (s != NULL) | 
 | 758 |         init_sockobject(s, fd, family, type, proto); | 
 | 759 |     return s; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 760 | } | 
 | 761 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 762 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 763 | /* Lock to allow python interpreter to continue, but only allow one | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 764 |    thread to be in gethostbyname or getaddrinfo */ | 
 | 765 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
 | 766 | PyThread_type_lock netdb_lock; | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 767 | #endif | 
 | 768 |  | 
 | 769 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 770 | /* Convert a string specifying a host name or one of a few symbolic | 
 | 771 |    names to a numeric IP address.  This usually calls gethostbyname() | 
 | 772 |    to do the work; the names "" and "<broadcast>" are special. | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 773 |    Return the length (IPv4 should be 4 bytes), or negative if | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 774 |    an error occurred; then an exception is raised. */ | 
 | 775 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 776 | static int | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 777 | setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 778 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 779 |     struct addrinfo hints, *res; | 
 | 780 |     int error; | 
 | 781 |     int d1, d2, d3, d4; | 
 | 782 |     char ch; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 783 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 784 |     memset((void *) addr_ret, '\0', sizeof(*addr_ret)); | 
 | 785 |     if (name[0] == '\0') { | 
 | 786 |         int siz; | 
 | 787 |         memset(&hints, 0, sizeof(hints)); | 
 | 788 |         hints.ai_family = af; | 
 | 789 |         hints.ai_socktype = SOCK_DGRAM;         /*dummy*/ | 
 | 790 |         hints.ai_flags = AI_PASSIVE; | 
 | 791 |         Py_BEGIN_ALLOW_THREADS | 
 | 792 |         ACQUIRE_GETADDRINFO_LOCK | 
 | 793 |         error = getaddrinfo(NULL, "0", &hints, &res); | 
 | 794 |         Py_END_ALLOW_THREADS | 
 | 795 |         /* We assume that those thread-unsafe getaddrinfo() versions | 
 | 796 |            *are* safe regarding their return value, ie. that a | 
 | 797 |            subsequent call to getaddrinfo() does not destroy the | 
 | 798 |            outcome of the first call. */ | 
 | 799 |         RELEASE_GETADDRINFO_LOCK | 
 | 800 |         if (error) { | 
 | 801 |             set_gaierror(error); | 
 | 802 |             return -1; | 
 | 803 |         } | 
 | 804 |         switch (res->ai_family) { | 
 | 805 |         case AF_INET: | 
 | 806 |             siz = 4; | 
 | 807 |             break; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 808 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 809 |         case AF_INET6: | 
 | 810 |             siz = 16; | 
 | 811 |             break; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 812 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 813 |         default: | 
 | 814 |             freeaddrinfo(res); | 
 | 815 |             PyErr_SetString(socket_error, | 
 | 816 |                 "unsupported address family"); | 
 | 817 |             return -1; | 
 | 818 |         } | 
 | 819 |         if (res->ai_next) { | 
 | 820 |             freeaddrinfo(res); | 
 | 821 |             PyErr_SetString(socket_error, | 
 | 822 |                 "wildcard resolved to multiple address"); | 
 | 823 |             return -1; | 
 | 824 |         } | 
 | 825 |         if (res->ai_addrlen < addr_ret_size) | 
 | 826 |             addr_ret_size = res->ai_addrlen; | 
 | 827 |         memcpy(addr_ret, res->ai_addr, addr_ret_size); | 
 | 828 |         freeaddrinfo(res); | 
 | 829 |         return siz; | 
 | 830 |     } | 
 | 831 |     if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) { | 
 | 832 |         struct sockaddr_in *sin; | 
 | 833 |         if (af != AF_INET && af != AF_UNSPEC) { | 
 | 834 |             PyErr_SetString(socket_error, | 
 | 835 |                 "address family mismatched"); | 
 | 836 |             return -1; | 
 | 837 |         } | 
 | 838 |         sin = (struct sockaddr_in *)addr_ret; | 
 | 839 |         memset((void *) sin, '\0', sizeof(*sin)); | 
 | 840 |         sin->sin_family = AF_INET; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 841 | #ifdef HAVE_SOCKADDR_SA_LEN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 842 |         sin->sin_len = sizeof(*sin); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 843 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 844 |         sin->sin_addr.s_addr = INADDR_BROADCAST; | 
 | 845 |         return sizeof(sin->sin_addr); | 
 | 846 |     } | 
 | 847 |     if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 && | 
 | 848 |         0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 && | 
 | 849 |         0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) { | 
 | 850 |         struct sockaddr_in *sin; | 
 | 851 |         sin = (struct sockaddr_in *)addr_ret; | 
 | 852 |         sin->sin_addr.s_addr = htonl( | 
 | 853 |             ((long) d1 << 24) | ((long) d2 << 16) | | 
 | 854 |             ((long) d3 << 8) | ((long) d4 << 0)); | 
 | 855 |         sin->sin_family = AF_INET; | 
| Anthony Baxter | 0e85f9d | 2003-05-02 15:40:46 +0000 | [diff] [blame] | 856 | #ifdef HAVE_SOCKADDR_SA_LEN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 857 |         sin->sin_len = sizeof(*sin); | 
| Anthony Baxter | 0e85f9d | 2003-05-02 15:40:46 +0000 | [diff] [blame] | 858 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 859 |         return 4; | 
 | 860 |     } | 
 | 861 |     memset(&hints, 0, sizeof(hints)); | 
 | 862 |     hints.ai_family = af; | 
 | 863 |     Py_BEGIN_ALLOW_THREADS | 
 | 864 |     ACQUIRE_GETADDRINFO_LOCK | 
 | 865 |     error = getaddrinfo(name, NULL, &hints, &res); | 
| Martin v. Löwis | 7c4b5fa | 2001-10-25 09:04:03 +0000 | [diff] [blame] | 866 | #if defined(__digital__) && defined(__unix__) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 867 |     if (error == EAI_NONAME && af == AF_UNSPEC) { | 
 | 868 |         /* On Tru64 V5.1, numeric-to-addr conversion fails | 
 | 869 |            if no address family is given. Assume IPv4 for now.*/ | 
 | 870 |         hints.ai_family = AF_INET; | 
 | 871 |         error = getaddrinfo(name, NULL, &hints, &res); | 
 | 872 |     } | 
| Martin v. Löwis | 7c4b5fa | 2001-10-25 09:04:03 +0000 | [diff] [blame] | 873 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 874 |     Py_END_ALLOW_THREADS | 
 | 875 |     RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
 | 876 |     if (error) { | 
 | 877 |         set_gaierror(error); | 
 | 878 |         return -1; | 
 | 879 |     } | 
 | 880 |     if (res->ai_addrlen < addr_ret_size) | 
 | 881 |         addr_ret_size = res->ai_addrlen; | 
 | 882 |     memcpy((char *) addr_ret, res->ai_addr, addr_ret_size); | 
 | 883 |     freeaddrinfo(res); | 
 | 884 |     switch (addr_ret->sa_family) { | 
 | 885 |     case AF_INET: | 
 | 886 |         return 4; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 887 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 888 |     case AF_INET6: | 
 | 889 |         return 16; | 
| Guido van Rossum | 955becc | 1999-03-22 20:14:53 +0000 | [diff] [blame] | 890 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 891 |     default: | 
 | 892 |         PyErr_SetString(socket_error, "unknown address family"); | 
 | 893 |         return -1; | 
 | 894 |     } | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 895 | } | 
 | 896 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 897 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 898 | /* Create a string object representing an IP address. | 
 | 899 |    This is always a string of the form 'dd.dd.dd.dd' (with variable | 
 | 900 |    size numbers). */ | 
 | 901 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 902 | static PyObject * | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 903 | makeipaddr(struct sockaddr *addr, int addrlen) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 904 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 905 |     char buf[NI_MAXHOST]; | 
 | 906 |     int error; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 907 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 908 |     error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0, | 
 | 909 |         NI_NUMERICHOST); | 
 | 910 |     if (error) { | 
 | 911 |         set_gaierror(error); | 
 | 912 |         return NULL; | 
 | 913 |     } | 
 | 914 |     return PyString_FromString(buf); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 915 | } | 
 | 916 |  | 
 | 917 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 918 | #ifdef USE_BLUETOOTH | 
 | 919 | /* Convert a string representation of a Bluetooth address into a numeric | 
 | 920 |    address.  Returns the length (6), or raises an exception and returns -1 if | 
 | 921 |    an error occurred. */ | 
 | 922 |  | 
 | 923 | static int | 
 | 924 | setbdaddr(char *name, bdaddr_t *bdaddr) | 
 | 925 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 926 |     unsigned int b0, b1, b2, b3, b4, b5; | 
 | 927 |     char ch; | 
 | 928 |     int n; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 929 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 930 |     n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", | 
 | 931 |                &b5, &b4, &b3, &b2, &b1, &b0, &ch); | 
 | 932 |     if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { | 
 | 933 |         bdaddr->b[0] = b0; | 
 | 934 |         bdaddr->b[1] = b1; | 
 | 935 |         bdaddr->b[2] = b2; | 
 | 936 |         bdaddr->b[3] = b3; | 
 | 937 |         bdaddr->b[4] = b4; | 
 | 938 |         bdaddr->b[5] = b5; | 
 | 939 |         return 6; | 
 | 940 |     } else { | 
 | 941 |         PyErr_SetString(socket_error, "bad bluetooth address"); | 
 | 942 |         return -1; | 
 | 943 |     } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 944 | } | 
 | 945 |  | 
 | 946 | /* Create a string representation of the Bluetooth address.  This is always a | 
 | 947 |    string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal | 
 | 948 |    value (zero padded if necessary). */ | 
 | 949 |  | 
 | 950 | static PyObject * | 
 | 951 | makebdaddr(bdaddr_t *bdaddr) | 
 | 952 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 953 |     char buf[(6 * 2) + 5 + 1]; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 954 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 955 |     sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", | 
 | 956 |         bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], | 
 | 957 |         bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); | 
 | 958 |     return PyString_FromString(buf); | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 959 | } | 
 | 960 | #endif | 
 | 961 |  | 
 | 962 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 963 | /* Create an object representing the given socket address, | 
 | 964 |    suitable for passing it back to bind(), connect() etc. | 
 | 965 |    The family field of the sockaddr structure is inspected | 
 | 966 |    to determine what kind of address it really is. */ | 
 | 967 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 968 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 969 | static PyObject * | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 970 | makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 971 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 972 |     if (addrlen == 0) { | 
 | 973 |         /* No address -- may be recvfrom() from known socket */ | 
 | 974 |         Py_INCREF(Py_None); | 
 | 975 |         return Py_None; | 
 | 976 |     } | 
| Guido van Rossum | 25bec8c | 1992-08-05 19:00:45 +0000 | [diff] [blame] | 977 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 978 | #ifdef __BEOS__ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 979 |     /* XXX: BeOS version of accept() doesn't set family correctly */ | 
 | 980 |     addr->sa_family = AF_INET; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 981 | #endif | 
 | 982 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 983 |     switch (addr->sa_family) { | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 984 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 985 |     case AF_INET: | 
 | 986 |     { | 
 | 987 |         struct sockaddr_in *a; | 
 | 988 |         PyObject *addrobj = makeipaddr(addr, sizeof(*a)); | 
 | 989 |         PyObject *ret = NULL; | 
 | 990 |         if (addrobj) { | 
 | 991 |             a = (struct sockaddr_in *)addr; | 
 | 992 |             ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port)); | 
 | 993 |             Py_DECREF(addrobj); | 
 | 994 |         } | 
 | 995 |         return ret; | 
 | 996 |     } | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 997 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 998 | #if defined(AF_UNIX) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 999 |     case AF_UNIX: | 
 | 1000 |     { | 
 | 1001 |         struct sockaddr_un *a = (struct sockaddr_un *) addr; | 
| Armin Rigo | a9017c3 | 2006-04-19 11:50:27 +0000 | [diff] [blame] | 1002 | #ifdef linux | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1003 |         if (a->sun_path[0] == 0) {  /* Linux abstract namespace */ | 
 | 1004 |             addrlen -= offsetof(struct sockaddr_un, sun_path); | 
 | 1005 |             return PyString_FromStringAndSize(a->sun_path, | 
 | 1006 |                                               addrlen); | 
 | 1007 |         } | 
 | 1008 |         else | 
| Armin Rigo | a9017c3 | 2006-04-19 11:50:27 +0000 | [diff] [blame] | 1009 | #endif /* linux */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1010 |         { | 
 | 1011 |             /* regular NULL-terminated string */ | 
 | 1012 |             return PyString_FromString(a->sun_path); | 
 | 1013 |         } | 
 | 1014 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1015 | #endif /* AF_UNIX */ | 
 | 1016 |  | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1017 | #if defined(AF_NETLINK) | 
 | 1018 |        case AF_NETLINK: | 
 | 1019 |        { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1020 |            struct sockaddr_nl *a = (struct sockaddr_nl *) addr; | 
 | 1021 |            return Py_BuildValue("II", a->nl_pid, a->nl_groups); | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1022 |        } | 
 | 1023 | #endif /* AF_NETLINK */ | 
 | 1024 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 1025 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1026 |     case AF_INET6: | 
 | 1027 |     { | 
 | 1028 |         struct sockaddr_in6 *a; | 
 | 1029 |         PyObject *addrobj = makeipaddr(addr, sizeof(*a)); | 
 | 1030 |         PyObject *ret = NULL; | 
 | 1031 |         if (addrobj) { | 
 | 1032 |             a = (struct sockaddr_in6 *)addr; | 
 | 1033 |             ret = Py_BuildValue("Oiii", | 
 | 1034 |                                 addrobj, | 
 | 1035 |                                 ntohs(a->sin6_port), | 
 | 1036 |                                 a->sin6_flowinfo, | 
 | 1037 |                                 a->sin6_scope_id); | 
 | 1038 |             Py_DECREF(addrobj); | 
 | 1039 |         } | 
 | 1040 |         return ret; | 
 | 1041 |     } | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1042 | #endif | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1043 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1044 | #ifdef USE_BLUETOOTH | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1045 |     case AF_BLUETOOTH: | 
 | 1046 |         switch (proto) { | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1047 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1048 |         case BTPROTO_L2CAP: | 
 | 1049 |         { | 
 | 1050 |             struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr; | 
 | 1051 |             PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr)); | 
 | 1052 |             PyObject *ret = NULL; | 
 | 1053 |             if (addrobj) { | 
 | 1054 |                 ret = Py_BuildValue("Oi", | 
 | 1055 |                                     addrobj, | 
 | 1056 |                                     _BT_L2_MEMB(a, psm)); | 
 | 1057 |                 Py_DECREF(addrobj); | 
 | 1058 |             } | 
 | 1059 |             return ret; | 
 | 1060 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1061 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1062 |         case BTPROTO_RFCOMM: | 
 | 1063 |         { | 
 | 1064 |             struct sockaddr_rc *a = (struct sockaddr_rc *) addr; | 
 | 1065 |             PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr)); | 
 | 1066 |             PyObject *ret = NULL; | 
 | 1067 |             if (addrobj) { | 
 | 1068 |                 ret = Py_BuildValue("Oi", | 
 | 1069 |                                     addrobj, | 
 | 1070 |                                     _BT_RC_MEMB(a, channel)); | 
 | 1071 |                 Py_DECREF(addrobj); | 
 | 1072 |             } | 
 | 1073 |             return ret; | 
 | 1074 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1075 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1076 |         case BTPROTO_HCI: | 
 | 1077 |         { | 
 | 1078 |             struct sockaddr_hci *a = (struct sockaddr_hci *) addr; | 
 | 1079 |             PyObject *ret = NULL; | 
 | 1080 |             ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev)); | 
 | 1081 |             return ret; | 
 | 1082 |         } | 
| Martin v. Löwis | 45423a7 | 2007-02-14 10:07:37 +0000 | [diff] [blame] | 1083 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1084 | #if !defined(__FreeBSD__) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1085 |         case BTPROTO_SCO: | 
 | 1086 |         { | 
 | 1087 |             struct sockaddr_sco *a = (struct sockaddr_sco *) addr; | 
 | 1088 |             return makebdaddr(&_BT_SCO_MEMB(a, bdaddr)); | 
 | 1089 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1090 | #endif | 
 | 1091 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1092 |         default: | 
 | 1093 |             PyErr_SetString(PyExc_ValueError, | 
 | 1094 |                             "Unknown Bluetooth protocol"); | 
 | 1095 |             return NULL; | 
 | 1096 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1097 | #endif | 
 | 1098 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 1099 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1100 |     case AF_PACKET: | 
 | 1101 |     { | 
 | 1102 |         struct sockaddr_ll *a = (struct sockaddr_ll *)addr; | 
 | 1103 |         char *ifname = ""; | 
 | 1104 |         struct ifreq ifr; | 
 | 1105 |         /* need to look up interface name give index */ | 
 | 1106 |         if (a->sll_ifindex) { | 
 | 1107 |             ifr.ifr_ifindex = a->sll_ifindex; | 
 | 1108 |             if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0) | 
 | 1109 |                 ifname = ifr.ifr_name; | 
 | 1110 |         } | 
 | 1111 |         return Py_BuildValue("shbhs#", | 
 | 1112 |                              ifname, | 
 | 1113 |                              ntohs(a->sll_protocol), | 
 | 1114 |                              a->sll_pkttype, | 
 | 1115 |                              a->sll_hatype, | 
 | 1116 |                              a->sll_addr, | 
 | 1117 |                              a->sll_halen); | 
 | 1118 |     } | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1119 | #endif | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1120 |  | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1121 | #ifdef HAVE_LINUX_TIPC_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1122 |     case AF_TIPC: | 
 | 1123 |     { | 
 | 1124 |         struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr; | 
 | 1125 |         if (a->addrtype == TIPC_ADDR_NAMESEQ) { | 
 | 1126 |             return Py_BuildValue("IIIII", | 
 | 1127 |                             a->addrtype, | 
 | 1128 |                             a->addr.nameseq.type, | 
 | 1129 |                             a->addr.nameseq.lower, | 
 | 1130 |                             a->addr.nameseq.upper, | 
 | 1131 |                             a->scope); | 
 | 1132 |         } else if (a->addrtype == TIPC_ADDR_NAME) { | 
 | 1133 |             return Py_BuildValue("IIIII", | 
 | 1134 |                             a->addrtype, | 
 | 1135 |                             a->addr.name.name.type, | 
 | 1136 |                             a->addr.name.name.instance, | 
 | 1137 |                             a->addr.name.name.instance, | 
 | 1138 |                             a->scope); | 
 | 1139 |         } else if (a->addrtype == TIPC_ADDR_ID) { | 
 | 1140 |             return Py_BuildValue("IIIII", | 
 | 1141 |                             a->addrtype, | 
 | 1142 |                             a->addr.id.node, | 
 | 1143 |                             a->addr.id.ref, | 
 | 1144 |                             0, | 
 | 1145 |                             a->scope); | 
 | 1146 |         } else { | 
 | 1147 |             PyErr_SetString(PyExc_ValueError, | 
 | 1148 |                             "Invalid address type"); | 
 | 1149 |             return NULL; | 
 | 1150 |         } | 
 | 1151 |     } | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1152 | #endif | 
 | 1153 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1154 |     /* More cases here... */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1155 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1156 |     default: | 
 | 1157 |         /* If we don't know the address family, don't raise an | 
 | 1158 |            exception -- return it as a tuple. */ | 
 | 1159 |         return Py_BuildValue("is#", | 
 | 1160 |                              addr->sa_family, | 
 | 1161 |                              addr->sa_data, | 
 | 1162 |                              sizeof(addr->sa_data)); | 
| Guido van Rossum | 25bec8c | 1992-08-05 19:00:45 +0000 | [diff] [blame] | 1163 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1164 |     } | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1165 | } | 
 | 1166 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1167 |  | 
 | 1168 | /* Parse a socket address argument according to the socket object's | 
 | 1169 |    address family.  Return 1 if the address was in the proper format, | 
 | 1170 |    0 of not.  The address is returned through addr_ret, its length | 
 | 1171 |    through len_ret. */ | 
 | 1172 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1173 | static int | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1174 | getsockaddrarg(PySocketSockObject *s, PyObject *args, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1175 |                struct sockaddr *addr_ret, int *len_ret) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1176 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1177 |     switch (s->sock_family) { | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1178 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 1179 | #if defined(AF_UNIX) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1180 |     case AF_UNIX: | 
 | 1181 |     { | 
 | 1182 |         struct sockaddr_un* addr; | 
 | 1183 |         char *path; | 
 | 1184 |         int len; | 
 | 1185 |         if (!PyArg_Parse(args, "t#", &path, &len)) | 
 | 1186 |             return 0; | 
| Martin v. Löwis | 046c4d1 | 2006-12-03 11:23:45 +0000 | [diff] [blame] | 1187 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1188 |         addr = (struct sockaddr_un*)addr_ret; | 
| Armin Rigo | a9017c3 | 2006-04-19 11:50:27 +0000 | [diff] [blame] | 1189 | #ifdef linux | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1190 |         if (len > 0 && path[0] == 0) { | 
 | 1191 |             /* Linux abstract namespace extension */ | 
 | 1192 |             if (len > sizeof addr->sun_path) { | 
 | 1193 |                 PyErr_SetString(socket_error, | 
 | 1194 |                                 "AF_UNIX path too long"); | 
 | 1195 |                 return 0; | 
 | 1196 |             } | 
 | 1197 |         } | 
 | 1198 |         else | 
| Armin Rigo | a9017c3 | 2006-04-19 11:50:27 +0000 | [diff] [blame] | 1199 | #endif /* linux */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1200 |         { | 
 | 1201 |             /* regular NULL-terminated string */ | 
 | 1202 |             if (len >= sizeof addr->sun_path) { | 
 | 1203 |                 PyErr_SetString(socket_error, | 
 | 1204 |                                 "AF_UNIX path too long"); | 
 | 1205 |                 return 0; | 
 | 1206 |             } | 
 | 1207 |             addr->sun_path[len] = 0; | 
 | 1208 |         } | 
 | 1209 |         addr->sun_family = s->sock_family; | 
 | 1210 |         memcpy(addr->sun_path, path, len); | 
| Andrew MacIntyre | daedf21 | 2004-04-11 12:03:57 +0000 | [diff] [blame] | 1211 | #if defined(PYOS_OS2) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1212 |         *len_ret = sizeof(*addr); | 
| Andrew MacIntyre | daedf21 | 2004-04-11 12:03:57 +0000 | [diff] [blame] | 1213 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1214 |         *len_ret = len + offsetof(struct sockaddr_un, sun_path); | 
| Andrew MacIntyre | daedf21 | 2004-04-11 12:03:57 +0000 | [diff] [blame] | 1215 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1216 |         return 1; | 
 | 1217 |     } | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1218 | #endif /* AF_UNIX */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1219 |  | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1220 | #if defined(AF_NETLINK) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1221 |     case AF_NETLINK: | 
 | 1222 |     { | 
 | 1223 |         struct sockaddr_nl* addr; | 
 | 1224 |         int pid, groups; | 
 | 1225 |         addr = (struct sockaddr_nl *)addr_ret; | 
 | 1226 |         if (!PyTuple_Check(args)) { | 
 | 1227 |             PyErr_Format( | 
 | 1228 |                 PyExc_TypeError, | 
 | 1229 |                 "getsockaddrarg: " | 
 | 1230 |                 "AF_NETLINK address must be tuple, not %.500s", | 
 | 1231 |                 Py_TYPE(args)->tp_name); | 
 | 1232 |             return 0; | 
 | 1233 |         } | 
 | 1234 |         if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups)) | 
 | 1235 |             return 0; | 
 | 1236 |         addr->nl_family = AF_NETLINK; | 
 | 1237 |         addr->nl_pid = pid; | 
 | 1238 |         addr->nl_groups = groups; | 
 | 1239 |         *len_ret = sizeof(*addr); | 
 | 1240 |         return 1; | 
 | 1241 |     } | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1242 | #endif | 
 | 1243 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1244 |     case AF_INET: | 
 | 1245 |     { | 
 | 1246 |         struct sockaddr_in* addr; | 
 | 1247 |         char *host; | 
 | 1248 |         int port, result; | 
 | 1249 |         if (!PyTuple_Check(args)) { | 
 | 1250 |             PyErr_Format( | 
 | 1251 |                 PyExc_TypeError, | 
 | 1252 |                 "getsockaddrarg: " | 
 | 1253 |                 "AF_INET address must be tuple, not %.500s", | 
 | 1254 |                 Py_TYPE(args)->tp_name); | 
 | 1255 |             return 0; | 
 | 1256 |         } | 
 | 1257 |         if (!PyArg_ParseTuple(args, "eti:getsockaddrarg", | 
 | 1258 |                               "idna", &host, &port)) | 
 | 1259 |             return 0; | 
 | 1260 |         addr=(struct sockaddr_in*)addr_ret; | 
 | 1261 |         result = setipaddr(host, (struct sockaddr *)addr, | 
 | 1262 |                            sizeof(*addr),  AF_INET); | 
 | 1263 |         PyMem_Free(host); | 
 | 1264 |         if (result < 0) | 
 | 1265 |             return 0; | 
 | 1266 |         if (port < 0 || port > 0xffff) { | 
 | 1267 |             PyErr_SetString( | 
 | 1268 |                 PyExc_OverflowError, | 
 | 1269 |                 "getsockaddrarg: port must be 0-65535."); | 
 | 1270 |             return 0; | 
 | 1271 |         } | 
 | 1272 |         addr->sin_family = AF_INET; | 
 | 1273 |         addr->sin_port = htons((short)port); | 
 | 1274 |         *len_ret = sizeof *addr; | 
 | 1275 |         return 1; | 
 | 1276 |     } | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1277 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 1278 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1279 |     case AF_INET6: | 
 | 1280 |     { | 
 | 1281 |         struct sockaddr_in6* addr; | 
 | 1282 |         char *host; | 
 | 1283 |         int port, flowinfo, scope_id, result; | 
 | 1284 |         flowinfo = scope_id = 0; | 
 | 1285 |         if (!PyTuple_Check(args)) { | 
 | 1286 |             PyErr_Format( | 
 | 1287 |                 PyExc_TypeError, | 
 | 1288 |                 "getsockaddrarg: " | 
 | 1289 |                 "AF_INET6 address must be tuple, not %.500s", | 
 | 1290 |                 Py_TYPE(args)->tp_name); | 
 | 1291 |             return 0; | 
 | 1292 |         } | 
 | 1293 |         if (!PyArg_ParseTuple(args, "eti|ii", | 
 | 1294 |                               "idna", &host, &port, &flowinfo, | 
 | 1295 |                               &scope_id)) { | 
 | 1296 |             return 0; | 
 | 1297 |         } | 
 | 1298 |         addr = (struct sockaddr_in6*)addr_ret; | 
 | 1299 |         result = setipaddr(host, (struct sockaddr *)addr, | 
 | 1300 |                            sizeof(*addr), AF_INET6); | 
 | 1301 |         PyMem_Free(host); | 
 | 1302 |         if (result < 0) | 
 | 1303 |             return 0; | 
 | 1304 |         if (port < 0 || port > 0xffff) { | 
 | 1305 |             PyErr_SetString( | 
 | 1306 |                 PyExc_OverflowError, | 
 | 1307 |                 "getsockaddrarg: port must be 0-65535."); | 
 | 1308 |             return 0; | 
 | 1309 |         } | 
 | 1310 |         addr->sin6_family = s->sock_family; | 
 | 1311 |         addr->sin6_port = htons((short)port); | 
 | 1312 |         addr->sin6_flowinfo = flowinfo; | 
 | 1313 |         addr->sin6_scope_id = scope_id; | 
 | 1314 |         *len_ret = sizeof *addr; | 
 | 1315 |         return 1; | 
 | 1316 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1317 | #endif | 
 | 1318 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1319 | #ifdef USE_BLUETOOTH | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1320 |     case AF_BLUETOOTH: | 
 | 1321 |     { | 
 | 1322 |         switch (s->sock_proto) { | 
 | 1323 |         case BTPROTO_L2CAP: | 
 | 1324 |         { | 
 | 1325 |             struct sockaddr_l2 *addr; | 
 | 1326 |             char *straddr; | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1327 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1328 |             addr = (struct sockaddr_l2 *)addr_ret; | 
 | 1329 |             memset(addr, 0, sizeof(struct sockaddr_l2)); | 
 | 1330 |             _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1331 |             if (!PyArg_ParseTuple(args, "si", &straddr, | 
 | 1332 |                                   &_BT_L2_MEMB(addr, psm))) { | 
 | 1333 |                 PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1334 |                                 "wrong format"); | 
 | 1335 |                 return 0; | 
 | 1336 |             } | 
 | 1337 |             if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) | 
 | 1338 |                 return 0; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1339 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1340 |             *len_ret = sizeof *addr; | 
 | 1341 |             return 1; | 
 | 1342 |         } | 
 | 1343 |         case BTPROTO_RFCOMM: | 
 | 1344 |         { | 
 | 1345 |             struct sockaddr_rc *addr; | 
 | 1346 |             char *straddr; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1347 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1348 |             addr = (struct sockaddr_rc *)addr_ret; | 
 | 1349 |             _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1350 |             if (!PyArg_ParseTuple(args, "si", &straddr, | 
 | 1351 |                                   &_BT_RC_MEMB(addr, channel))) { | 
 | 1352 |                 PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1353 |                                 "wrong format"); | 
 | 1354 |                 return 0; | 
 | 1355 |             } | 
 | 1356 |             if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0) | 
 | 1357 |                 return 0; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1358 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1359 |             *len_ret = sizeof *addr; | 
 | 1360 |             return 1; | 
 | 1361 |         } | 
 | 1362 |         case BTPROTO_HCI: | 
 | 1363 |         { | 
 | 1364 |             struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret; | 
 | 1365 |             _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1366 |             if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) { | 
 | 1367 |                 PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1368 |                                 "wrong format"); | 
 | 1369 |                 return 0; | 
 | 1370 |             } | 
 | 1371 |             *len_ret = sizeof *addr; | 
 | 1372 |             return 1; | 
 | 1373 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1374 | #if !defined(__FreeBSD__) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1375 |         case BTPROTO_SCO: | 
 | 1376 |         { | 
 | 1377 |             struct sockaddr_sco *addr; | 
 | 1378 |             char *straddr; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1379 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1380 |             addr = (struct sockaddr_sco *)addr_ret; | 
 | 1381 |             _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1382 |             straddr = PyString_AsString(args); | 
 | 1383 |             if (straddr == NULL) { | 
 | 1384 |                 PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1385 |                                 "wrong format"); | 
 | 1386 |                 return 0; | 
 | 1387 |             } | 
 | 1388 |             if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) | 
 | 1389 |                 return 0; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1390 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1391 |             *len_ret = sizeof *addr; | 
 | 1392 |             return 1; | 
 | 1393 |         } | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1394 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1395 |         default: | 
 | 1396 |             PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol"); | 
 | 1397 |             return 0; | 
 | 1398 |         } | 
 | 1399 |     } | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1400 | #endif | 
 | 1401 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 1402 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1403 |     case AF_PACKET: | 
 | 1404 |     { | 
 | 1405 |         struct sockaddr_ll* addr; | 
 | 1406 |         struct ifreq ifr; | 
 | 1407 |         char *interfaceName; | 
 | 1408 |         int protoNumber; | 
 | 1409 |         int hatype = 0; | 
 | 1410 |         int pkttype = 0; | 
 | 1411 |         char *haddr = NULL; | 
 | 1412 |         unsigned int halen = 0; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1413 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1414 |         if (!PyTuple_Check(args)) { | 
 | 1415 |             PyErr_Format( | 
 | 1416 |                 PyExc_TypeError, | 
 | 1417 |                 "getsockaddrarg: " | 
 | 1418 |                 "AF_PACKET address must be tuple, not %.500s", | 
 | 1419 |                 Py_TYPE(args)->tp_name); | 
 | 1420 |             return 0; | 
 | 1421 |         } | 
 | 1422 |         if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName, | 
 | 1423 |                               &protoNumber, &pkttype, &hatype, | 
 | 1424 |                               &haddr, &halen)) | 
 | 1425 |             return 0; | 
 | 1426 |         strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)); | 
 | 1427 |         ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; | 
 | 1428 |         if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { | 
 | 1429 |             s->errorhandler(); | 
 | 1430 |             return 0; | 
 | 1431 |         } | 
 | 1432 |         if (halen > 8) { | 
 | 1433 |           PyErr_SetString(PyExc_ValueError, | 
 | 1434 |                           "Hardware address must be 8 bytes or less"); | 
 | 1435 |           return 0; | 
 | 1436 |         } | 
 | 1437 |         if (protoNumber < 0 || protoNumber > 0xffff) { | 
 | 1438 |             PyErr_SetString( | 
 | 1439 |                 PyExc_OverflowError, | 
 | 1440 |                 "getsockaddrarg: protoNumber must be 0-65535."); | 
 | 1441 |             return 0; | 
 | 1442 |         } | 
 | 1443 |         addr = (struct sockaddr_ll*)addr_ret; | 
 | 1444 |         addr->sll_family = AF_PACKET; | 
 | 1445 |         addr->sll_protocol = htons((short)protoNumber); | 
 | 1446 |         addr->sll_ifindex = ifr.ifr_ifindex; | 
 | 1447 |         addr->sll_pkttype = pkttype; | 
 | 1448 |         addr->sll_hatype = hatype; | 
 | 1449 |         if (halen != 0) { | 
 | 1450 |           memcpy(&addr->sll_addr, haddr, halen); | 
 | 1451 |         } | 
 | 1452 |         addr->sll_halen = halen; | 
 | 1453 |         *len_ret = sizeof *addr; | 
 | 1454 |         return 1; | 
 | 1455 |     } | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1456 | #endif | 
 | 1457 |  | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1458 | #ifdef HAVE_LINUX_TIPC_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1459 |     case AF_TIPC: | 
 | 1460 |     { | 
 | 1461 |         unsigned int atype, v1, v2, v3; | 
 | 1462 |         unsigned int scope = TIPC_CLUSTER_SCOPE; | 
 | 1463 |         struct sockaddr_tipc *addr; | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1464 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1465 |         if (!PyTuple_Check(args)) { | 
 | 1466 |             PyErr_Format( | 
 | 1467 |                 PyExc_TypeError, | 
 | 1468 |                 "getsockaddrarg: " | 
 | 1469 |                 "AF_TIPC address must be tuple, not %.500s", | 
 | 1470 |                 Py_TYPE(args)->tp_name); | 
 | 1471 |             return 0; | 
 | 1472 |         } | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1473 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1474 |         if (!PyArg_ParseTuple(args, | 
 | 1475 |                                 "IIII|I;Invalid TIPC address format", | 
 | 1476 |                                 &atype, &v1, &v2, &v3, &scope)) | 
 | 1477 |             return 0; | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1478 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1479 |         addr = (struct sockaddr_tipc *) addr_ret; | 
 | 1480 |         memset(addr, 0, sizeof(struct sockaddr_tipc)); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1481 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1482 |         addr->family = AF_TIPC; | 
 | 1483 |         addr->scope = scope; | 
 | 1484 |         addr->addrtype = atype; | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1485 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1486 |         if (atype == TIPC_ADDR_NAMESEQ) { | 
 | 1487 |             addr->addr.nameseq.type = v1; | 
 | 1488 |             addr->addr.nameseq.lower = v2; | 
 | 1489 |             addr->addr.nameseq.upper = v3; | 
 | 1490 |         } else if (atype == TIPC_ADDR_NAME) { | 
 | 1491 |             addr->addr.name.name.type = v1; | 
 | 1492 |             addr->addr.name.name.instance = v2; | 
 | 1493 |         } else if (atype == TIPC_ADDR_ID) { | 
 | 1494 |             addr->addr.id.node = v1; | 
 | 1495 |             addr->addr.id.ref = v2; | 
 | 1496 |         } else { | 
 | 1497 |             /* Shouldn't happen */ | 
 | 1498 |             PyErr_SetString(PyExc_TypeError, "Invalid address type"); | 
 | 1499 |             return 0; | 
 | 1500 |         } | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1501 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1502 |         *len_ret = sizeof(*addr); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1503 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1504 |         return 1; | 
 | 1505 |     } | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1506 | #endif | 
 | 1507 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1508 |     /* More cases here... */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1509 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1510 |     default: | 
 | 1511 |         PyErr_SetString(socket_error, "getsockaddrarg: bad family"); | 
 | 1512 |         return 0; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1513 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1514 |     } | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1515 | } | 
 | 1516 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1517 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1518 | /* Get the address length according to the socket object's address family. | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1519 |    Return 1 if the family is known, 0 otherwise.  The length is returned | 
 | 1520 |    through len_ret. */ | 
 | 1521 |  | 
 | 1522 | static int | 
| Peter Schneider-Kamp | 618e25d | 2000-07-11 23:00:12 +0000 | [diff] [blame] | 1523 | getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1524 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1525 |     switch (s->sock_family) { | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1526 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 1527 | #if defined(AF_UNIX) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1528 |     case AF_UNIX: | 
 | 1529 |     { | 
 | 1530 |         *len_ret = sizeof (struct sockaddr_un); | 
 | 1531 |         return 1; | 
 | 1532 |     } | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1533 | #endif /* AF_UNIX */ | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1534 | #if defined(AF_NETLINK) | 
 | 1535 |        case AF_NETLINK: | 
 | 1536 |        { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1537 |            *len_ret = sizeof (struct sockaddr_nl); | 
 | 1538 |            return 1; | 
| Martin v. Löwis | 11017b1 | 2006-01-14 18:12:57 +0000 | [diff] [blame] | 1539 |        } | 
 | 1540 | #endif | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1541 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1542 |     case AF_INET: | 
 | 1543 |     { | 
 | 1544 |         *len_ret = sizeof (struct sockaddr_in); | 
 | 1545 |         return 1; | 
 | 1546 |     } | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1547 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 1548 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1549 |     case AF_INET6: | 
 | 1550 |     { | 
 | 1551 |         *len_ret = sizeof (struct sockaddr_in6); | 
 | 1552 |         return 1; | 
 | 1553 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1554 | #endif | 
 | 1555 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1556 | #ifdef USE_BLUETOOTH | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1557 |     case AF_BLUETOOTH: | 
 | 1558 |     { | 
 | 1559 |         switch(s->sock_proto) | 
 | 1560 |         { | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1561 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1562 |         case BTPROTO_L2CAP: | 
 | 1563 |             *len_ret = sizeof (struct sockaddr_l2); | 
 | 1564 |             return 1; | 
 | 1565 |         case BTPROTO_RFCOMM: | 
 | 1566 |             *len_ret = sizeof (struct sockaddr_rc); | 
 | 1567 |             return 1; | 
 | 1568 |         case BTPROTO_HCI: | 
 | 1569 |             *len_ret = sizeof (struct sockaddr_hci); | 
 | 1570 |             return 1; | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1571 | #if !defined(__FreeBSD__) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1572 |         case BTPROTO_SCO: | 
 | 1573 |             *len_ret = sizeof (struct sockaddr_sco); | 
 | 1574 |             return 1; | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1575 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1576 |         default: | 
 | 1577 |             PyErr_SetString(socket_error, "getsockaddrlen: " | 
 | 1578 |                             "unknown BT protocol"); | 
 | 1579 |             return 0; | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1580 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1581 |         } | 
 | 1582 |     } | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1583 | #endif | 
 | 1584 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 1585 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1586 |     case AF_PACKET: | 
 | 1587 |     { | 
 | 1588 |         *len_ret = sizeof (struct sockaddr_ll); | 
 | 1589 |         return 1; | 
 | 1590 |     } | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1591 | #endif | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1592 |  | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1593 | #ifdef HAVE_LINUX_TIPC_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1594 |     case AF_TIPC: | 
 | 1595 |     { | 
 | 1596 |         *len_ret = sizeof (struct sockaddr_tipc); | 
 | 1597 |         return 1; | 
 | 1598 |     } | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 1599 | #endif | 
 | 1600 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1601 |     /* More cases here... */ | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1602 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1603 |     default: | 
 | 1604 |         PyErr_SetString(socket_error, "getsockaddrlen: bad family"); | 
 | 1605 |         return 0; | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1606 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1607 |     } | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1608 | } | 
 | 1609 |  | 
 | 1610 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1611 | /* s.accept() method */ | 
 | 1612 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1613 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1614 | sock_accept(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1615 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1616 |     sock_addr_t addrbuf; | 
 | 1617 |     SOCKET_T newfd; | 
 | 1618 |     socklen_t addrlen; | 
 | 1619 |     PyObject *sock = NULL; | 
 | 1620 |     PyObject *addr = NULL; | 
 | 1621 |     PyObject *res = NULL; | 
 | 1622 |     int timeout; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1623 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1624 |     if (!getsockaddrlen(s, &addrlen)) | 
 | 1625 |         return NULL; | 
 | 1626 |     memset(&addrbuf, 0, addrlen); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1627 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1628 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1629 |     newfd = INVALID_SOCKET; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1630 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1631 |     newfd = -1; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1632 | #endif | 
 | 1633 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1634 |     if (!IS_SELECTABLE(s)) | 
 | 1635 |         return select_error(); | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 1636 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1637 |     Py_BEGIN_ALLOW_THREADS | 
 | 1638 |     timeout = internal_select(s, 0); | 
 | 1639 |     if (!timeout) | 
 | 1640 |         newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen); | 
 | 1641 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1642 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1643 |     if (timeout == 1) { | 
 | 1644 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 1645 |         return NULL; | 
 | 1646 |     } | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1647 |  | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1648 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1649 |     if (newfd == INVALID_SOCKET) | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1650 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1651 |     if (newfd < 0) | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1652 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1653 |         return s->errorhandler(); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1654 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1655 |     /* Create the new object with unspecified family, | 
 | 1656 |        to avoid calls to bind() etc. on it. */ | 
 | 1657 |     sock = (PyObject *) new_sockobject(newfd, | 
 | 1658 |                                        s->sock_family, | 
 | 1659 |                                        s->sock_type, | 
 | 1660 |                                        s->sock_proto); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1661 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1662 |     if (sock == NULL) { | 
 | 1663 |         SOCKETCLOSE(newfd); | 
 | 1664 |         goto finally; | 
 | 1665 |     } | 
 | 1666 |     addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), | 
 | 1667 |                         addrlen, s->sock_proto); | 
 | 1668 |     if (addr == NULL) | 
 | 1669 |         goto finally; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1670 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1671 |     res = PyTuple_Pack(2, sock, addr); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1672 |  | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1673 | finally: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1674 |     Py_XDECREF(sock); | 
 | 1675 |     Py_XDECREF(addr); | 
 | 1676 |     return res; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1677 | } | 
 | 1678 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1679 | PyDoc_STRVAR(accept_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1680 | "accept() -> (socket object, address info)\n\ | 
 | 1681 | \n\ | 
 | 1682 | Wait for an incoming connection.  Return a new socket representing the\n\ | 
 | 1683 | connection, and the address of the client.  For IP sockets, the address\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1684 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1685 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1686 | /* s.setblocking(flag) method.  Argument: | 
 | 1687 |    False -- non-blocking mode; same as settimeout(0) | 
 | 1688 |    True -- blocking mode; same as settimeout(None) | 
 | 1689 | */ | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1690 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1691 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1692 | sock_setblocking(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1693 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1694 |     int block; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1695 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1696 |     block = PyInt_AsLong(arg); | 
 | 1697 |     if (block == -1 && PyErr_Occurred()) | 
 | 1698 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1699 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1700 |     s->sock_timeout = block ? -1.0 : 0.0; | 
 | 1701 |     internal_setblocking(s, block); | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1702 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1703 |     Py_INCREF(Py_None); | 
 | 1704 |     return Py_None; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1705 | } | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1706 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1707 | PyDoc_STRVAR(setblocking_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1708 | "setblocking(flag)\n\ | 
 | 1709 | \n\ | 
 | 1710 | Set the socket to blocking (flag is true) or non-blocking (false).\n\ | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1711 | setblocking(True) is equivalent to settimeout(None);\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1712 | setblocking(False) is equivalent to settimeout(0.0)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1713 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1714 | /* s.settimeout(timeout) method.  Argument: | 
 | 1715 |    None -- no timeout, blocking mode; same as setblocking(True) | 
 | 1716 |    0.0  -- non-blocking mode; same as setblocking(False) | 
 | 1717 |    > 0  -- timeout mode; operations time out after timeout seconds | 
 | 1718 |    < 0  -- illegal; raises an exception | 
 | 1719 | */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1720 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1721 | sock_settimeout(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1722 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1723 |     double timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1724 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1725 |     if (arg == Py_None) | 
 | 1726 |         timeout = -1.0; | 
 | 1727 |     else { | 
 | 1728 |         timeout = PyFloat_AsDouble(arg); | 
 | 1729 |         if (timeout < 0.0) { | 
 | 1730 |             if (!PyErr_Occurred()) | 
 | 1731 |                 PyErr_SetString(PyExc_ValueError, | 
 | 1732 |                                 "Timeout value out of range"); | 
 | 1733 |             return NULL; | 
 | 1734 |         } | 
 | 1735 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1736 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1737 |     s->sock_timeout = timeout; | 
 | 1738 |     internal_setblocking(s, timeout < 0.0); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1739 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1740 |     Py_INCREF(Py_None); | 
 | 1741 |     return Py_None; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1742 | } | 
 | 1743 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1744 | PyDoc_STRVAR(settimeout_doc, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1745 | "settimeout(timeout)\n\ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1746 | \n\ | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1747 | Set a timeout on socket operations.  'timeout' can be a float,\n\ | 
 | 1748 | giving in seconds, or None.  Setting a timeout of None disables\n\ | 
 | 1749 | the timeout feature and is equivalent to setblocking(1).\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1750 | Setting a timeout of zero is the same as setblocking(0)."); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1751 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1752 | /* s.gettimeout() method. | 
 | 1753 |    Returns the timeout associated with a socket. */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1754 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1755 | sock_gettimeout(PySocketSockObject *s) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1756 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1757 |     if (s->sock_timeout < 0.0) { | 
 | 1758 |         Py_INCREF(Py_None); | 
 | 1759 |         return Py_None; | 
 | 1760 |     } | 
 | 1761 |     else | 
 | 1762 |         return PyFloat_FromDouble(s->sock_timeout); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1763 | } | 
 | 1764 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1765 | PyDoc_STRVAR(gettimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 1766 | "gettimeout() -> timeout\n\ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1767 | \n\ | 
 | 1768 | Returns the timeout in floating seconds associated with socket \n\ | 
 | 1769 | operations. A timeout of None indicates that timeouts on socket \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1770 | operations are disabled."); | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1771 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1772 | #ifdef RISCOS | 
 | 1773 | /* s.sleeptaskw(1 | 0) method */ | 
 | 1774 |  | 
 | 1775 | static PyObject * | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 1776 | sock_sleeptaskw(PySocketSockObject *s,PyObject *arg) | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1777 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1778 |     int block; | 
 | 1779 |     block = PyInt_AsLong(arg); | 
 | 1780 |     if (block == -1 && PyErr_Occurred()) | 
 | 1781 |         return NULL; | 
 | 1782 |     Py_BEGIN_ALLOW_THREADS | 
 | 1783 |     socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); | 
 | 1784 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1785 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1786 |     Py_INCREF(Py_None); | 
 | 1787 |     return Py_None; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1788 | } | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1789 | PyDoc_STRVAR(sleeptaskw_doc, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1790 | "sleeptaskw(flag)\n\ | 
 | 1791 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1792 | Allow sleeps in taskwindows."); | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1793 | #endif | 
 | 1794 |  | 
 | 1795 |  | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1796 | /* s.setsockopt() method. | 
 | 1797 |    With an integer third argument, sets an integer option. | 
 | 1798 |    With a string third argument, sets an option from a buffer; | 
 | 1799 |    use optional built-in module 'struct' to encode the string. */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1800 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1801 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1802 | sock_setsockopt(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1803 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1804 |     int level; | 
 | 1805 |     int optname; | 
 | 1806 |     int res; | 
 | 1807 |     char *buf; | 
 | 1808 |     int buflen; | 
 | 1809 |     int flag; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1810 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1811 |     if (PyArg_ParseTuple(args, "iii:setsockopt", | 
 | 1812 |                          &level, &optname, &flag)) { | 
 | 1813 |         buf = (char *) &flag; | 
 | 1814 |         buflen = sizeof flag; | 
 | 1815 |     } | 
 | 1816 |     else { | 
 | 1817 |         PyErr_Clear(); | 
 | 1818 |         if (!PyArg_ParseTuple(args, "iis#:setsockopt", | 
 | 1819 |                               &level, &optname, &buf, &buflen)) | 
 | 1820 |             return NULL; | 
 | 1821 |     } | 
 | 1822 |     res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen); | 
 | 1823 |     if (res < 0) | 
 | 1824 |         return s->errorhandler(); | 
 | 1825 |     Py_INCREF(Py_None); | 
 | 1826 |     return Py_None; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1827 | } | 
 | 1828 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1829 | PyDoc_STRVAR(setsockopt_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1830 | "setsockopt(level, option, value)\n\ | 
 | 1831 | \n\ | 
 | 1832 | Set a socket option.  See the Unix manual for level and option.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1833 | The value argument can either be an integer or a string."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1834 |  | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1835 |  | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1836 | /* s.getsockopt() method. | 
 | 1837 |    With two arguments, retrieves an integer option. | 
 | 1838 |    With a third integer argument, retrieves a string buffer of that size; | 
 | 1839 |    use optional built-in module 'struct' to decode the string. */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1840 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1841 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1842 | sock_getsockopt(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1843 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1844 |     int level; | 
 | 1845 |     int optname; | 
 | 1846 |     int res; | 
 | 1847 |     PyObject *buf; | 
 | 1848 |     socklen_t buflen = 0; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1849 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1850 | #ifdef __BEOS__ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1851 |     /* We have incomplete socket support. */ | 
 | 1852 |     PyErr_SetString(socket_error, "getsockopt not supported"); | 
 | 1853 |     return NULL; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1854 | #else | 
 | 1855 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1856 |     if (!PyArg_ParseTuple(args, "ii|i:getsockopt", | 
 | 1857 |                           &level, &optname, &buflen)) | 
 | 1858 |         return NULL; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1859 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1860 |     if (buflen == 0) { | 
 | 1861 |         int flag = 0; | 
 | 1862 |         socklen_t flagsize = sizeof flag; | 
 | 1863 |         res = getsockopt(s->sock_fd, level, optname, | 
 | 1864 |                          (void *)&flag, &flagsize); | 
 | 1865 |         if (res < 0) | 
 | 1866 |             return s->errorhandler(); | 
 | 1867 |         return PyInt_FromLong(flag); | 
 | 1868 |     } | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1869 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1870 |     /* socklen_t is unsigned so no negative test is needed, | 
 | 1871 |        test buflen == 0 is previously done */ | 
 | 1872 |     if (buflen > 1024) { | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1873 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1874 |     if (buflen <= 0 || buflen > 1024) { | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1875 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1876 |         PyErr_SetString(socket_error, | 
 | 1877 |                         "getsockopt buflen out of range"); | 
 | 1878 |         return NULL; | 
 | 1879 |     } | 
 | 1880 |     buf = PyString_FromStringAndSize((char *)NULL, buflen); | 
 | 1881 |     if (buf == NULL) | 
 | 1882 |         return NULL; | 
 | 1883 |     res = getsockopt(s->sock_fd, level, optname, | 
 | 1884 |                      (void *)PyString_AS_STRING(buf), &buflen); | 
 | 1885 |     if (res < 0) { | 
 | 1886 |         Py_DECREF(buf); | 
 | 1887 |         return s->errorhandler(); | 
 | 1888 |     } | 
 | 1889 |     _PyString_Resize(&buf, buflen); | 
 | 1890 |     return buf; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1891 | #endif /* __BEOS__ */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1892 | } | 
 | 1893 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1894 | PyDoc_STRVAR(getsockopt_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1895 | "getsockopt(level, option[, buffersize]) -> value\n\ | 
 | 1896 | \n\ | 
 | 1897 | Get a socket option.  See the Unix manual for level and option.\n\ | 
 | 1898 | If a nonzero buffersize argument is given, the return value is a\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1899 | string of that length; otherwise it is an integer."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1900 |  | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1901 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1902 | /* s.bind(sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1903 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1904 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1905 | sock_bind(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1906 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1907 |     sock_addr_t addrbuf; | 
 | 1908 |     int addrlen; | 
 | 1909 |     int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1910 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1911 |     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) | 
 | 1912 |         return NULL; | 
 | 1913 |     Py_BEGIN_ALLOW_THREADS | 
 | 1914 |     res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen); | 
 | 1915 |     Py_END_ALLOW_THREADS | 
 | 1916 |     if (res < 0) | 
 | 1917 |         return s->errorhandler(); | 
 | 1918 |     Py_INCREF(Py_None); | 
 | 1919 |     return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1920 | } | 
 | 1921 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1922 | PyDoc_STRVAR(bind_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1923 | "bind(address)\n\ | 
 | 1924 | \n\ | 
 | 1925 | Bind the socket to a local address.  For IP sockets, the address is a\n\ | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1926 | pair (host, port); the host must refer to the local host. For raw packet\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1927 | sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])"); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1928 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1929 |  | 
 | 1930 | /* s.close() method. | 
 | 1931 |    Set the file descriptor to -1 so operations tried subsequently | 
 | 1932 |    will surely fail. */ | 
 | 1933 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1934 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1935 | sock_close(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1936 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1937 |     SOCKET_T fd; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1938 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1939 |     if ((fd = s->sock_fd) != -1) { | 
 | 1940 |         s->sock_fd = -1; | 
 | 1941 |         Py_BEGIN_ALLOW_THREADS | 
 | 1942 |         (void) SOCKETCLOSE(fd); | 
 | 1943 |         Py_END_ALLOW_THREADS | 
 | 1944 |     } | 
 | 1945 |     Py_INCREF(Py_None); | 
 | 1946 |     return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1947 | } | 
 | 1948 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1949 | PyDoc_STRVAR(close_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1950 | "close()\n\ | 
 | 1951 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1952 | Close the socket.  It cannot be used after this call."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1953 |  | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1954 | static int | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1955 | internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1956 |                  int *timeoutp) | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1957 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1958 |     int res, timeout; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1959 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1960 |     timeout = 0; | 
 | 1961 |     res = connect(s->sock_fd, addr, addrlen); | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1962 |  | 
 | 1963 | #ifdef MS_WINDOWS | 
 | 1964 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 1965 |     if (s->sock_timeout > 0.0) { | 
 | 1966 |         if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK && | 
 | 1967 |             IS_SELECTABLE(s)) { | 
 | 1968 |             /* This is a mess.  Best solution: trust select */ | 
 | 1969 |             fd_set fds; | 
 | 1970 |             fd_set fds_exc; | 
 | 1971 |             struct timeval tv; | 
 | 1972 |             tv.tv_sec = (int)s->sock_timeout; | 
 | 1973 |             tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6); | 
 | 1974 |             FD_ZERO(&fds); | 
 | 1975 |             FD_SET(s->sock_fd, &fds); | 
 | 1976 |             FD_ZERO(&fds_exc); | 
 | 1977 |             FD_SET(s->sock_fd, &fds_exc); | 
 | 1978 |             res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv); | 
 | 1979 |             if (res == 0) { | 
 | 1980 |                 res = WSAEWOULDBLOCK; | 
 | 1981 |                 timeout = 1; | 
 | 1982 |             } else if (res > 0) { | 
 | 1983 |                 if (FD_ISSET(s->sock_fd, &fds)) | 
 | 1984 |                     /* The socket is in the writeable set - this | 
 | 1985 |                        means connected */ | 
 | 1986 |                     res = 0; | 
 | 1987 |                 else { | 
 | 1988 |                     /* As per MS docs, we need to call getsockopt() | 
 | 1989 |                        to get the underlying error */ | 
 | 1990 |                     int res_size = sizeof res; | 
 | 1991 |                     /* It must be in the exception set */ | 
 | 1992 |                     assert(FD_ISSET(s->sock_fd, &fds_exc)); | 
 | 1993 |                     if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, | 
 | 1994 |                                         (char *)&res, &res_size)) | 
 | 1995 |                         /* getsockopt also clears WSAGetLastError, | 
 | 1996 |                            so reset it back. */ | 
 | 1997 |                         WSASetLastError(res); | 
 | 1998 |                     else | 
 | 1999 |                         res = WSAGetLastError(); | 
 | 2000 |                 } | 
 | 2001 |             } | 
 | 2002 |             /* else if (res < 0) an error occurred */ | 
 | 2003 |         } | 
 | 2004 |     } | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2005 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2006 |     if (res < 0) | 
 | 2007 |         res = WSAGetLastError(); | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2008 |  | 
 | 2009 | #else | 
 | 2010 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2011 |     if (s->sock_timeout > 0.0) { | 
 | 2012 |         if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) { | 
 | 2013 |             timeout = internal_select(s, 1); | 
 | 2014 |             if (timeout == 0) { | 
 | 2015 |                 /* Bug #1019808: in case of an EINPROGRESS, | 
 | 2016 |                    use getsockopt(SO_ERROR) to get the real | 
 | 2017 |                    error. */ | 
 | 2018 |                 socklen_t res_size = sizeof res; | 
 | 2019 |                 (void)getsockopt(s->sock_fd, SOL_SOCKET, | 
 | 2020 |                                  SO_ERROR, &res, &res_size); | 
 | 2021 |                 if (res == EISCONN) | 
 | 2022 |                     res = 0; | 
 | 2023 |                 errno = res; | 
 | 2024 |             } | 
 | 2025 |             else if (timeout == -1) { | 
 | 2026 |                 res = errno;            /* had error */ | 
 | 2027 |             } | 
 | 2028 |             else | 
 | 2029 |                 res = EWOULDBLOCK;                      /* timed out */ | 
 | 2030 |         } | 
 | 2031 |     } | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2032 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2033 |     if (res < 0) | 
 | 2034 |         res = errno; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2035 |  | 
 | 2036 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2037 |     *timeoutp = timeout; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2038 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2039 |     return res; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 2040 | } | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2041 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 2042 | /* s.connect(sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2043 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2044 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2045 | sock_connect(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2046 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2047 |     sock_addr_t addrbuf; | 
 | 2048 |     int addrlen; | 
 | 2049 |     int res; | 
 | 2050 |     int timeout; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2051 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2052 |     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) | 
 | 2053 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2054 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2055 |     Py_BEGIN_ALLOW_THREADS | 
 | 2056 |     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout); | 
 | 2057 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2058 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2059 |     if (timeout == 1) { | 
 | 2060 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2061 |         return NULL; | 
 | 2062 |     } | 
 | 2063 |     if (res != 0) | 
 | 2064 |         return s->errorhandler(); | 
 | 2065 |     Py_INCREF(Py_None); | 
 | 2066 |     return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2067 | } | 
 | 2068 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2069 | PyDoc_STRVAR(connect_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2070 | "connect(address)\n\ | 
 | 2071 | \n\ | 
 | 2072 | Connect the socket to a remote address.  For IP sockets, the address\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2073 | is a pair (host, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2074 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2075 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 2076 | /* s.connect_ex(sockaddr) method */ | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 2077 |  | 
 | 2078 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2079 | sock_connect_ex(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 2080 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2081 |     sock_addr_t addrbuf; | 
 | 2082 |     int addrlen; | 
 | 2083 |     int res; | 
 | 2084 |     int timeout; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2085 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2086 |     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) | 
 | 2087 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2088 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2089 |     Py_BEGIN_ALLOW_THREADS | 
 | 2090 |     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout); | 
 | 2091 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2092 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2093 |     /* Signals are not errors (though they may raise exceptions).  Adapted | 
 | 2094 |        from PyErr_SetFromErrnoWithFilenameObject(). */ | 
| Neal Norwitz | 9b0ca79 | 2006-08-02 06:46:21 +0000 | [diff] [blame] | 2095 | #ifdef EINTR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2096 |     if (res == EINTR && PyErr_CheckSignals()) | 
 | 2097 |         return NULL; | 
| Neal Norwitz | 9b0ca79 | 2006-08-02 06:46:21 +0000 | [diff] [blame] | 2098 | #endif | 
 | 2099 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2100 |     return PyInt_FromLong((long) res); | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 2101 | } | 
 | 2102 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2103 | PyDoc_STRVAR(connect_ex_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 2104 | "connect_ex(address) -> errno\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2105 | \n\ | 
 | 2106 | This is like connect(address), but returns an error code (the errno value)\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2107 | instead of raising an exception when an error occurs."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2108 |  | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 2109 |  | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 2110 | /* s.fileno() method */ | 
 | 2111 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2112 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2113 | sock_fileno(PySocketSockObject *s) | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 2114 | { | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2115 | #if SIZEOF_SOCKET_T <= SIZEOF_LONG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2116 |     return PyInt_FromLong((long) s->sock_fd); | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2117 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2118 |     return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd); | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2119 | #endif | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 2120 | } | 
 | 2121 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2122 | PyDoc_STRVAR(fileno_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2123 | "fileno() -> integer\n\ | 
 | 2124 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2125 | Return the integer file descriptor of the socket."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2126 |  | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 2127 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2128 | #ifndef NO_DUP | 
 | 2129 | /* s.dup() method */ | 
 | 2130 |  | 
 | 2131 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2132 | sock_dup(PySocketSockObject *s) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2133 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2134 |     SOCKET_T newfd; | 
 | 2135 |     PyObject *sock; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2136 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2137 |     newfd = dup(s->sock_fd); | 
 | 2138 |     if (newfd < 0) | 
 | 2139 |         return s->errorhandler(); | 
 | 2140 |     sock = (PyObject *) new_sockobject(newfd, | 
 | 2141 |                                        s->sock_family, | 
 | 2142 |                                        s->sock_type, | 
 | 2143 |                                        s->sock_proto); | 
 | 2144 |     if (sock == NULL) | 
 | 2145 |         SOCKETCLOSE(newfd); | 
 | 2146 |     return sock; | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2147 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2148 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2149 | PyDoc_STRVAR(dup_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2150 | "dup() -> socket object\n\ | 
 | 2151 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2152 | Return a new socket object connected to the same system resource."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2153 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2154 | #endif | 
 | 2155 |  | 
 | 2156 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2157 | /* s.getsockname() method */ | 
 | 2158 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2159 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2160 | sock_getsockname(PySocketSockObject *s) | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2161 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2162 |     sock_addr_t addrbuf; | 
 | 2163 |     int res; | 
 | 2164 |     socklen_t addrlen; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 2165 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2166 |     if (!getsockaddrlen(s, &addrlen)) | 
 | 2167 |         return NULL; | 
 | 2168 |     memset(&addrbuf, 0, addrlen); | 
 | 2169 |     Py_BEGIN_ALLOW_THREADS | 
 | 2170 |     res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen); | 
 | 2171 |     Py_END_ALLOW_THREADS | 
 | 2172 |     if (res < 0) | 
 | 2173 |         return s->errorhandler(); | 
 | 2174 |     return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen, | 
 | 2175 |                         s->sock_proto); | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2176 | } | 
 | 2177 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2178 | PyDoc_STRVAR(getsockname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2179 | "getsockname() -> address info\n\ | 
 | 2180 | \n\ | 
 | 2181 | Return the address of the local endpoint.  For IP sockets, the address\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2182 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2183 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2184 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2185 | #ifdef HAVE_GETPEERNAME         /* Cray APP doesn't have this :-( */ | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2186 | /* s.getpeername() method */ | 
 | 2187 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2188 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2189 | sock_getpeername(PySocketSockObject *s) | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2190 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2191 |     sock_addr_t addrbuf; | 
 | 2192 |     int res; | 
 | 2193 |     socklen_t addrlen; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 2194 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2195 |     if (!getsockaddrlen(s, &addrlen)) | 
 | 2196 |         return NULL; | 
 | 2197 |     memset(&addrbuf, 0, addrlen); | 
 | 2198 |     Py_BEGIN_ALLOW_THREADS | 
 | 2199 |     res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen); | 
 | 2200 |     Py_END_ALLOW_THREADS | 
 | 2201 |     if (res < 0) | 
 | 2202 |         return s->errorhandler(); | 
 | 2203 |     return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen, | 
 | 2204 |                         s->sock_proto); | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2205 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2206 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2207 | PyDoc_STRVAR(getpeername_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2208 | "getpeername() -> address info\n\ | 
 | 2209 | \n\ | 
 | 2210 | Return the address of the remote endpoint.  For IP sockets, the address\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2211 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2212 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 2213 | #endif /* HAVE_GETPEERNAME */ | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 2214 |  | 
 | 2215 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2216 | /* s.listen(n) method */ | 
 | 2217 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2218 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2219 | sock_listen(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2220 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2221 |     int backlog; | 
 | 2222 |     int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2223 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2224 |     backlog = PyInt_AsLong(arg); | 
 | 2225 |     if (backlog == -1 && PyErr_Occurred()) | 
 | 2226 |         return NULL; | 
 | 2227 |     Py_BEGIN_ALLOW_THREADS | 
 | 2228 |     if (backlog < 1) | 
 | 2229 |         backlog = 1; | 
 | 2230 |     res = listen(s->sock_fd, backlog); | 
 | 2231 |     Py_END_ALLOW_THREADS | 
 | 2232 |     if (res < 0) | 
 | 2233 |         return s->errorhandler(); | 
 | 2234 |     Py_INCREF(Py_None); | 
 | 2235 |     return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2236 | } | 
 | 2237 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2238 | PyDoc_STRVAR(listen_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2239 | "listen(backlog)\n\ | 
 | 2240 | \n\ | 
 | 2241 | Enable a server to accept connections.  The backlog argument must be at\n\ | 
 | 2242 | least 1; it specifies the number of unaccepted connection that the system\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2243 | will allow before refusing new connections."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2244 |  | 
 | 2245 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2246 | #ifndef NO_DUP | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2247 | /* s.makefile(mode) method. | 
 | 2248 |    Create a new open file object referring to a dupped version of | 
 | 2249 |    the socket's file descriptor.  (The dup() call is necessary so | 
 | 2250 |    that the open file and socket objects may be closed independent | 
 | 2251 |    of each other.) | 
 | 2252 |    The mode argument specifies 'r' or 'w' passed to fdopen(). */ | 
 | 2253 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2254 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2255 | sock_makefile(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2256 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2257 |     extern int fclose(FILE *); | 
 | 2258 |     char *mode = "r"; | 
 | 2259 |     int bufsize = -1; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2260 | #ifdef MS_WIN32 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2261 |     Py_intptr_t fd; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2262 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2263 |     int fd; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2264 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2265 |     FILE *fp; | 
 | 2266 |     PyObject *f; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2267 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2268 |     char *mode_r = "r"; | 
 | 2269 |     char *mode_w = "w"; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2270 | #endif | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 2271 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2272 |     if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize)) | 
 | 2273 |         return NULL; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2274 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2275 |     if (strcmp(mode,"rb") == 0) { | 
 | 2276 |         mode = mode_r; | 
 | 2277 |     } | 
 | 2278 |     else { | 
 | 2279 |         if (strcmp(mode,"wb") == 0) { | 
 | 2280 |             mode = mode_w; | 
 | 2281 |         } | 
 | 2282 |     } | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2283 | #endif | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 2284 | #ifdef MS_WIN32 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2285 |     if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) || | 
 | 2286 |         ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) | 
| Guido van Rossum | 30b6b2b | 1995-06-14 22:28:08 +0000 | [diff] [blame] | 2287 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2288 |     if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL) | 
| Guido van Rossum | 30b6b2b | 1995-06-14 22:28:08 +0000 | [diff] [blame] | 2289 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2290 |     { | 
 | 2291 |         if (fd >= 0) | 
 | 2292 |             SOCKETCLOSE(fd); | 
 | 2293 |         return s->errorhandler(); | 
 | 2294 |     } | 
 | 2295 |     f = PyFile_FromFile(fp, "<socket>", mode, fclose); | 
 | 2296 |     if (f != NULL) | 
 | 2297 |         PyFile_SetBufSize(f, bufsize); | 
 | 2298 |     return f; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2299 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2300 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2301 | PyDoc_STRVAR(makefile_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2302 | "makefile([mode[, buffersize]]) -> file object\n\ | 
 | 2303 | \n\ | 
 | 2304 | Return a regular file object corresponding to the socket.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2305 | The mode and buffersize arguments are as for the built-in open() function."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2306 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2307 | #endif /* NO_DUP */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2308 |  | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2309 | /* | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2310 |  * This is the guts of the recv() and recv_into() methods, which reads into a | 
| Andrew M. Kuchling | 8d0baae | 2006-12-19 14:29:04 +0000 | [diff] [blame] | 2311 |  * char buffer.  If you have any inc/dec ref to do to the objects that contain | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2312 |  * the buffer, do it in the caller.  This function returns the number of bytes | 
 | 2313 |  * succesfully read.  If there was an error, it returns -1.  Note that it is | 
 | 2314 |  * also possible that we return a number of bytes smaller than the request | 
 | 2315 |  * bytes. | 
 | 2316 |  */ | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2317 | static ssize_t | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2318 | sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags) | 
 | 2319 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2320 |     ssize_t outlen = -1; | 
 | 2321 |     int timeout; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2322 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2323 |     int remaining; | 
 | 2324 |     char *read_buf; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2325 | #endif | 
 | 2326 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2327 |     if (!IS_SELECTABLE(s)) { | 
 | 2328 |         select_error(); | 
 | 2329 |         return -1; | 
 | 2330 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2331 |  | 
 | 2332 | #ifndef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2333 |     Py_BEGIN_ALLOW_THREADS | 
 | 2334 |     timeout = internal_select(s, 0); | 
 | 2335 |     if (!timeout) | 
 | 2336 |         outlen = recv(s->sock_fd, cbuf, len, flags); | 
 | 2337 |     Py_END_ALLOW_THREADS | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2338 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2339 |     if (timeout == 1) { | 
 | 2340 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2341 |         return -1; | 
 | 2342 |     } | 
 | 2343 |     if (outlen < 0) { | 
 | 2344 |         /* Note: the call to errorhandler() ALWAYS indirectly returned | 
 | 2345 |            NULL, so ignore its return value */ | 
 | 2346 |         s->errorhandler(); | 
 | 2347 |         return -1; | 
 | 2348 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2349 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2350 |     read_buf = cbuf; | 
 | 2351 |     remaining = len; | 
 | 2352 |     while (remaining != 0) { | 
 | 2353 |         unsigned int segment; | 
 | 2354 |         int nread = -1; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2355 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2356 |         segment = remaining /SEGMENT_SIZE; | 
 | 2357 |         if (segment != 0) { | 
 | 2358 |             segment = SEGMENT_SIZE; | 
 | 2359 |         } | 
 | 2360 |         else { | 
 | 2361 |             segment = remaining; | 
 | 2362 |         } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2363 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2364 |         Py_BEGIN_ALLOW_THREADS | 
 | 2365 |         timeout = internal_select(s, 0); | 
 | 2366 |         if (!timeout) | 
 | 2367 |             nread = recv(s->sock_fd, read_buf, segment, flags); | 
 | 2368 |         Py_END_ALLOW_THREADS | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2369 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2370 |         if (timeout == 1) { | 
 | 2371 |             PyErr_SetString(socket_timeout, "timed out"); | 
 | 2372 |             return -1; | 
 | 2373 |         } | 
 | 2374 |         if (nread < 0) { | 
 | 2375 |             s->errorhandler(); | 
 | 2376 |             return -1; | 
 | 2377 |         } | 
 | 2378 |         if (nread != remaining) { | 
 | 2379 |             read_buf += nread; | 
 | 2380 |             break; | 
 | 2381 |         } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2382 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2383 |         remaining -= segment; | 
 | 2384 |         read_buf += segment; | 
 | 2385 |     } | 
 | 2386 |     outlen = read_buf - cbuf; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2387 | #endif /* !__VMS */ | 
 | 2388 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2389 |     return outlen; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2390 | } | 
 | 2391 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2392 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2393 | /* s.recv(nbytes [,flags]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2394 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2395 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2396 | sock_recv(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2397 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2398 |     int recvlen, flags = 0; | 
 | 2399 |     ssize_t outlen; | 
 | 2400 |     PyObject *buf; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2401 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2402 |     if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags)) | 
 | 2403 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2404 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2405 |     if (recvlen < 0) { | 
 | 2406 |         PyErr_SetString(PyExc_ValueError, | 
 | 2407 |                         "negative buffersize in recv"); | 
 | 2408 |         return NULL; | 
 | 2409 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2410 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2411 |     /* Allocate a new string. */ | 
 | 2412 |     buf = PyString_FromStringAndSize((char *) 0, recvlen); | 
 | 2413 |     if (buf == NULL) | 
 | 2414 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2415 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2416 |     /* Call the guts */ | 
 | 2417 |     outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags); | 
 | 2418 |     if (outlen < 0) { | 
 | 2419 |         /* An error occurred, release the string and return an | 
 | 2420 |            error. */ | 
 | 2421 |         Py_DECREF(buf); | 
 | 2422 |         return NULL; | 
 | 2423 |     } | 
 | 2424 |     if (outlen != recvlen) { | 
 | 2425 |         /* We did not read as many bytes as we anticipated, resize the | 
 | 2426 |            string if possible and be succesful. */ | 
 | 2427 |         if (_PyString_Resize(&buf, outlen) < 0) | 
 | 2428 |             /* Oopsy, not so succesful after all. */ | 
 | 2429 |             return NULL; | 
 | 2430 |     } | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2431 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2432 |     return buf; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2433 | } | 
 | 2434 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2435 | PyDoc_STRVAR(recv_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2436 | "recv(buffersize[, flags]) -> data\n\ | 
 | 2437 | \n\ | 
 | 2438 | Receive up to buffersize bytes from the socket.  For the optional flags\n\ | 
 | 2439 | argument, see the Unix manual.  When no data is available, block until\n\ | 
 | 2440 | at least one byte is available or until the remote end is closed.  When\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2441 | the remote end is closed and all data is read, return the empty string."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2442 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2443 |  | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2444 | /* s.recv_into(buffer, [nbytes [,flags]]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2445 |  | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2446 | static PyObject* | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2447 | sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds) | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2448 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2449 |     static char *kwlist[] = {"buffer", "nbytes", "flags", 0}; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2450 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2451 |     int recvlen = 0, flags = 0; | 
 | 2452 |     ssize_t readlen; | 
 | 2453 |     Py_buffer buf; | 
 | 2454 |     Py_ssize_t buflen; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2455 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2456 |     /* Get the buffer's memory */ | 
 | 2457 |     if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist, | 
 | 2458 |                                      &buf, &recvlen, &flags)) | 
 | 2459 |         return NULL; | 
 | 2460 |     buflen = buf.len; | 
 | 2461 |     assert(buf.buf != 0 && buflen > 0); | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2462 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2463 |     if (recvlen < 0) { | 
 | 2464 |         PyErr_SetString(PyExc_ValueError, | 
 | 2465 |                         "negative buffersize in recv_into"); | 
 | 2466 |         goto error; | 
 | 2467 |     } | 
 | 2468 |     if (recvlen == 0) { | 
 | 2469 |         /* If nbytes was not specified, use the buffer's length */ | 
 | 2470 |         recvlen = buflen; | 
 | 2471 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2472 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2473 |     /* Check if the buffer is large enough */ | 
 | 2474 |     if (buflen < recvlen) { | 
 | 2475 |         PyErr_SetString(PyExc_ValueError, | 
 | 2476 |                         "buffer too small for requested bytes"); | 
 | 2477 |         goto error; | 
 | 2478 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2479 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2480 |     /* Call the guts */ | 
 | 2481 |     readlen = sock_recv_guts(s, buf.buf, recvlen, flags); | 
 | 2482 |     if (readlen < 0) { | 
 | 2483 |         /* Return an error. */ | 
 | 2484 |         goto error; | 
 | 2485 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2486 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2487 |     PyBuffer_Release(&buf); | 
 | 2488 |     /* Return the number of bytes read.  Note that we do not do anything | 
 | 2489 |        special here in the case that readlen < recvlen. */ | 
 | 2490 |     return PyInt_FromSsize_t(readlen); | 
| Antoine Pitrou | d7b731d | 2010-03-17 22:45:39 +0000 | [diff] [blame] | 2491 |  | 
 | 2492 | error: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2493 |     PyBuffer_Release(&buf); | 
 | 2494 |     return NULL; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2495 | } | 
 | 2496 |  | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2497 | PyDoc_STRVAR(recv_into_doc, | 
 | 2498 | "recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\ | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2499 | \n\ | 
 | 2500 | A version of recv() that stores its data into a buffer rather than creating \n\ | 
 | 2501 | a new string.  Receive up to buffersize bytes from the socket.  If buffersize \n\ | 
 | 2502 | is not specified (or 0), receive up to the size available in the given buffer.\n\ | 
 | 2503 | \n\ | 
 | 2504 | See recv() for documentation about the flags."); | 
 | 2505 |  | 
 | 2506 |  | 
 | 2507 | /* | 
| Guido van Rossum | 3c887b2 | 2007-12-18 20:10:42 +0000 | [diff] [blame] | 2508 |  * This is the guts of the recvfrom() and recvfrom_into() methods, which reads | 
 | 2509 |  * into a char buffer.  If you have any inc/def ref to do to the objects that | 
 | 2510 |  * contain the buffer, do it in the caller.  This function returns the number | 
 | 2511 |  * of bytes succesfully read.  If there was an error, it returns -1.  Note | 
 | 2512 |  * that it is also possible that we return a number of bytes smaller than the | 
 | 2513 |  * request bytes. | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2514 |  * | 
 | 2515 |  * 'addr' is a return value for the address object.  Note that you must decref | 
 | 2516 |  * it yourself. | 
 | 2517 |  */ | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2518 | static ssize_t | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2519 | sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2520 |                    PyObject** addr) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2521 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2522 |     sock_addr_t addrbuf; | 
 | 2523 |     int timeout; | 
 | 2524 |     ssize_t n = -1; | 
 | 2525 |     socklen_t addrlen; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2526 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2527 |     *addr = NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2528 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2529 |     if (!getsockaddrlen(s, &addrlen)) | 
 | 2530 |         return -1; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2531 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2532 |     if (!IS_SELECTABLE(s)) { | 
 | 2533 |         select_error(); | 
 | 2534 |         return -1; | 
 | 2535 |     } | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 2536 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2537 |     Py_BEGIN_ALLOW_THREADS | 
 | 2538 |     memset(&addrbuf, 0, addrlen); | 
 | 2539 |     timeout = internal_select(s, 0); | 
 | 2540 |     if (!timeout) { | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 2541 | #ifndef MS_WINDOWS | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 2542 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2543 |         n = recvfrom(s->sock_fd, cbuf, len, flags, | 
 | 2544 |                      SAS2SA(&addrbuf), &addrlen); | 
| Guido van Rossum | 32c575d | 1997-12-02 20:37:32 +0000 | [diff] [blame] | 2545 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2546 |         n = recvfrom(s->sock_fd, cbuf, len, flags, | 
 | 2547 |                      (void *) &addrbuf, &addrlen); | 
| Guido van Rossum | 32c575d | 1997-12-02 20:37:32 +0000 | [diff] [blame] | 2548 | #endif | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2549 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2550 |         n = recvfrom(s->sock_fd, cbuf, len, flags, | 
 | 2551 |                      SAS2SA(&addrbuf), &addrlen); | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2552 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2553 |     } | 
 | 2554 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2555 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2556 |     if (timeout == 1) { | 
 | 2557 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2558 |         return -1; | 
 | 2559 |     } | 
 | 2560 |     if (n < 0) { | 
 | 2561 |         s->errorhandler(); | 
 | 2562 |         return -1; | 
 | 2563 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2564 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2565 |     if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), | 
 | 2566 |                                addrlen, s->sock_proto))) | 
 | 2567 |         return -1; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2568 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2569 |     return n; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2570 | } | 
 | 2571 |  | 
 | 2572 | /* s.recvfrom(nbytes [,flags]) method */ | 
 | 2573 |  | 
 | 2574 | static PyObject * | 
 | 2575 | sock_recvfrom(PySocketSockObject *s, PyObject *args) | 
 | 2576 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2577 |     PyObject *buf = NULL; | 
 | 2578 |     PyObject *addr = NULL; | 
 | 2579 |     PyObject *ret = NULL; | 
 | 2580 |     int recvlen, flags = 0; | 
 | 2581 |     ssize_t outlen; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2582 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2583 |     if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags)) | 
 | 2584 |         return NULL; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2585 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2586 |     if (recvlen < 0) { | 
 | 2587 |         PyErr_SetString(PyExc_ValueError, | 
 | 2588 |                         "negative buffersize in recvfrom"); | 
 | 2589 |         return NULL; | 
 | 2590 |     } | 
| Facundo Batista | 1fe9f96 | 2007-03-28 03:45:20 +0000 | [diff] [blame] | 2591 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2592 |     buf = PyString_FromStringAndSize((char *) 0, recvlen); | 
 | 2593 |     if (buf == NULL) | 
 | 2594 |         return NULL; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2595 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2596 |     outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf), | 
 | 2597 |                                 recvlen, flags, &addr); | 
 | 2598 |     if (outlen < 0) { | 
 | 2599 |         goto finally; | 
 | 2600 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2601 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2602 |     if (outlen != recvlen) { | 
 | 2603 |         /* We did not read as many bytes as we anticipated, resize the | 
 | 2604 |            string if possible and be succesful. */ | 
 | 2605 |         if (_PyString_Resize(&buf, outlen) < 0) | 
 | 2606 |             /* Oopsy, not so succesful after all. */ | 
 | 2607 |             goto finally; | 
 | 2608 |     } | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 2609 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2610 |     ret = PyTuple_Pack(2, buf, addr); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2611 |  | 
 | 2612 | finally: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2613 |     Py_XDECREF(buf); | 
 | 2614 |     Py_XDECREF(addr); | 
 | 2615 |     return ret; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2616 | } | 
 | 2617 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2618 | PyDoc_STRVAR(recvfrom_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2619 | "recvfrom(buffersize[, flags]) -> (data, address info)\n\ | 
 | 2620 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2621 | Like recv(buffersize, flags) but also return the sender's address info."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2622 |  | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2623 |  | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2624 | /* s.recvfrom_into(buffer[, nbytes [,flags]]) method */ | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2625 |  | 
 | 2626 | static PyObject * | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2627 | sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds) | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2628 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2629 |     static char *kwlist[] = {"buffer", "nbytes", "flags", 0}; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2630 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2631 |     int recvlen = 0, flags = 0; | 
 | 2632 |     ssize_t readlen; | 
 | 2633 |     Py_buffer buf; | 
 | 2634 |     int buflen; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2635 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2636 |     PyObject *addr = NULL; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2637 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2638 |     if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into", | 
 | 2639 |                                      kwlist, &buf, | 
 | 2640 |                                      &recvlen, &flags)) | 
 | 2641 |         return NULL; | 
 | 2642 |     buflen = buf.len; | 
 | 2643 |     assert(buf.buf != 0 && buflen > 0); | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2644 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2645 |     if (recvlen < 0) { | 
 | 2646 |         PyErr_SetString(PyExc_ValueError, | 
 | 2647 |                         "negative buffersize in recvfrom_into"); | 
 | 2648 |         goto error; | 
 | 2649 |     } | 
 | 2650 |     if (recvlen == 0) { | 
 | 2651 |         /* If nbytes was not specified, use the buffer's length */ | 
 | 2652 |         recvlen = buflen; | 
 | 2653 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2654 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2655 |     readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr); | 
 | 2656 |     if (readlen < 0) { | 
 | 2657 |         /* Return an error */ | 
 | 2658 |         goto error; | 
 | 2659 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2660 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2661 |     PyBuffer_Release(&buf); | 
 | 2662 |     /* Return the number of bytes read and the address.  Note that we do | 
 | 2663 |        not do anything special here in the case that readlen < recvlen. */ | 
 | 2664 |     return Py_BuildValue("lN", readlen, addr); | 
| Antoine Pitrou | d7b731d | 2010-03-17 22:45:39 +0000 | [diff] [blame] | 2665 |  | 
 | 2666 | error: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2667 |     Py_XDECREF(addr); | 
 | 2668 |     PyBuffer_Release(&buf); | 
 | 2669 |     return NULL; | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2670 | } | 
 | 2671 |  | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2672 | PyDoc_STRVAR(recvfrom_into_doc, | 
 | 2673 | "recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\ | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2674 | \n\ | 
| Martin Blais | af2ae72 | 2006-06-04 13:49:49 +0000 | [diff] [blame] | 2675 | Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info."); | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 2676 |  | 
 | 2677 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2678 | /* s.send(data [,flags]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2679 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2680 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2681 | sock_send(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2682 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2683 |     char *buf; | 
 | 2684 |     int len, n = -1, flags = 0, timeout; | 
 | 2685 |     Py_buffer pbuf; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2686 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2687 |     if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags)) | 
 | 2688 |         return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2689 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2690 |     if (!IS_SELECTABLE(s)) { | 
 | 2691 |         PyBuffer_Release(&pbuf); | 
 | 2692 |         return select_error(); | 
 | 2693 |     } | 
 | 2694 |     buf = pbuf.buf; | 
 | 2695 |     len = pbuf.len; | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 2696 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2697 |     Py_BEGIN_ALLOW_THREADS | 
 | 2698 |     timeout = internal_select(s, 1); | 
 | 2699 |     if (!timeout) | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2700 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2701 |         n = sendsegmented(s->sock_fd, buf, len, flags); | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2702 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2703 |         n = send(s->sock_fd, buf, len, flags); | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2704 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2705 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2706 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2707 |     PyBuffer_Release(&pbuf); | 
| Martin v. Löwis | f91d46a | 2008-08-12 14:49:50 +0000 | [diff] [blame] | 2708 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2709 |     if (timeout == 1) { | 
 | 2710 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2711 |         return NULL; | 
 | 2712 |     } | 
 | 2713 |     if (n < 0) | 
 | 2714 |         return s->errorhandler(); | 
 | 2715 |     return PyInt_FromLong((long)n); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2716 | } | 
 | 2717 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2718 | PyDoc_STRVAR(send_doc, | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2719 | "send(data[, flags]) -> count\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2720 | \n\ | 
 | 2721 | Send a data string to the socket.  For the optional flags\n\ | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2722 | argument, see the Unix manual.  Return the number of bytes\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2723 | sent; this may be less than len(data) if the network is busy."); | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2724 |  | 
 | 2725 |  | 
 | 2726 | /* s.sendall(data [,flags]) method */ | 
 | 2727 |  | 
 | 2728 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2729 | sock_sendall(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2730 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2731 |     char *buf; | 
 | 2732 |     int len, n = -1, flags = 0, timeout; | 
 | 2733 |     Py_buffer pbuf; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2734 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2735 |     if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags)) | 
 | 2736 |         return NULL; | 
 | 2737 |     buf = pbuf.buf; | 
 | 2738 |     len = pbuf.len; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2739 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2740 |     if (!IS_SELECTABLE(s)) { | 
 | 2741 |         PyBuffer_Release(&pbuf); | 
 | 2742 |         return select_error(); | 
 | 2743 |     } | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 2744 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2745 |     Py_BEGIN_ALLOW_THREADS | 
 | 2746 |     do { | 
 | 2747 |         timeout = internal_select(s, 1); | 
 | 2748 |         n = -1; | 
 | 2749 |         if (timeout) | 
 | 2750 |             break; | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2751 | #ifdef __VMS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2752 |         n = sendsegmented(s->sock_fd, buf, len, flags); | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2753 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2754 |         n = send(s->sock_fd, buf, len, flags); | 
| Neal Norwitz | 2a30cd0 | 2006-07-10 01:18:57 +0000 | [diff] [blame] | 2755 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2756 |         if (n < 0) { | 
| Gregory P. Smith | c4ad034 | 2009-08-13 18:54:50 +0000 | [diff] [blame] | 2757 | #ifdef EINTR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2758 |             /* We must handle EINTR here as there is no way for | 
 | 2759 |              * the caller to know how much was sent otherwise.  */ | 
 | 2760 |             if (errno == EINTR) { | 
 | 2761 |                 /* Run signal handlers.  If an exception was | 
 | 2762 |                  * raised, abort and leave this socket in | 
 | 2763 |                  * an unknown state. */ | 
 | 2764 |                 if (PyErr_CheckSignals()) | 
 | 2765 |                     return NULL; | 
 | 2766 |                 continue; | 
 | 2767 |             } | 
| Gregory P. Smith | c4ad034 | 2009-08-13 18:54:50 +0000 | [diff] [blame] | 2768 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2769 |             break; | 
 | 2770 |         } | 
 | 2771 |         buf += n; | 
 | 2772 |         len -= n; | 
 | 2773 |     } while (len > 0); | 
 | 2774 |     Py_END_ALLOW_THREADS | 
 | 2775 |     PyBuffer_Release(&pbuf); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2776 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2777 |     if (timeout == 1) { | 
 | 2778 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2779 |         return NULL; | 
 | 2780 |     } | 
 | 2781 |     if (n < 0) | 
 | 2782 |         return s->errorhandler(); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2783 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2784 |     Py_INCREF(Py_None); | 
 | 2785 |     return Py_None; | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2786 | } | 
 | 2787 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2788 | PyDoc_STRVAR(sendall_doc, | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2789 | "sendall(data[, flags])\n\ | 
 | 2790 | \n\ | 
 | 2791 | Send a data string to the socket.  For the optional flags\n\ | 
 | 2792 | argument, see the Unix manual.  This calls send() repeatedly\n\ | 
 | 2793 | until all data is sent.  If an error occurs, it's impossible\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2794 | to tell how much data has been sent."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2795 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2796 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2797 | /* s.sendto(data, [flags,] sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2798 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2799 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2800 | sock_sendto(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2801 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2802 |     Py_buffer pbuf; | 
 | 2803 |     PyObject *addro; | 
 | 2804 |     char *buf; | 
 | 2805 |     Py_ssize_t len; | 
 | 2806 |     sock_addr_t addrbuf; | 
 | 2807 |     int addrlen, n = -1, flags, timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2808 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2809 |     flags = 0; | 
 | 2810 |     if (!PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro)) { | 
 | 2811 |         PyErr_Clear(); | 
 | 2812 |         if (!PyArg_ParseTuple(args, "s*iO:sendto", | 
 | 2813 |                               &pbuf, &flags, &addro)) | 
 | 2814 |             return NULL; | 
 | 2815 |     } | 
 | 2816 |     buf = pbuf.buf; | 
 | 2817 |     len = pbuf.len; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2818 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2819 |     if (!IS_SELECTABLE(s)) { | 
 | 2820 |         PyBuffer_Release(&pbuf); | 
 | 2821 |         return select_error(); | 
 | 2822 |     } | 
| Neal Norwitz | 082b2df | 2006-02-07 07:04:46 +0000 | [diff] [blame] | 2823 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2824 |     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) { | 
 | 2825 |         PyBuffer_Release(&pbuf); | 
 | 2826 |         return NULL; | 
 | 2827 |     } | 
| Martin v. Löwis | 046c4d1 | 2006-12-03 11:23:45 +0000 | [diff] [blame] | 2828 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2829 |     Py_BEGIN_ALLOW_THREADS | 
 | 2830 |     timeout = internal_select(s, 1); | 
 | 2831 |     if (!timeout) | 
 | 2832 |         n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen); | 
 | 2833 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2834 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2835 |     PyBuffer_Release(&pbuf); | 
 | 2836 |     if (timeout == 1) { | 
 | 2837 |         PyErr_SetString(socket_timeout, "timed out"); | 
 | 2838 |         return NULL; | 
 | 2839 |     } | 
 | 2840 |     if (n < 0) | 
 | 2841 |         return s->errorhandler(); | 
 | 2842 |     return PyInt_FromLong((long)n); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2843 | } | 
 | 2844 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2845 | PyDoc_STRVAR(sendto_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 2846 | "sendto(data[, flags], address) -> count\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2847 | \n\ | 
 | 2848 | Like send(data, flags) but allows specifying the destination address.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2849 | For IP sockets, the address is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2850 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2851 |  | 
 | 2852 | /* s.shutdown(how) method */ | 
 | 2853 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2854 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2855 | sock_shutdown(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2856 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2857 |     int how; | 
 | 2858 |     int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2859 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2860 |     how = PyInt_AsLong(arg); | 
 | 2861 |     if (how == -1 && PyErr_Occurred()) | 
 | 2862 |         return NULL; | 
 | 2863 |     Py_BEGIN_ALLOW_THREADS | 
 | 2864 |     res = shutdown(s->sock_fd, how); | 
 | 2865 |     Py_END_ALLOW_THREADS | 
 | 2866 |     if (res < 0) | 
 | 2867 |         return s->errorhandler(); | 
 | 2868 |     Py_INCREF(Py_None); | 
 | 2869 |     return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2870 | } | 
 | 2871 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2872 | PyDoc_STRVAR(shutdown_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2873 | "shutdown(flag)\n\ | 
 | 2874 | \n\ | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 2875 | Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\ | 
 | 2876 | of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2877 |  | 
| Amaury Forgeot d'Arc | a4dd2e2 | 2008-06-13 00:42:22 +0000 | [diff] [blame] | 2878 | #if defined(MS_WINDOWS) && defined(SIO_RCVALL) | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2879 | static PyObject* | 
 | 2880 | sock_ioctl(PySocketSockObject *s, PyObject *arg) | 
 | 2881 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2882 |     unsigned long cmd = SIO_RCVALL; | 
 | 2883 |     PyObject *argO; | 
 | 2884 |     DWORD recv; | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2885 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2886 |     if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO)) | 
 | 2887 |         return NULL; | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2888 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2889 |     switch (cmd) { | 
 | 2890 |     case SIO_RCVALL: { | 
 | 2891 |         unsigned int option = RCVALL_ON; | 
 | 2892 |         if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option)) | 
 | 2893 |             return NULL; | 
 | 2894 |         if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option), | 
 | 2895 |                          NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { | 
 | 2896 |             return set_error(); | 
 | 2897 |         } | 
 | 2898 |         return PyLong_FromUnsignedLong(recv); } | 
 | 2899 |     case SIO_KEEPALIVE_VALS: { | 
 | 2900 |         struct tcp_keepalive ka; | 
 | 2901 |         if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd, | 
 | 2902 |                         &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval)) | 
 | 2903 |             return NULL; | 
 | 2904 |         if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka), | 
 | 2905 |                          NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) { | 
 | 2906 |             return set_error(); | 
 | 2907 |         } | 
 | 2908 |         return PyLong_FromUnsignedLong(recv); } | 
 | 2909 |     default: | 
 | 2910 |         PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd); | 
 | 2911 |         return NULL; | 
 | 2912 |     } | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2913 | } | 
 | 2914 | PyDoc_STRVAR(sock_ioctl_doc, | 
 | 2915 | "ioctl(cmd, option) -> long\n\ | 
 | 2916 | \n\ | 
| Kristján Valur Jónsson | 2fcd03b | 2009-09-25 15:19:51 +0000 | [diff] [blame] | 2917 | Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\ | 
 | 2918 | SIO_RCVALL:  'option' must be one of the socket.RCVALL_* constants.\n\ | 
 | 2919 | SIO_KEEPALIVE_VALS:  'option' is a tuple of (onoff, timeout, interval)."); | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2920 |  | 
 | 2921 | #endif | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2922 |  | 
 | 2923 | /* List of methods for socket objects */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2924 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2925 | static PyMethodDef sock_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2926 |     {"accept",            (PyCFunction)sock_accept, METH_NOARGS, | 
 | 2927 |                       accept_doc}, | 
 | 2928 |     {"bind",              (PyCFunction)sock_bind, METH_O, | 
 | 2929 |                       bind_doc}, | 
 | 2930 |     {"close",             (PyCFunction)sock_close, METH_NOARGS, | 
 | 2931 |                       close_doc}, | 
 | 2932 |     {"connect",           (PyCFunction)sock_connect, METH_O, | 
 | 2933 |                       connect_doc}, | 
 | 2934 |     {"connect_ex",        (PyCFunction)sock_connect_ex, METH_O, | 
 | 2935 |                       connect_ex_doc}, | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2936 | #ifndef NO_DUP | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2937 |     {"dup",               (PyCFunction)sock_dup, METH_NOARGS, | 
 | 2938 |                       dup_doc}, | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2939 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2940 |     {"fileno",            (PyCFunction)sock_fileno, METH_NOARGS, | 
 | 2941 |                       fileno_doc}, | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 2942 | #ifdef HAVE_GETPEERNAME | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2943 |     {"getpeername",       (PyCFunction)sock_getpeername, | 
 | 2944 |                       METH_NOARGS, getpeername_doc}, | 
| Guido van Rossum | 9575a44 | 1993-04-07 14:06:14 +0000 | [diff] [blame] | 2945 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2946 |     {"getsockname",       (PyCFunction)sock_getsockname, | 
 | 2947 |                       METH_NOARGS, getsockname_doc}, | 
 | 2948 |     {"getsockopt",        (PyCFunction)sock_getsockopt, METH_VARARGS, | 
 | 2949 |                       getsockopt_doc}, | 
| Amaury Forgeot d'Arc | a4dd2e2 | 2008-06-13 00:42:22 +0000 | [diff] [blame] | 2950 | #if defined(MS_WINDOWS) && defined(SIO_RCVALL) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2951 |     {"ioctl",             (PyCFunction)sock_ioctl, METH_VARARGS, | 
 | 2952 |                       sock_ioctl_doc}, | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 2953 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2954 |     {"listen",            (PyCFunction)sock_listen, METH_O, | 
 | 2955 |                       listen_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2956 | #ifndef NO_DUP | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2957 |     {"makefile",          (PyCFunction)sock_makefile, METH_VARARGS, | 
 | 2958 |                       makefile_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2959 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2960 |     {"recv",              (PyCFunction)sock_recv, METH_VARARGS, | 
 | 2961 |                       recv_doc}, | 
 | 2962 |     {"recv_into",         (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS, | 
 | 2963 |                       recv_into_doc}, | 
 | 2964 |     {"recvfrom",          (PyCFunction)sock_recvfrom, METH_VARARGS, | 
 | 2965 |                       recvfrom_doc}, | 
 | 2966 |     {"recvfrom_into",  (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS, | 
 | 2967 |                       recvfrom_into_doc}, | 
 | 2968 |     {"send",              (PyCFunction)sock_send, METH_VARARGS, | 
 | 2969 |                       send_doc}, | 
 | 2970 |     {"sendall",           (PyCFunction)sock_sendall, METH_VARARGS, | 
 | 2971 |                       sendall_doc}, | 
 | 2972 |     {"sendto",            (PyCFunction)sock_sendto, METH_VARARGS, | 
 | 2973 |                       sendto_doc}, | 
 | 2974 |     {"setblocking",       (PyCFunction)sock_setblocking, METH_O, | 
 | 2975 |                       setblocking_doc}, | 
 | 2976 |     {"settimeout",    (PyCFunction)sock_settimeout, METH_O, | 
 | 2977 |                       settimeout_doc}, | 
 | 2978 |     {"gettimeout",    (PyCFunction)sock_gettimeout, METH_NOARGS, | 
 | 2979 |                       gettimeout_doc}, | 
 | 2980 |     {"setsockopt",        (PyCFunction)sock_setsockopt, METH_VARARGS, | 
 | 2981 |                       setsockopt_doc}, | 
 | 2982 |     {"shutdown",          (PyCFunction)sock_shutdown, METH_O, | 
 | 2983 |                       shutdown_doc}, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2984 | #ifdef RISCOS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2985 |     {"sleeptaskw",        (PyCFunction)sock_sleeptaskw, METH_O, | 
 | 2986 |                       sleeptaskw_doc}, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2987 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 2988 |     {NULL,                      NULL}           /* sentinel */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2989 | }; | 
 | 2990 |  | 
| Georg Brandl | bc45a3f | 2006-03-17 19:17:34 +0000 | [diff] [blame] | 2991 | /* SockObject members */ | 
 | 2992 | static PyMemberDef sock_memberlist[] = { | 
 | 2993 |        {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"}, | 
 | 2994 |        {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"}, | 
 | 2995 |        {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"}, | 
 | 2996 |        {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"}, | 
 | 2997 |        {0}, | 
 | 2998 | }; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2999 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3000 | /* Deallocate a socket object in response to the last Py_DECREF(). | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3001 |    First close the file description. */ | 
 | 3002 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3003 | static void | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3004 | sock_dealloc(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3005 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3006 |     if (s->sock_fd != -1) | 
 | 3007 |         (void) SOCKETCLOSE(s->sock_fd); | 
 | 3008 |     Py_TYPE(s)->tp_free((PyObject *)s); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3009 | } | 
 | 3010 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3011 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3012 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3013 | sock_repr(PySocketSockObject *s) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3014 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3015 |     char buf[512]; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 3016 | #if SIZEOF_SOCKET_T > SIZEOF_LONG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3017 |     if (s->sock_fd > LONG_MAX) { | 
 | 3018 |         /* this can occur on Win64, and actually there is a special | 
 | 3019 |            ugly printf formatter for decimal pointer length integer | 
 | 3020 |            printing, only bother if necessary*/ | 
 | 3021 |         PyErr_SetString(PyExc_OverflowError, | 
 | 3022 |                         "no printf formatter to display " | 
 | 3023 |                         "the socket descriptor in decimal"); | 
 | 3024 |         return NULL; | 
 | 3025 |     } | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 3026 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3027 |     PyOS_snprintf( | 
 | 3028 |         buf, sizeof(buf), | 
 | 3029 |         "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>", | 
 | 3030 |         (long)s->sock_fd, s->sock_family, | 
 | 3031 |         s->sock_type, | 
 | 3032 |         s->sock_proto); | 
 | 3033 |     return PyString_FromString(buf); | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3034 | } | 
 | 3035 |  | 
 | 3036 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3037 | /* Create a new, uninitialized socket object. */ | 
 | 3038 |  | 
 | 3039 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3040 | sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3041 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3042 |     PyObject *new; | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3043 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3044 |     new = type->tp_alloc(type, 0); | 
 | 3045 |     if (new != NULL) { | 
 | 3046 |         ((PySocketSockObject *)new)->sock_fd = -1; | 
 | 3047 |         ((PySocketSockObject *)new)->sock_timeout = -1.0; | 
 | 3048 |         ((PySocketSockObject *)new)->errorhandler = &set_error; | 
 | 3049 |     } | 
 | 3050 |     return new; | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3051 | } | 
 | 3052 |  | 
 | 3053 |  | 
 | 3054 | /* Initialize a new socket object. */ | 
 | 3055 |  | 
 | 3056 | /*ARGSUSED*/ | 
 | 3057 | static int | 
| Andrew MacIntyre | 7aec4a2 | 2002-06-13 11:53:52 +0000 | [diff] [blame] | 3058 | sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3059 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3060 |     PySocketSockObject *s = (PySocketSockObject *)self; | 
 | 3061 |     SOCKET_T fd; | 
 | 3062 |     int family = AF_INET, type = SOCK_STREAM, proto = 0; | 
 | 3063 |     static char *keywords[] = {"family", "type", "proto", 0}; | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3064 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3065 |     if (!PyArg_ParseTupleAndKeywords(args, kwds, | 
 | 3066 |                                      "|iii:socket", keywords, | 
 | 3067 |                                      &family, &type, &proto)) | 
 | 3068 |         return -1; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3069 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3070 |     Py_BEGIN_ALLOW_THREADS | 
 | 3071 |     fd = socket(family, type, proto); | 
 | 3072 |     Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3073 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3074 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3075 |     if (fd == INVALID_SOCKET) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3076 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3077 |     if (fd < 0) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3078 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3079 |     { | 
 | 3080 |         set_error(); | 
 | 3081 |         return -1; | 
 | 3082 |     } | 
 | 3083 |     init_sockobject(s, fd, family, type, proto); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3084 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3085 |     return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3086 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3087 | } | 
 | 3088 |  | 
 | 3089 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 3090 | /* Type object for socket objects. */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3091 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3092 | static PyTypeObject sock_type = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3093 |     PyVarObject_HEAD_INIT(0, 0)         /* Must fill in type value later */ | 
 | 3094 |     "_socket.socket",                           /* tp_name */ | 
 | 3095 |     sizeof(PySocketSockObject),                 /* tp_basicsize */ | 
 | 3096 |     0,                                          /* tp_itemsize */ | 
 | 3097 |     (destructor)sock_dealloc,                   /* tp_dealloc */ | 
 | 3098 |     0,                                          /* tp_print */ | 
 | 3099 |     0,                                          /* tp_getattr */ | 
 | 3100 |     0,                                          /* tp_setattr */ | 
 | 3101 |     0,                                          /* tp_compare */ | 
 | 3102 |     (reprfunc)sock_repr,                        /* tp_repr */ | 
 | 3103 |     0,                                          /* tp_as_number */ | 
 | 3104 |     0,                                          /* tp_as_sequence */ | 
 | 3105 |     0,                                          /* tp_as_mapping */ | 
 | 3106 |     0,                                          /* tp_hash */ | 
 | 3107 |     0,                                          /* tp_call */ | 
 | 3108 |     0,                                          /* tp_str */ | 
 | 3109 |     PyObject_GenericGetAttr,                    /* tp_getattro */ | 
 | 3110 |     0,                                          /* tp_setattro */ | 
 | 3111 |     0,                                          /* tp_as_buffer */ | 
 | 3112 |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ | 
 | 3113 |     sock_doc,                                   /* tp_doc */ | 
 | 3114 |     0,                                          /* tp_traverse */ | 
 | 3115 |     0,                                          /* tp_clear */ | 
 | 3116 |     0,                                          /* tp_richcompare */ | 
 | 3117 |     0,                                          /* tp_weaklistoffset */ | 
 | 3118 |     0,                                          /* tp_iter */ | 
 | 3119 |     0,                                          /* tp_iternext */ | 
 | 3120 |     sock_methods,                               /* tp_methods */ | 
 | 3121 |     sock_memberlist,                            /* tp_members */ | 
 | 3122 |     0,                                          /* tp_getset */ | 
 | 3123 |     0,                                          /* tp_base */ | 
 | 3124 |     0,                                          /* tp_dict */ | 
 | 3125 |     0,                                          /* tp_descr_get */ | 
 | 3126 |     0,                                          /* tp_descr_set */ | 
 | 3127 |     0,                                          /* tp_dictoffset */ | 
 | 3128 |     sock_initobj,                               /* tp_init */ | 
 | 3129 |     PyType_GenericAlloc,                        /* tp_alloc */ | 
 | 3130 |     sock_new,                                   /* tp_new */ | 
 | 3131 |     PyObject_Del,                               /* tp_free */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3132 | }; | 
 | 3133 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3134 |  | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 3135 | /* Python interface to gethostname(). */ | 
 | 3136 |  | 
 | 3137 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3138 | static PyObject * | 
| Georg Brandl | 96a8c39 | 2006-05-29 21:04:52 +0000 | [diff] [blame] | 3139 | socket_gethostname(PyObject *self, PyObject *unused) | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 3140 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3141 |     char buf[1024]; | 
 | 3142 |     int res; | 
 | 3143 |     Py_BEGIN_ALLOW_THREADS | 
 | 3144 |     res = gethostname(buf, (int) sizeof buf - 1); | 
 | 3145 |     Py_END_ALLOW_THREADS | 
 | 3146 |     if (res < 0) | 
 | 3147 |         return set_error(); | 
 | 3148 |     buf[sizeof buf - 1] = '\0'; | 
 | 3149 |     return PyString_FromString(buf); | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 3150 | } | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 3151 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3152 | PyDoc_STRVAR(gethostname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3153 | "gethostname() -> string\n\ | 
 | 3154 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3155 | Return the current host name."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3156 |  | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 3157 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3158 | /* Python interface to gethostbyname(name). */ | 
 | 3159 |  | 
 | 3160 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3161 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3162 | socket_gethostbyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3163 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3164 |     char *name; | 
 | 3165 |     sock_addr_t addrbuf; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3166 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3167 |     if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) | 
 | 3168 |         return NULL; | 
 | 3169 |     if (setipaddr(name, SAS2SA(&addrbuf),  sizeof(addrbuf), AF_INET) < 0) | 
 | 3170 |         return NULL; | 
 | 3171 |     return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in)); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3172 | } | 
 | 3173 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3174 | PyDoc_STRVAR(gethostbyname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3175 | "gethostbyname(host) -> address\n\ | 
 | 3176 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3177 | Return the IP address (a string of the form '255.255.255.255') for a host."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3178 |  | 
 | 3179 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3180 | /* Convenience function common to gethostbyname_ex and gethostbyaddr */ | 
 | 3181 |  | 
 | 3182 | static PyObject * | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3183 | gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3184 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3185 |     char **pch; | 
 | 3186 |     PyObject *rtn_tuple = (PyObject *)NULL; | 
 | 3187 |     PyObject *name_list = (PyObject *)NULL; | 
 | 3188 |     PyObject *addr_list = (PyObject *)NULL; | 
 | 3189 |     PyObject *tmp; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3190 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3191 |     if (h == NULL) { | 
 | 3192 |         /* Let's get real error message to return */ | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 3193 | #ifndef RISCOS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3194 |         set_herror(h_errno); | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 3195 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3196 |         PyErr_SetString(socket_error, "host not found"); | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 3197 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3198 |         return NULL; | 
 | 3199 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3200 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3201 |     if (h->h_addrtype != af) { | 
 | 3202 |         /* Let's get real error message to return */ | 
 | 3203 |         PyErr_SetString(socket_error, | 
 | 3204 |                         (char *)strerror(EAFNOSUPPORT)); | 
| Brett Cannon | 10ed0f5 | 2008-03-18 15:35:58 +0000 | [diff] [blame] | 3205 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3206 |         return NULL; | 
 | 3207 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3208 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3209 |     switch (af) { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3210 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3211 |     case AF_INET: | 
 | 3212 |         if (alen < sizeof(struct sockaddr_in)) | 
 | 3213 |             return NULL; | 
 | 3214 |         break; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3215 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 3216 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3217 |     case AF_INET6: | 
 | 3218 |         if (alen < sizeof(struct sockaddr_in6)) | 
 | 3219 |             return NULL; | 
 | 3220 |         break; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3221 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3222 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3223 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3224 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3225 |     if ((name_list = PyList_New(0)) == NULL) | 
 | 3226 |         goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3227 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3228 |     if ((addr_list = PyList_New(0)) == NULL) | 
 | 3229 |         goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3230 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3231 |     /* SF #1511317: h_aliases can be NULL */ | 
 | 3232 |     if (h->h_aliases) { | 
 | 3233 |         for (pch = h->h_aliases; *pch != NULL; pch++) { | 
 | 3234 |             int status; | 
 | 3235 |             tmp = PyString_FromString(*pch); | 
 | 3236 |             if (tmp == NULL) | 
 | 3237 |                 goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3238 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3239 |             status = PyList_Append(name_list, tmp); | 
 | 3240 |             Py_DECREF(tmp); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3241 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3242 |             if (status) | 
 | 3243 |                 goto err; | 
 | 3244 |         } | 
 | 3245 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3246 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3247 |     for (pch = h->h_addr_list; *pch != NULL; pch++) { | 
 | 3248 |         int status; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3249 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3250 |         switch (af) { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3251 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3252 |         case AF_INET: | 
 | 3253 |             { | 
 | 3254 |             struct sockaddr_in sin; | 
 | 3255 |             memset(&sin, 0, sizeof(sin)); | 
 | 3256 |             sin.sin_family = af; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3257 | #ifdef HAVE_SOCKADDR_SA_LEN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3258 |             sin.sin_len = sizeof(sin); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3259 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3260 |             memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr)); | 
 | 3261 |             tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3262 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3263 |             if (pch == h->h_addr_list && alen >= sizeof(sin)) | 
 | 3264 |                 memcpy((char *) addr, &sin, sizeof(sin)); | 
 | 3265 |             break; | 
 | 3266 |             } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3267 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 3268 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3269 |         case AF_INET6: | 
 | 3270 |             { | 
 | 3271 |             struct sockaddr_in6 sin6; | 
 | 3272 |             memset(&sin6, 0, sizeof(sin6)); | 
 | 3273 |             sin6.sin6_family = af; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3274 | #ifdef HAVE_SOCKADDR_SA_LEN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3275 |             sin6.sin6_len = sizeof(sin6); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3276 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3277 |             memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr)); | 
 | 3278 |             tmp = makeipaddr((struct sockaddr *)&sin6, | 
 | 3279 |                 sizeof(sin6)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3280 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3281 |             if (pch == h->h_addr_list && alen >= sizeof(sin6)) | 
 | 3282 |                 memcpy((char *) addr, &sin6, sizeof(sin6)); | 
 | 3283 |             break; | 
 | 3284 |             } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3285 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3286 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3287 |         default:                /* can't happen */ | 
 | 3288 |             PyErr_SetString(socket_error, | 
 | 3289 |                             "unsupported address family"); | 
 | 3290 |             return NULL; | 
 | 3291 |         } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3292 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3293 |         if (tmp == NULL) | 
 | 3294 |             goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3295 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3296 |         status = PyList_Append(addr_list, tmp); | 
 | 3297 |         Py_DECREF(tmp); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3298 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3299 |         if (status) | 
 | 3300 |             goto err; | 
 | 3301 |     } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3302 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3303 |     rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 3304 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3305 |  err: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3306 |     Py_XDECREF(name_list); | 
 | 3307 |     Py_XDECREF(addr_list); | 
 | 3308 |     return rtn_tuple; | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3309 | } | 
 | 3310 |  | 
 | 3311 |  | 
 | 3312 | /* Python interface to gethostbyname_ex(name). */ | 
 | 3313 |  | 
 | 3314 | /*ARGSUSED*/ | 
 | 3315 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3316 | socket_gethostbyname_ex(PyObject *self, PyObject *args) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3317 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3318 |     char *name; | 
 | 3319 |     struct hostent *h; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 3320 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3321 |     struct sockaddr_storage addr; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 3322 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3323 |     struct sockaddr_in addr; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 3324 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3325 |     struct sockaddr *sa; | 
 | 3326 |     PyObject *ret; | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3327 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3328 |     struct hostent hp_allocated; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3329 | #ifdef HAVE_GETHOSTBYNAME_R_3_ARG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3330 |     struct hostent_data data; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3331 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3332 |     char buf[16384]; | 
 | 3333 |     int buf_len = (sizeof buf) - 1; | 
 | 3334 |     int errnop; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3335 | #endif | 
 | 3336 | #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3337 |     int result; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 3338 | #endif | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3339 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3340 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3341 |     if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name)) | 
 | 3342 |         return NULL; | 
 | 3343 |     if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0) | 
 | 3344 |         return NULL; | 
 | 3345 |     Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3346 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3347 | #if   defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3348 |     result = gethostbyname_r(name, &hp_allocated, buf, buf_len, | 
 | 3349 |                              &h, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3350 | #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3351 |     h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3352 | #else /* HAVE_GETHOSTBYNAME_R_3_ARG */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3353 |     memset((void *) &data, '\0', sizeof(data)); | 
 | 3354 |     result = gethostbyname_r(name, &hp_allocated, &data); | 
 | 3355 |     h = (result != 0) ? NULL : &hp_allocated; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 3356 | #endif | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3357 | #else /* not HAVE_GETHOSTBYNAME_R */ | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 3358 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3359 |     PyThread_acquire_lock(netdb_lock, 1); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3360 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3361 |     h = gethostbyname(name); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3362 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3363 |     Py_END_ALLOW_THREADS | 
 | 3364 |     /* Some C libraries would require addr.__ss_family instead of | 
 | 3365 |        addr.ss_family. | 
 | 3366 |        Therefore, we cast the sockaddr_storage into sockaddr to | 
 | 3367 |        access sa_family. */ | 
 | 3368 |     sa = (struct sockaddr*)&addr; | 
 | 3369 |     ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), | 
 | 3370 |                          sa->sa_family); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 3371 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3372 |     PyThread_release_lock(netdb_lock); | 
| Guido van Rossum | 955becc | 1999-03-22 20:14:53 +0000 | [diff] [blame] | 3373 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3374 |     return ret; | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3375 | } | 
 | 3376 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3377 | PyDoc_STRVAR(ghbn_ex_doc, | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3378 | "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\ | 
 | 3379 | \n\ | 
 | 3380 | Return the true host name, a list of aliases, and a list of IP addresses,\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3381 | for a host.  The host argument is a string giving a host name or IP number."); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 3382 |  | 
 | 3383 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3384 | /* Python interface to gethostbyaddr(IP). */ | 
 | 3385 |  | 
 | 3386 | /*ARGSUSED*/ | 
 | 3387 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3388 | socket_gethostbyaddr(PyObject *self, PyObject *args) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3389 | { | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 3390 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3391 |     struct sockaddr_storage addr; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3392 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3393 |     struct sockaddr_in addr; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3394 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3395 |     struct sockaddr *sa = (struct sockaddr *)&addr; | 
 | 3396 |     char *ip_num; | 
 | 3397 |     struct hostent *h; | 
 | 3398 |     PyObject *ret; | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3399 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3400 |     struct hostent hp_allocated; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3401 | #ifdef HAVE_GETHOSTBYNAME_R_3_ARG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3402 |     struct hostent_data data; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3403 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3404 |     /* glibcs up to 2.10 assume that the buf argument to | 
 | 3405 |        gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc | 
 | 3406 |        does not ensure. The attribute below instructs the compiler | 
 | 3407 |        to maintain this alignment. */ | 
 | 3408 |     char buf[16384] Py_ALIGNED(8); | 
 | 3409 |     int buf_len = (sizeof buf) - 1; | 
 | 3410 |     int errnop; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3411 | #endif | 
 | 3412 | #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3413 |     int result; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 3414 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3415 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3416 |     char *ap; | 
 | 3417 |     int al; | 
 | 3418 |     int af; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3419 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3420 |     if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num)) | 
 | 3421 |         return NULL; | 
 | 3422 |     af = AF_UNSPEC; | 
 | 3423 |     if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) | 
 | 3424 |         return NULL; | 
 | 3425 |     af = sa->sa_family; | 
 | 3426 |     ap = NULL; | 
 | 3427 |     switch (af) { | 
 | 3428 |     case AF_INET: | 
 | 3429 |         ap = (char *)&((struct sockaddr_in *)sa)->sin_addr; | 
 | 3430 |         al = sizeof(((struct sockaddr_in *)sa)->sin_addr); | 
 | 3431 |         break; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 3432 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3433 |     case AF_INET6: | 
 | 3434 |         ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr; | 
 | 3435 |         al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr); | 
 | 3436 |         break; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3437 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3438 |     default: | 
 | 3439 |         PyErr_SetString(socket_error, "unsupported address family"); | 
 | 3440 |         return NULL; | 
 | 3441 |     } | 
 | 3442 |     Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3443 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3444 | #if   defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3445 |     result = gethostbyaddr_r(ap, al, af, | 
 | 3446 |         &hp_allocated, buf, buf_len, | 
 | 3447 |         &h, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3448 | #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3449 |     h = gethostbyaddr_r(ap, al, af, | 
 | 3450 |                         &hp_allocated, buf, buf_len, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 3451 | #else /* HAVE_GETHOSTBYNAME_R_3_ARG */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3452 |     memset((void *) &data, '\0', sizeof(data)); | 
 | 3453 |     result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data); | 
 | 3454 |     h = (result != 0) ? NULL : &hp_allocated; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 3455 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3456 | #else /* not HAVE_GETHOSTBYNAME_R */ | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 3457 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3458 |     PyThread_acquire_lock(netdb_lock, 1); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3459 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3460 |     h = gethostbyaddr(ap, al, af); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 3461 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3462 |     Py_END_ALLOW_THREADS | 
 | 3463 |     ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 3464 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3465 |     PyThread_release_lock(netdb_lock); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 3466 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3467 |     return ret; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 3468 | } | 
 | 3469 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3470 | PyDoc_STRVAR(gethostbyaddr_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3471 | "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\ | 
 | 3472 | \n\ | 
 | 3473 | Return the true host name, a list of aliases, and a list of IP addresses,\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3474 | for a host.  The host argument is a string giving a host name or IP number."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3475 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3476 |  | 
 | 3477 | /* Python interface to getservbyname(name). | 
 | 3478 |    This only returns the port number, since the other info is already | 
 | 3479 |    known or not useful (like the list of aliases). */ | 
 | 3480 |  | 
 | 3481 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3482 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3483 | socket_getservbyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3484 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3485 |     char *name, *proto=NULL; | 
 | 3486 |     struct servent *sp; | 
 | 3487 |     if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto)) | 
 | 3488 |         return NULL; | 
 | 3489 |     Py_BEGIN_ALLOW_THREADS | 
 | 3490 |     sp = getservbyname(name, proto); | 
 | 3491 |     Py_END_ALLOW_THREADS | 
 | 3492 |     if (sp == NULL) { | 
 | 3493 |         PyErr_SetString(socket_error, "service/proto not found"); | 
 | 3494 |         return NULL; | 
 | 3495 |     } | 
 | 3496 |     return PyInt_FromLong((long) ntohs(sp->s_port)); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3497 | } | 
 | 3498 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3499 | PyDoc_STRVAR(getservbyname_doc, | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 3500 | "getservbyname(servicename[, protocolname]) -> integer\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3501 | \n\ | 
 | 3502 | Return a port number from a service name and protocol name.\n\ | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 3503 | The optional protocol name, if given, should be 'tcp' or 'udp',\n\ | 
 | 3504 | otherwise any protocol will match."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3505 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3506 |  | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 3507 | /* Python interface to getservbyport(port). | 
 | 3508 |    This only returns the service name, since the other info is already | 
 | 3509 |    known or not useful (like the list of aliases). */ | 
 | 3510 |  | 
 | 3511 | /*ARGSUSED*/ | 
 | 3512 | static PyObject * | 
 | 3513 | socket_getservbyport(PyObject *self, PyObject *args) | 
 | 3514 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3515 |     int port; | 
 | 3516 |     char *proto=NULL; | 
 | 3517 |     struct servent *sp; | 
 | 3518 |     if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto)) | 
 | 3519 |         return NULL; | 
 | 3520 |     if (port < 0 || port > 0xffff) { | 
 | 3521 |         PyErr_SetString( | 
 | 3522 |             PyExc_OverflowError, | 
 | 3523 |             "getservbyport: port must be 0-65535."); | 
 | 3524 |         return NULL; | 
 | 3525 |     } | 
 | 3526 |     Py_BEGIN_ALLOW_THREADS | 
 | 3527 |     sp = getservbyport(htons((short)port), proto); | 
 | 3528 |     Py_END_ALLOW_THREADS | 
 | 3529 |     if (sp == NULL) { | 
 | 3530 |         PyErr_SetString(socket_error, "port/proto not found"); | 
 | 3531 |         return NULL; | 
 | 3532 |     } | 
 | 3533 |     return PyString_FromString(sp->s_name); | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 3534 | } | 
 | 3535 |  | 
 | 3536 | PyDoc_STRVAR(getservbyport_doc, | 
 | 3537 | "getservbyport(port[, protocolname]) -> string\n\ | 
 | 3538 | \n\ | 
 | 3539 | Return the service name from a port number and protocol name.\n\ | 
 | 3540 | The optional protocol name, if given, should be 'tcp' or 'udp',\n\ | 
 | 3541 | otherwise any protocol will match."); | 
 | 3542 |  | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 3543 | /* Python interface to getprotobyname(name). | 
 | 3544 |    This only returns the protocol number, since the other info is | 
 | 3545 |    already known or not useful (like the list of aliases). */ | 
 | 3546 |  | 
 | 3547 | /*ARGSUSED*/ | 
 | 3548 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3549 | socket_getprotobyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 3550 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3551 |     char *name; | 
 | 3552 |     struct protoent *sp; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 3553 | #ifdef __BEOS__ | 
 | 3554 | /* Not available in BeOS yet. - [cjh] */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3555 |     PyErr_SetString(socket_error, "getprotobyname not supported"); | 
 | 3556 |     return NULL; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 3557 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3558 |     if (!PyArg_ParseTuple(args, "s:getprotobyname", &name)) | 
 | 3559 |         return NULL; | 
 | 3560 |     Py_BEGIN_ALLOW_THREADS | 
 | 3561 |     sp = getprotobyname(name); | 
 | 3562 |     Py_END_ALLOW_THREADS | 
 | 3563 |     if (sp == NULL) { | 
 | 3564 |         PyErr_SetString(socket_error, "protocol not found"); | 
 | 3565 |         return NULL; | 
 | 3566 |     } | 
 | 3567 |     return PyInt_FromLong((long) sp->p_proto); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 3568 | #endif | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 3569 | } | 
 | 3570 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3571 | PyDoc_STRVAR(getprotobyname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3572 | "getprotobyname(name) -> integer\n\ | 
 | 3573 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3574 | Return the protocol number for the named protocol.  (Rarely used.)"); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3575 |  | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 3576 |  | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3577 | #ifdef HAVE_SOCKETPAIR | 
 | 3578 | /* Create a pair of sockets using the socketpair() function. | 
| Dave Cole | 07fda7e | 2004-08-23 05:16:23 +0000 | [diff] [blame] | 3579 |    Arguments as for socket() except the default family is AF_UNIX if | 
| Dave Cole | e8bbfe4 | 2004-08-26 00:51:16 +0000 | [diff] [blame] | 3580 |    defined on the platform; otherwise, the default is AF_INET. */ | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3581 |  | 
 | 3582 | /*ARGSUSED*/ | 
 | 3583 | static PyObject * | 
 | 3584 | socket_socketpair(PyObject *self, PyObject *args) | 
 | 3585 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3586 |     PySocketSockObject *s0 = NULL, *s1 = NULL; | 
 | 3587 |     SOCKET_T sv[2]; | 
 | 3588 |     int family, type = SOCK_STREAM, proto = 0; | 
 | 3589 |     PyObject *res = NULL; | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3590 |  | 
 | 3591 | #if defined(AF_UNIX) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3592 |     family = AF_UNIX; | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3593 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3594 |     family = AF_INET; | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3595 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3596 |     if (!PyArg_ParseTuple(args, "|iii:socketpair", | 
 | 3597 |                           &family, &type, &proto)) | 
 | 3598 |         return NULL; | 
 | 3599 |     /* Create a pair of socket fds */ | 
 | 3600 |     if (socketpair(family, type, proto, sv) < 0) | 
 | 3601 |         return set_error(); | 
 | 3602 |     s0 = new_sockobject(sv[0], family, type, proto); | 
 | 3603 |     if (s0 == NULL) | 
 | 3604 |         goto finally; | 
 | 3605 |     s1 = new_sockobject(sv[1], family, type, proto); | 
 | 3606 |     if (s1 == NULL) | 
 | 3607 |         goto finally; | 
 | 3608 |     res = PyTuple_Pack(2, s0, s1); | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3609 |  | 
 | 3610 | finally: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3611 |     if (res == NULL) { | 
 | 3612 |         if (s0 == NULL) | 
 | 3613 |             SOCKETCLOSE(sv[0]); | 
 | 3614 |         if (s1 == NULL) | 
 | 3615 |             SOCKETCLOSE(sv[1]); | 
 | 3616 |     } | 
 | 3617 |     Py_XDECREF(s0); | 
 | 3618 |     Py_XDECREF(s1); | 
 | 3619 |     return res; | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3620 | } | 
 | 3621 |  | 
 | 3622 | PyDoc_STRVAR(socketpair_doc, | 
 | 3623 | "socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\ | 
 | 3624 | \n\ | 
 | 3625 | Create a pair of socket objects from the sockets returned by the platform\n\ | 
 | 3626 | socketpair() function.\n\ | 
| Dave Cole | 07fda7e | 2004-08-23 05:16:23 +0000 | [diff] [blame] | 3627 | The arguments are the same as for socket() except the default family is\n\ | 
| Dave Cole | e8bbfe4 | 2004-08-26 00:51:16 +0000 | [diff] [blame] | 3628 | AF_UNIX if defined on the platform; otherwise, the default is AF_INET."); | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3629 |  | 
 | 3630 | #endif /* HAVE_SOCKETPAIR */ | 
 | 3631 |  | 
 | 3632 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3633 | #ifndef NO_DUP | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3634 | /* Create a socket object from a numeric file description. | 
 | 3635 |    Useful e.g. if stdin is a socket. | 
 | 3636 |    Additional arguments as for socket(). */ | 
 | 3637 |  | 
 | 3638 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3639 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3640 | socket_fromfd(PyObject *self, PyObject *args) | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3641 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3642 |     PySocketSockObject *s; | 
 | 3643 |     SOCKET_T fd; | 
 | 3644 |     int family, type, proto = 0; | 
 | 3645 |     if (!PyArg_ParseTuple(args, "iii|i:fromfd", | 
 | 3646 |                           &fd, &family, &type, &proto)) | 
 | 3647 |         return NULL; | 
 | 3648 |     /* Dup the fd so it and the socket can be closed independently */ | 
 | 3649 |     fd = dup(fd); | 
 | 3650 |     if (fd < 0) | 
 | 3651 |         return set_error(); | 
 | 3652 |     s = new_sockobject(fd, family, type, proto); | 
 | 3653 |     return (PyObject *) s; | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3654 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3655 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3656 | PyDoc_STRVAR(fromfd_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3657 | "fromfd(fd, family, type[, proto]) -> socket object\n\ | 
 | 3658 | \n\ | 
| Georg Brandl | dcfdae7 | 2006-04-01 07:33:08 +0000 | [diff] [blame] | 3659 | Create a socket object from a duplicate of the given\n\ | 
 | 3660 | file descriptor.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3661 | The remaining arguments are the same as for socket()."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3662 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3663 | #endif /* NO_DUP */ | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3664 |  | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3665 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3666 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3667 | socket_ntohs(PyObject *self, PyObject *args) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3668 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3669 |     int x1, x2; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3670 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3671 |     if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) { | 
 | 3672 |         return NULL; | 
 | 3673 |     } | 
 | 3674 |     if (x1 < 0) { | 
 | 3675 |         PyErr_SetString(PyExc_OverflowError, | 
 | 3676 |             "can't convert negative number to unsigned long"); | 
 | 3677 |         return NULL; | 
 | 3678 |     } | 
 | 3679 |     x2 = (unsigned int)ntohs((unsigned short)x1); | 
 | 3680 |     return PyInt_FromLong(x2); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3681 | } | 
 | 3682 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3683 | PyDoc_STRVAR(ntohs_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3684 | "ntohs(integer) -> integer\n\ | 
 | 3685 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3686 | Convert a 16-bit integer from network to host byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3687 |  | 
 | 3688 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3689 | static PyObject * | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3690 | socket_ntohl(PyObject *self, PyObject *arg) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3691 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3692 |     unsigned long x; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3693 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3694 |     if (PyInt_Check(arg)) { | 
 | 3695 |         x = PyInt_AS_LONG(arg); | 
 | 3696 |         if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3697 |             return NULL; | 
 | 3698 |         if ((long)x < 0) { | 
 | 3699 |             PyErr_SetString(PyExc_OverflowError, | 
 | 3700 |               "can't convert negative number to unsigned long"); | 
 | 3701 |             return NULL; | 
 | 3702 |         } | 
 | 3703 |     } | 
 | 3704 |     else if (PyLong_Check(arg)) { | 
 | 3705 |         x = PyLong_AsUnsignedLong(arg); | 
 | 3706 |         if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3707 |             return NULL; | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3708 | #if SIZEOF_LONG > 4 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3709 |         { | 
 | 3710 |             unsigned long y; | 
 | 3711 |             /* only want the trailing 32 bits */ | 
 | 3712 |             y = x & 0xFFFFFFFFUL; | 
 | 3713 |             if (y ^ x) | 
 | 3714 |                 return PyErr_Format(PyExc_OverflowError, | 
 | 3715 |                             "long int larger than 32 bits"); | 
 | 3716 |             x = y; | 
 | 3717 |         } | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3718 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3719 |     } | 
 | 3720 |     else | 
 | 3721 |         return PyErr_Format(PyExc_TypeError, | 
 | 3722 |                             "expected int/long, %s found", | 
 | 3723 |                             Py_TYPE(arg)->tp_name); | 
 | 3724 |     if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3725 |         return NULL; | 
 | 3726 |     return PyLong_FromUnsignedLong(ntohl(x)); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3727 | } | 
 | 3728 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3729 | PyDoc_STRVAR(ntohl_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3730 | "ntohl(integer) -> integer\n\ | 
 | 3731 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3732 | Convert a 32-bit integer from network to host byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3733 |  | 
 | 3734 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3735 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3736 | socket_htons(PyObject *self, PyObject *args) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3737 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3738 |     int x1, x2; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3739 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3740 |     if (!PyArg_ParseTuple(args, "i:htons", &x1)) { | 
 | 3741 |         return NULL; | 
 | 3742 |     } | 
 | 3743 |     if (x1 < 0) { | 
 | 3744 |         PyErr_SetString(PyExc_OverflowError, | 
 | 3745 |             "can't convert negative number to unsigned long"); | 
 | 3746 |         return NULL; | 
 | 3747 |     } | 
 | 3748 |     x2 = (unsigned int)htons((unsigned short)x1); | 
 | 3749 |     return PyInt_FromLong(x2); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3750 | } | 
 | 3751 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3752 | PyDoc_STRVAR(htons_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3753 | "htons(integer) -> integer\n\ | 
 | 3754 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3755 | Convert a 16-bit integer from host to network byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3756 |  | 
 | 3757 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3758 | static PyObject * | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3759 | socket_htonl(PyObject *self, PyObject *arg) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3760 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3761 |     unsigned long x; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3762 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3763 |     if (PyInt_Check(arg)) { | 
 | 3764 |         x = PyInt_AS_LONG(arg); | 
 | 3765 |         if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3766 |             return NULL; | 
 | 3767 |         if ((long)x < 0) { | 
 | 3768 |             PyErr_SetString(PyExc_OverflowError, | 
 | 3769 |               "can't convert negative number to unsigned long"); | 
 | 3770 |             return NULL; | 
 | 3771 |         } | 
 | 3772 |     } | 
 | 3773 |     else if (PyLong_Check(arg)) { | 
 | 3774 |         x = PyLong_AsUnsignedLong(arg); | 
 | 3775 |         if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3776 |             return NULL; | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3777 | #if SIZEOF_LONG > 4 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3778 |         { | 
 | 3779 |             unsigned long y; | 
 | 3780 |             /* only want the trailing 32 bits */ | 
 | 3781 |             y = x & 0xFFFFFFFFUL; | 
 | 3782 |             if (y ^ x) | 
 | 3783 |                 return PyErr_Format(PyExc_OverflowError, | 
 | 3784 |                             "long int larger than 32 bits"); | 
 | 3785 |             x = y; | 
 | 3786 |         } | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3787 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3788 |     } | 
 | 3789 |     else | 
 | 3790 |         return PyErr_Format(PyExc_TypeError, | 
 | 3791 |                             "expected int/long, %s found", | 
 | 3792 |                             Py_TYPE(arg)->tp_name); | 
 | 3793 |     return PyLong_FromUnsignedLong(htonl((unsigned long)x)); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3794 | } | 
 | 3795 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3796 | PyDoc_STRVAR(htonl_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3797 | "htonl(integer) -> integer\n\ | 
 | 3798 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3799 | Convert a 32-bit integer from host to network byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3800 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3801 | /* socket.inet_aton() and socket.inet_ntoa() functions. */ | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3802 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3803 | PyDoc_STRVAR(inet_aton_doc, | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3804 | "inet_aton(string) -> packed 32-bit IP representation\n\ | 
 | 3805 | \n\ | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3806 | Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3807 | binary format used in low-level network functions."); | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3808 |  | 
 | 3809 | static PyObject* | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3810 | socket_inet_aton(PyObject *self, PyObject *args) | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3811 | { | 
| Guido van Rossum | a2e4855 | 1999-09-09 15:42:59 +0000 | [diff] [blame] | 3812 | #ifndef INADDR_NONE | 
 | 3813 | #define INADDR_NONE (-1) | 
 | 3814 | #endif | 
| Neal Norwitz | 88f115b | 2003-02-13 02:15:42 +0000 | [diff] [blame] | 3815 | #ifdef HAVE_INET_ATON | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3816 |     struct in_addr buf; | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 3817 | #endif | 
 | 3818 |  | 
 | 3819 | #if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK) | 
| Gregory P. Smith | 3605b5c | 2009-02-11 23:45:25 +0000 | [diff] [blame] | 3820 | #if (SIZEOF_INT != 4) | 
 | 3821 | #error "Not sure if in_addr_t exists and int is not 32-bits." | 
 | 3822 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3823 |     /* Have to use inet_addr() instead */ | 
 | 3824 |     unsigned int packed_addr; | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3825 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3826 |     char *ip_addr; | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3827 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3828 |     if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) | 
 | 3829 |         return NULL; | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3830 |  | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3831 |  | 
 | 3832 | #ifdef HAVE_INET_ATON | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 3833 |  | 
 | 3834 | #ifdef USE_INET_ATON_WEAKLINK | 
 | 3835 |     if (inet_aton != NULL) { | 
 | 3836 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3837 |     if (inet_aton(ip_addr, &buf)) | 
 | 3838 |         return PyString_FromStringAndSize((char *)(&buf), | 
 | 3839 |                                           sizeof(buf)); | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3840 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3841 |     PyErr_SetString(socket_error, | 
 | 3842 |                     "illegal IP address string passed to inet_aton"); | 
 | 3843 |     return NULL; | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3844 |  | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 3845 | #ifdef USE_INET_ATON_WEAKLINK | 
 | 3846 |    } else { | 
 | 3847 | #endif | 
 | 3848 |  | 
 | 3849 | #endif | 
 | 3850 |  | 
 | 3851 | #if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK) | 
 | 3852 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3853 |     /* special-case this address as inet_addr might return INADDR_NONE | 
 | 3854 |      * for this */ | 
 | 3855 |     if (strcmp(ip_addr, "255.255.255.255") == 0) { | 
 | 3856 |         packed_addr = 0xFFFFFFFF; | 
 | 3857 |     } else { | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 3858 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3859 |         packed_addr = inet_addr(ip_addr); | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3860 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3861 |         if (packed_addr == INADDR_NONE) {               /* invalid address */ | 
 | 3862 |             PyErr_SetString(socket_error, | 
 | 3863 |                 "illegal IP address string passed to inet_aton"); | 
 | 3864 |             return NULL; | 
 | 3865 |         } | 
 | 3866 |     } | 
 | 3867 |     return PyString_FromStringAndSize((char *) &packed_addr, | 
 | 3868 |                                       sizeof(packed_addr)); | 
| Ronald Oussoren | d06b6f2 | 2006-04-23 11:59:25 +0000 | [diff] [blame] | 3869 |  | 
 | 3870 | #ifdef USE_INET_ATON_WEAKLINK | 
 | 3871 |    } | 
 | 3872 | #endif | 
 | 3873 |  | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3874 | #endif | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3875 | } | 
 | 3876 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3877 | PyDoc_STRVAR(inet_ntoa_doc, | 
| Fred Drake | e066134 | 2000-03-07 14:05:16 +0000 | [diff] [blame] | 3878 | "inet_ntoa(packed_ip) -> ip_address_string\n\ | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3879 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3880 | Convert an IP address from 32-bit packed binary format to string format"); | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3881 |  | 
 | 3882 | static PyObject* | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3883 | socket_inet_ntoa(PyObject *self, PyObject *args) | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3884 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3885 |     char *packed_str; | 
 | 3886 |     int addr_len; | 
 | 3887 |     struct in_addr packed_addr; | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3888 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3889 |     if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) { | 
 | 3890 |         return NULL; | 
 | 3891 |     } | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 3892 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3893 |     if (addr_len != sizeof(packed_addr)) { | 
 | 3894 |         PyErr_SetString(socket_error, | 
 | 3895 |             "packed IP wrong length for inet_ntoa"); | 
 | 3896 |         return NULL; | 
 | 3897 |     } | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3898 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3899 |     memcpy(&packed_addr, packed_str, addr_len); | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3900 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3901 |     return PyString_FromString(inet_ntoa(packed_addr)); | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3902 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3903 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3904 | #ifdef HAVE_INET_PTON | 
 | 3905 |  | 
 | 3906 | PyDoc_STRVAR(inet_pton_doc, | 
 | 3907 | "inet_pton(af, ip) -> packed IP address string\n\ | 
 | 3908 | \n\ | 
 | 3909 | Convert an IP address from string format to a packed string suitable\n\ | 
 | 3910 | for use with low-level network functions."); | 
 | 3911 |  | 
 | 3912 | static PyObject * | 
 | 3913 | socket_inet_pton(PyObject *self, PyObject *args) | 
 | 3914 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3915 |     int af; | 
 | 3916 |     char* ip; | 
 | 3917 |     int retval; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3918 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3919 |     char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))]; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3920 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3921 |     char packed[sizeof(struct in_addr)]; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3922 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3923 |     if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) { | 
 | 3924 |         return NULL; | 
 | 3925 |     } | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3926 |  | 
| Martin v. Löwis | 04697e8 | 2004-06-02 12:35:29 +0000 | [diff] [blame] | 3927 | #if !defined(ENABLE_IPV6) && defined(AF_INET6) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3928 |     if(af == AF_INET6) { | 
 | 3929 |         PyErr_SetString(socket_error, | 
 | 3930 |                         "can't use AF_INET6, IPv6 is disabled"); | 
 | 3931 |         return NULL; | 
 | 3932 |     } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 3933 | #endif | 
| Martin v. Löwis | 1064909 | 2003-08-05 06:25:06 +0000 | [diff] [blame] | 3934 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3935 |     retval = inet_pton(af, ip, packed); | 
 | 3936 |     if (retval < 0) { | 
 | 3937 |         PyErr_SetFromErrno(socket_error); | 
 | 3938 |         return NULL; | 
 | 3939 |     } else if (retval == 0) { | 
 | 3940 |         PyErr_SetString(socket_error, | 
 | 3941 |             "illegal IP address string passed to inet_pton"); | 
 | 3942 |         return NULL; | 
 | 3943 |     } else if (af == AF_INET) { | 
 | 3944 |         return PyString_FromStringAndSize(packed, | 
 | 3945 |             sizeof(struct in_addr)); | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3946 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3947 |     } else if (af == AF_INET6) { | 
 | 3948 |         return PyString_FromStringAndSize(packed, | 
 | 3949 |             sizeof(struct in6_addr)); | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3950 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3951 |     } else { | 
 | 3952 |         PyErr_SetString(socket_error, "unknown address family"); | 
 | 3953 |         return NULL; | 
 | 3954 |     } | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3955 | } | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 3956 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3957 | PyDoc_STRVAR(inet_ntop_doc, | 
 | 3958 | "inet_ntop(af, packed_ip) -> string formatted IP address\n\ | 
 | 3959 | \n\ | 
 | 3960 | Convert a packed IP address of the given family to string format."); | 
 | 3961 |  | 
 | 3962 | static PyObject * | 
 | 3963 | socket_inet_ntop(PyObject *self, PyObject *args) | 
 | 3964 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3965 |     int af; | 
 | 3966 |     char* packed; | 
 | 3967 |     int len; | 
 | 3968 |     const char* retval; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3969 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3970 |     char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1]; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3971 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3972 |     char ip[INET_ADDRSTRLEN + 1]; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3973 | #endif | 
| Martin Blais | 2856e5f | 2006-05-26 12:03:27 +0000 | [diff] [blame] | 3974 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3975 |     /* Guarantee NUL-termination for PyString_FromString() below */ | 
 | 3976 |     memset((void *) &ip[0], '\0', sizeof(ip)); | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3977 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3978 |     if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) { | 
 | 3979 |         return NULL; | 
 | 3980 |     } | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3981 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3982 |     if (af == AF_INET) { | 
 | 3983 |         if (len != sizeof(struct in_addr)) { | 
 | 3984 |             PyErr_SetString(PyExc_ValueError, | 
 | 3985 |                 "invalid length of packed IP address string"); | 
 | 3986 |             return NULL; | 
 | 3987 |         } | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3988 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3989 |     } else if (af == AF_INET6) { | 
 | 3990 |         if (len != sizeof(struct in6_addr)) { | 
 | 3991 |             PyErr_SetString(PyExc_ValueError, | 
 | 3992 |                 "invalid length of packed IP address string"); | 
 | 3993 |             return NULL; | 
 | 3994 |         } | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3995 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 3996 |     } else { | 
 | 3997 |         PyErr_Format(PyExc_ValueError, | 
 | 3998 |             "unknown address family %d", af); | 
 | 3999 |         return NULL; | 
 | 4000 |     } | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4001 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4002 |     retval = inet_ntop(af, packed, ip, sizeof(ip)); | 
 | 4003 |     if (!retval) { | 
 | 4004 |         PyErr_SetFromErrno(socket_error); | 
 | 4005 |         return NULL; | 
 | 4006 |     } else { | 
 | 4007 |         return PyString_FromString(retval); | 
 | 4008 |     } | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4009 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4010 |     /* NOTREACHED */ | 
 | 4011 |     PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop"); | 
 | 4012 |     return NULL; | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4013 | } | 
 | 4014 |  | 
 | 4015 | #endif /* HAVE_INET_PTON */ | 
 | 4016 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4017 | /* Python interface to getaddrinfo(host, port). */ | 
 | 4018 |  | 
 | 4019 | /*ARGSUSED*/ | 
 | 4020 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4021 | socket_getaddrinfo(PyObject *self, PyObject *args) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4022 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4023 |     struct addrinfo hints, *res; | 
 | 4024 |     struct addrinfo *res0 = NULL; | 
 | 4025 |     PyObject *hobj = NULL; | 
 | 4026 |     PyObject *pobj = (PyObject *)NULL; | 
 | 4027 |     char pbuf[30]; | 
 | 4028 |     char *hptr, *pptr; | 
 | 4029 |     int family, socktype, protocol, flags; | 
 | 4030 |     int error; | 
 | 4031 |     PyObject *all = (PyObject *)NULL; | 
 | 4032 |     PyObject *single = (PyObject *)NULL; | 
 | 4033 |     PyObject *idna = NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4034 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4035 |     family = socktype = protocol = flags = 0; | 
 | 4036 |     family = AF_UNSPEC; | 
 | 4037 |     if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo", | 
 | 4038 |                           &hobj, &pobj, &family, &socktype, | 
 | 4039 |                           &protocol, &flags)) { | 
 | 4040 |         return NULL; | 
 | 4041 |     } | 
 | 4042 |     if (hobj == Py_None) { | 
 | 4043 |         hptr = NULL; | 
 | 4044 |     } else if (PyUnicode_Check(hobj)) { | 
 | 4045 |         idna = PyObject_CallMethod(hobj, "encode", "s", "idna"); | 
 | 4046 |         if (!idna) | 
 | 4047 |             return NULL; | 
 | 4048 |         hptr = PyString_AsString(idna); | 
 | 4049 |     } else if (PyString_Check(hobj)) { | 
 | 4050 |         hptr = PyString_AsString(hobj); | 
 | 4051 |     } else { | 
 | 4052 |         PyErr_SetString(PyExc_TypeError, | 
 | 4053 |                         "getaddrinfo() argument 1 must be string or None"); | 
 | 4054 |         return NULL; | 
 | 4055 |     } | 
 | 4056 |     if (PyInt_Check(pobj)) { | 
 | 4057 |         PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj)); | 
 | 4058 |         pptr = pbuf; | 
 | 4059 |     } else if (PyString_Check(pobj)) { | 
 | 4060 |         pptr = PyString_AsString(pobj); | 
 | 4061 |     } else if (pobj == Py_None) { | 
 | 4062 |         pptr = (char *)NULL; | 
 | 4063 |     } else { | 
 | 4064 |         PyErr_SetString(socket_error, "Int or String expected"); | 
 | 4065 |         goto err; | 
 | 4066 |     } | 
 | 4067 |     memset(&hints, 0, sizeof(hints)); | 
 | 4068 |     hints.ai_family = family; | 
 | 4069 |     hints.ai_socktype = socktype; | 
 | 4070 |     hints.ai_protocol = protocol; | 
 | 4071 |     hints.ai_flags = flags; | 
 | 4072 |     Py_BEGIN_ALLOW_THREADS | 
 | 4073 |     ACQUIRE_GETADDRINFO_LOCK | 
 | 4074 |     error = getaddrinfo(hptr, pptr, &hints, &res0); | 
 | 4075 |     Py_END_ALLOW_THREADS | 
 | 4076 |     RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
 | 4077 |     if (error) { | 
 | 4078 |         set_gaierror(error); | 
 | 4079 |         goto err; | 
 | 4080 |     } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4081 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4082 |     if ((all = PyList_New(0)) == NULL) | 
 | 4083 |         goto err; | 
 | 4084 |     for (res = res0; res; res = res->ai_next) { | 
 | 4085 |         PyObject *addr = | 
 | 4086 |             makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol); | 
 | 4087 |         if (addr == NULL) | 
 | 4088 |             goto err; | 
 | 4089 |         single = Py_BuildValue("iiisO", res->ai_family, | 
 | 4090 |             res->ai_socktype, res->ai_protocol, | 
 | 4091 |             res->ai_canonname ? res->ai_canonname : "", | 
 | 4092 |             addr); | 
 | 4093 |         Py_DECREF(addr); | 
 | 4094 |         if (single == NULL) | 
 | 4095 |             goto err; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4096 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4097 |         if (PyList_Append(all, single)) | 
 | 4098 |             goto err; | 
 | 4099 |         Py_XDECREF(single); | 
 | 4100 |     } | 
 | 4101 |     Py_XDECREF(idna); | 
 | 4102 |     if (res0) | 
 | 4103 |         freeaddrinfo(res0); | 
 | 4104 |     return all; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4105 |  err: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4106 |     Py_XDECREF(single); | 
 | 4107 |     Py_XDECREF(all); | 
 | 4108 |     Py_XDECREF(idna); | 
 | 4109 |     if (res0) | 
 | 4110 |         freeaddrinfo(res0); | 
 | 4111 |     return (PyObject *)NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4112 | } | 
 | 4113 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 4114 | PyDoc_STRVAR(getaddrinfo_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 4115 | "getaddrinfo(host, port [, family, socktype, proto, flags])\n\ | 
 | 4116 |     -> list of (family, socktype, proto, canonname, sockaddr)\n\ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4117 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 4118 | Resolve host and port into addrinfo struct."); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4119 |  | 
 | 4120 | /* Python interface to getnameinfo(sa, flags). */ | 
 | 4121 |  | 
 | 4122 | /*ARGSUSED*/ | 
 | 4123 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4124 | socket_getnameinfo(PyObject *self, PyObject *args) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4125 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4126 |     PyObject *sa = (PyObject *)NULL; | 
 | 4127 |     int flags; | 
 | 4128 |     char *hostp; | 
 | 4129 |     int port, flowinfo, scope_id; | 
 | 4130 |     char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV]; | 
 | 4131 |     struct addrinfo hints, *res = NULL; | 
 | 4132 |     int error; | 
 | 4133 |     PyObject *ret = (PyObject *)NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4134 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4135 |     flags = flowinfo = scope_id = 0; | 
 | 4136 |     if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags)) | 
 | 4137 |         return NULL; | 
 | 4138 |     if (!PyTuple_Check(sa)) { | 
 | 4139 |         PyErr_SetString(PyExc_TypeError, | 
 | 4140 |                         "getnameinfo() argument 1 must be a tuple"); | 
 | 4141 |         return NULL; | 
 | 4142 |     } | 
 | 4143 |     if (!PyArg_ParseTuple(sa, "si|ii", | 
 | 4144 |                           &hostp, &port, &flowinfo, &scope_id)) | 
 | 4145 |         return NULL; | 
 | 4146 |     PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port); | 
 | 4147 |     memset(&hints, 0, sizeof(hints)); | 
 | 4148 |     hints.ai_family = AF_UNSPEC; | 
 | 4149 |     hints.ai_socktype = SOCK_DGRAM;     /* make numeric port happy */ | 
 | 4150 |     Py_BEGIN_ALLOW_THREADS | 
 | 4151 |     ACQUIRE_GETADDRINFO_LOCK | 
 | 4152 |     error = getaddrinfo(hostp, pbuf, &hints, &res); | 
 | 4153 |     Py_END_ALLOW_THREADS | 
 | 4154 |     RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
 | 4155 |     if (error) { | 
 | 4156 |         set_gaierror(error); | 
 | 4157 |         goto fail; | 
 | 4158 |     } | 
 | 4159 |     if (res->ai_next) { | 
 | 4160 |         PyErr_SetString(socket_error, | 
 | 4161 |             "sockaddr resolved to multiple addresses"); | 
 | 4162 |         goto fail; | 
 | 4163 |     } | 
 | 4164 |     switch (res->ai_family) { | 
 | 4165 |     case AF_INET: | 
 | 4166 |         { | 
 | 4167 |         if (PyTuple_GET_SIZE(sa) != 2) { | 
 | 4168 |             PyErr_SetString(socket_error, | 
 | 4169 |                 "IPv4 sockaddr must be 2 tuple"); | 
 | 4170 |             goto fail; | 
 | 4171 |         } | 
 | 4172 |         break; | 
 | 4173 |         } | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 4174 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4175 |     case AF_INET6: | 
 | 4176 |         { | 
 | 4177 |         struct sockaddr_in6 *sin6; | 
 | 4178 |         sin6 = (struct sockaddr_in6 *)res->ai_addr; | 
 | 4179 |         sin6->sin6_flowinfo = flowinfo; | 
 | 4180 |         sin6->sin6_scope_id = scope_id; | 
 | 4181 |         break; | 
 | 4182 |         } | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4183 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4184 |     } | 
 | 4185 |     error = getnameinfo(res->ai_addr, res->ai_addrlen, | 
 | 4186 |                     hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags); | 
 | 4187 |     if (error) { | 
 | 4188 |         set_gaierror(error); | 
 | 4189 |         goto fail; | 
 | 4190 |     } | 
 | 4191 |     ret = Py_BuildValue("ss", hbuf, pbuf); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4192 |  | 
 | 4193 | fail: | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4194 |     if (res) | 
 | 4195 |         freeaddrinfo(res); | 
 | 4196 |     return ret; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4197 | } | 
 | 4198 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 4199 | PyDoc_STRVAR(getnameinfo_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 4200 | "getnameinfo(sockaddr, flags) --> (host, port)\n\ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4201 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 4202 | Get host and port for a sockaddr."); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4203 |  | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4204 |  | 
 | 4205 | /* Python API to getting and setting the default timeout value. */ | 
 | 4206 |  | 
 | 4207 | static PyObject * | 
 | 4208 | socket_getdefaulttimeout(PyObject *self) | 
 | 4209 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4210 |     if (defaulttimeout < 0.0) { | 
 | 4211 |         Py_INCREF(Py_None); | 
 | 4212 |         return Py_None; | 
 | 4213 |     } | 
 | 4214 |     else | 
 | 4215 |         return PyFloat_FromDouble(defaulttimeout); | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4216 | } | 
 | 4217 |  | 
 | 4218 | PyDoc_STRVAR(getdefaulttimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 4219 | "getdefaulttimeout() -> timeout\n\ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4220 | \n\ | 
 | 4221 | Returns the default timeout in floating seconds for new socket objects.\n\ | 
 | 4222 | A value of None indicates that new socket objects have no timeout.\n\ | 
 | 4223 | When the socket module is first imported, the default is None."); | 
 | 4224 |  | 
 | 4225 | static PyObject * | 
 | 4226 | socket_setdefaulttimeout(PyObject *self, PyObject *arg) | 
 | 4227 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4228 |     double timeout; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4229 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4230 |     if (arg == Py_None) | 
 | 4231 |         timeout = -1.0; | 
 | 4232 |     else { | 
 | 4233 |         timeout = PyFloat_AsDouble(arg); | 
 | 4234 |         if (timeout < 0.0) { | 
 | 4235 |             if (!PyErr_Occurred()) | 
 | 4236 |                 PyErr_SetString(PyExc_ValueError, | 
 | 4237 |                                 "Timeout value out of range"); | 
 | 4238 |             return NULL; | 
 | 4239 |         } | 
 | 4240 |     } | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4241 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4242 |     defaulttimeout = timeout; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4243 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4244 |     Py_INCREF(Py_None); | 
 | 4245 |     return Py_None; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4246 | } | 
 | 4247 |  | 
 | 4248 | PyDoc_STRVAR(setdefaulttimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 4249 | "setdefaulttimeout(timeout)\n\ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 4250 | \n\ | 
 | 4251 | Set the default timeout in floating seconds for new socket objects.\n\ | 
 | 4252 | A value of None indicates that new socket objects have no timeout.\n\ | 
 | 4253 | When the socket module is first imported, the default is None."); | 
 | 4254 |  | 
 | 4255 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 4256 | /* List of functions exported by this module. */ | 
 | 4257 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4258 | static PyMethodDef socket_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4259 |     {"gethostbyname",           socket_gethostbyname, | 
 | 4260 |      METH_VARARGS, gethostbyname_doc}, | 
 | 4261 |     {"gethostbyname_ex",        socket_gethostbyname_ex, | 
 | 4262 |      METH_VARARGS, ghbn_ex_doc}, | 
 | 4263 |     {"gethostbyaddr",           socket_gethostbyaddr, | 
 | 4264 |      METH_VARARGS, gethostbyaddr_doc}, | 
 | 4265 |     {"gethostname",             socket_gethostname, | 
 | 4266 |      METH_NOARGS,  gethostname_doc}, | 
 | 4267 |     {"getservbyname",           socket_getservbyname, | 
 | 4268 |      METH_VARARGS, getservbyname_doc}, | 
 | 4269 |     {"getservbyport",           socket_getservbyport, | 
 | 4270 |      METH_VARARGS, getservbyport_doc}, | 
 | 4271 |     {"getprotobyname",          socket_getprotobyname, | 
 | 4272 |      METH_VARARGS, getprotobyname_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 4273 | #ifndef NO_DUP | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4274 |     {"fromfd",                  socket_fromfd, | 
 | 4275 |      METH_VARARGS, fromfd_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 4276 | #endif | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 4277 | #ifdef HAVE_SOCKETPAIR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4278 |     {"socketpair",              socket_socketpair, | 
 | 4279 |      METH_VARARGS, socketpair_doc}, | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 4280 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4281 |     {"ntohs",                   socket_ntohs, | 
 | 4282 |      METH_VARARGS, ntohs_doc}, | 
 | 4283 |     {"ntohl",                   socket_ntohl, | 
 | 4284 |      METH_O, ntohl_doc}, | 
 | 4285 |     {"htons",                   socket_htons, | 
 | 4286 |      METH_VARARGS, htons_doc}, | 
 | 4287 |     {"htonl",                   socket_htonl, | 
 | 4288 |      METH_O, htonl_doc}, | 
 | 4289 |     {"inet_aton",               socket_inet_aton, | 
 | 4290 |      METH_VARARGS, inet_aton_doc}, | 
 | 4291 |     {"inet_ntoa",               socket_inet_ntoa, | 
 | 4292 |      METH_VARARGS, inet_ntoa_doc}, | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4293 | #ifdef HAVE_INET_PTON | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4294 |     {"inet_pton",               socket_inet_pton, | 
 | 4295 |      METH_VARARGS, inet_pton_doc}, | 
 | 4296 |     {"inet_ntop",               socket_inet_ntop, | 
 | 4297 |      METH_VARARGS, inet_ntop_doc}, | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4298 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4299 |     {"getaddrinfo",             socket_getaddrinfo, | 
 | 4300 |      METH_VARARGS, getaddrinfo_doc}, | 
 | 4301 |     {"getnameinfo",             socket_getnameinfo, | 
 | 4302 |      METH_VARARGS, getnameinfo_doc}, | 
 | 4303 |     {"getdefaulttimeout",       (PyCFunction)socket_getdefaulttimeout, | 
 | 4304 |      METH_NOARGS, getdefaulttimeout_doc}, | 
 | 4305 |     {"setdefaulttimeout",       socket_setdefaulttimeout, | 
 | 4306 |      METH_O, setdefaulttimeout_doc}, | 
 | 4307 |     {NULL,                      NULL}            /* Sentinel */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 4308 | }; | 
 | 4309 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 4310 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4311 | #ifdef RISCOS | 
 | 4312 | #define OS_INIT_DEFINED | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4313 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4314 | static int | 
 | 4315 | os_init(void) | 
 | 4316 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4317 |     _kernel_swi_regs r; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4318 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4319 |     r.r[0] = 0; | 
 | 4320 |     _kernel_swi(0x43380, &r, &r); | 
 | 4321 |     taskwindow = r.r[0]; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4322 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4323 |     return 1; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4324 | } | 
 | 4325 |  | 
 | 4326 | #endif /* RISCOS */ | 
 | 4327 |  | 
 | 4328 |  | 
 | 4329 | #ifdef MS_WINDOWS | 
 | 4330 | #define OS_INIT_DEFINED | 
 | 4331 |  | 
 | 4332 | /* Additional initialization and cleanup for Windows */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4333 |  | 
 | 4334 | static void | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4335 | os_cleanup(void) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4336 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4337 |     WSACleanup(); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4338 | } | 
 | 4339 |  | 
 | 4340 | static int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4341 | os_init(void) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4342 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4343 |     WSADATA WSAData; | 
 | 4344 |     int ret; | 
 | 4345 |     char buf[100]; | 
 | 4346 |     ret = WSAStartup(0x0101, &WSAData); | 
 | 4347 |     switch (ret) { | 
 | 4348 |     case 0:     /* No error */ | 
 | 4349 |         Py_AtExit(os_cleanup); | 
 | 4350 |         return 1; /* Success */ | 
 | 4351 |     case WSASYSNOTREADY: | 
 | 4352 |         PyErr_SetString(PyExc_ImportError, | 
 | 4353 |                         "WSAStartup failed: network not ready"); | 
 | 4354 |         break; | 
 | 4355 |     case WSAVERNOTSUPPORTED: | 
 | 4356 |     case WSAEINVAL: | 
 | 4357 |         PyErr_SetString( | 
 | 4358 |             PyExc_ImportError, | 
 | 4359 |             "WSAStartup failed: requested version not supported"); | 
 | 4360 |         break; | 
 | 4361 |     default: | 
 | 4362 |         PyOS_snprintf(buf, sizeof(buf), | 
 | 4363 |                       "WSAStartup failed: error code %d", ret); | 
 | 4364 |         PyErr_SetString(PyExc_ImportError, buf); | 
 | 4365 |         break; | 
 | 4366 |     } | 
 | 4367 |     return 0; /* Failure */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4368 | } | 
 | 4369 |  | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 4370 | #endif /* MS_WINDOWS */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 4371 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4372 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4373 | #ifdef PYOS_OS2 | 
 | 4374 | #define OS_INIT_DEFINED | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4375 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4376 | /* Additional initialization for OS/2 */ | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4377 |  | 
 | 4378 | static int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4379 | os_init(void) | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4380 | { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4381 | #ifndef PYCC_GCC | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4382 |     char reason[64]; | 
 | 4383 |     int rc = sock_init(); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4384 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4385 |     if (rc == 0) { | 
 | 4386 |         return 1; /* Success */ | 
 | 4387 |     } | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4388 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4389 |     PyOS_snprintf(reason, sizeof(reason), | 
 | 4390 |                   "OS/2 TCP/IP Error# %d", sock_errno()); | 
 | 4391 |     PyErr_SetString(PyExc_ImportError, reason); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4392 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4393 |     return 0;  /* Failure */ | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 4394 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4395 |     /* No need to initialise sockets with GCC/EMX */ | 
 | 4396 |     return 1; /* Success */ | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 4397 | #endif | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 4398 | } | 
 | 4399 |  | 
 | 4400 | #endif /* PYOS_OS2 */ | 
 | 4401 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4402 |  | 
 | 4403 | #ifndef OS_INIT_DEFINED | 
 | 4404 | static int | 
 | 4405 | os_init(void) | 
 | 4406 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4407 |     return 1; /* Success */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4408 | } | 
 | 4409 | #endif | 
 | 4410 |  | 
 | 4411 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 4412 | /* C API table - always add new things to the end for binary | 
 | 4413 |    compatibility. */ | 
 | 4414 | static | 
 | 4415 | PySocketModule_APIObject PySocketModuleAPI = | 
 | 4416 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4417 |     &sock_type, | 
 | 4418 |     NULL | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 4419 | }; | 
 | 4420 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 4421 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4422 | /* Initialize the _socket module. | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 4423 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4424 |    This module is actually called "_socket", and there's a wrapper | 
 | 4425 |    "socket.py" which implements some additional functionality.  On some | 
 | 4426 |    platforms (e.g. Windows and OS/2), socket.py also implements a | 
 | 4427 |    wrapper for the socket type that provides missing functionality such | 
 | 4428 |    as makefile(), dup() and fromfd().  The import of "_socket" may fail | 
 | 4429 |    with an ImportError exception if os-specific initialization fails. | 
 | 4430 |    On Windows, this does WINSOCK initialization.  When WINSOCK is | 
 | 4431 |    initialized succesfully, a call to WSACleanup() is scheduled to be | 
 | 4432 |    made at exit time. | 
 | 4433 | */ | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 4434 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 4435 | PyDoc_STRVAR(socket_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 4436 | "Implementation module for socket operations.\n\ | 
 | 4437 | \n\ | 
 | 4438 | See the socket module for documentation."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 4439 |  | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 4440 | PyMODINIT_FUNC | 
| Thomas Wouters | 1e0c2f4 | 2000-07-24 16:06:23 +0000 | [diff] [blame] | 4441 | init_socket(void) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 4442 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4443 |     PyObject *m, *has_ipv6; | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4444 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4445 |     if (!os_init()) | 
 | 4446 |         return; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4447 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4448 |     Py_TYPE(&sock_type) = &PyType_Type; | 
 | 4449 |     m = Py_InitModule3(PySocket_MODULE_NAME, | 
 | 4450 |                        socket_methods, | 
 | 4451 |                        socket_doc); | 
 | 4452 |     if (m == NULL) | 
 | 4453 |         return; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4454 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4455 |     socket_error = PyErr_NewException("socket.error", | 
 | 4456 |                                       PyExc_IOError, NULL); | 
 | 4457 |     if (socket_error == NULL) | 
 | 4458 |         return; | 
 | 4459 |     PySocketModuleAPI.error = socket_error; | 
 | 4460 |     Py_INCREF(socket_error); | 
 | 4461 |     PyModule_AddObject(m, "error", socket_error); | 
 | 4462 |     socket_herror = PyErr_NewException("socket.herror", | 
 | 4463 |                                        socket_error, NULL); | 
 | 4464 |     if (socket_herror == NULL) | 
 | 4465 |         return; | 
 | 4466 |     Py_INCREF(socket_herror); | 
 | 4467 |     PyModule_AddObject(m, "herror", socket_herror); | 
 | 4468 |     socket_gaierror = PyErr_NewException("socket.gaierror", socket_error, | 
 | 4469 |         NULL); | 
 | 4470 |     if (socket_gaierror == NULL) | 
 | 4471 |         return; | 
 | 4472 |     Py_INCREF(socket_gaierror); | 
 | 4473 |     PyModule_AddObject(m, "gaierror", socket_gaierror); | 
 | 4474 |     socket_timeout = PyErr_NewException("socket.timeout", | 
 | 4475 |                                         socket_error, NULL); | 
 | 4476 |     if (socket_timeout == NULL) | 
 | 4477 |         return; | 
 | 4478 |     Py_INCREF(socket_timeout); | 
 | 4479 |     PyModule_AddObject(m, "timeout", socket_timeout); | 
 | 4480 |     Py_INCREF((PyObject *)&sock_type); | 
 | 4481 |     if (PyModule_AddObject(m, "SocketType", | 
 | 4482 |                            (PyObject *)&sock_type) != 0) | 
 | 4483 |         return; | 
 | 4484 |     Py_INCREF((PyObject *)&sock_type); | 
 | 4485 |     if (PyModule_AddObject(m, "socket", | 
 | 4486 |                            (PyObject *)&sock_type) != 0) | 
 | 4487 |         return; | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4488 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4489 | #ifdef ENABLE_IPV6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4490 |     has_ipv6 = Py_True; | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4491 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4492 |     has_ipv6 = Py_False; | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4493 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4494 |     Py_INCREF(has_ipv6); | 
 | 4495 |     PyModule_AddObject(m, "has_ipv6", has_ipv6); | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4496 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4497 |     /* Export C API */ | 
 | 4498 |     if (PyModule_AddObject(m, PySocket_CAPI_NAME, | 
 | 4499 |            PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL) | 
 | 4500 |                              ) != 0) | 
 | 4501 |         return; | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 4502 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4503 |     /* Address families (we only support AF_INET and AF_UNIX) */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4504 | #ifdef AF_UNSPEC | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4505 |     PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4506 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4507 |     PyModule_AddIntConstant(m, "AF_INET", AF_INET); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4508 | #ifdef AF_INET6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4509 |     PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4510 | #endif /* AF_INET6 */ | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 4511 | #if defined(AF_UNIX) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4512 |     PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX); | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 4513 | #endif /* AF_UNIX */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4514 | #ifdef AF_AX25 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4515 |     /* Amateur Radio AX.25 */ | 
 | 4516 |     PyModule_AddIntConstant(m, "AF_AX25", AF_AX25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4517 | #endif | 
 | 4518 | #ifdef AF_IPX | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4519 |     PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4520 | #endif | 
 | 4521 | #ifdef AF_APPLETALK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4522 |     /* Appletalk DDP */ | 
 | 4523 |     PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4524 | #endif | 
 | 4525 | #ifdef AF_NETROM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4526 |     /* Amateur radio NetROM */ | 
 | 4527 |     PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4528 | #endif | 
 | 4529 | #ifdef AF_BRIDGE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4530 |     /* Multiprotocol bridge */ | 
 | 4531 |     PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4532 | #endif | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4533 | #ifdef AF_ATMPVC | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4534 |     /* ATM PVCs */ | 
 | 4535 |     PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4536 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4537 | #ifdef AF_AAL5 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4538 |     /* Reserved for Werner's ATM */ | 
 | 4539 |     PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4540 | #endif | 
 | 4541 | #ifdef AF_X25 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4542 |     /* Reserved for X.25 project */ | 
 | 4543 |     PyModule_AddIntConstant(m, "AF_X25", AF_X25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4544 | #endif | 
 | 4545 | #ifdef AF_INET6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4546 |     PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4547 | #endif | 
 | 4548 | #ifdef AF_ROSE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4549 |     /* Amateur Radio X.25 PLP */ | 
 | 4550 |     PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4551 | #endif | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4552 | #ifdef AF_DECnet | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4553 |     /* Reserved for DECnet project */ | 
 | 4554 |     PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4555 | #endif | 
 | 4556 | #ifdef AF_NETBEUI | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4557 |     /* Reserved for 802.2LLC project */ | 
 | 4558 |     PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4559 | #endif | 
 | 4560 | #ifdef AF_SECURITY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4561 |     /* Security callback pseudo AF */ | 
 | 4562 |     PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4563 | #endif | 
 | 4564 | #ifdef AF_KEY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4565 |     /* PF_KEY key management API */ | 
 | 4566 |     PyModule_AddIntConstant(m, "AF_KEY", AF_KEY); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4567 | #endif | 
 | 4568 | #ifdef AF_NETLINK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4569 |     /*  */ | 
 | 4570 |     PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK); | 
 | 4571 |     PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4572 | #ifdef NETLINK_SKIP | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4573 |     PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4574 | #endif | 
 | 4575 | #ifdef NETLINK_W1 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4576 |     PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4577 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4578 |     PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK); | 
 | 4579 |     PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL); | 
| Guido van Rossum | 668a94a | 2006-02-21 01:07:27 +0000 | [diff] [blame] | 4580 | #ifdef NETLINK_TCPDIAG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4581 |     PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG); | 
| Guido van Rossum | 668a94a | 2006-02-21 01:07:27 +0000 | [diff] [blame] | 4582 | #endif | 
 | 4583 | #ifdef NETLINK_NFLOG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4584 |     PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG); | 
| Guido van Rossum | 668a94a | 2006-02-21 01:07:27 +0000 | [diff] [blame] | 4585 | #endif | 
| Neal Norwitz | 6585166 | 2006-01-16 04:31:40 +0000 | [diff] [blame] | 4586 | #ifdef NETLINK_XFRM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4587 |     PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM); | 
| Neal Norwitz | 6585166 | 2006-01-16 04:31:40 +0000 | [diff] [blame] | 4588 | #endif | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4589 | #ifdef NETLINK_ARPD | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4590 |     PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4591 | #endif | 
 | 4592 | #ifdef NETLINK_ROUTE6 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4593 |     PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4594 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4595 |     PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW); | 
| Martin v. Löwis | b1cc1d4 | 2007-02-13 12:14:19 +0000 | [diff] [blame] | 4596 | #ifdef NETLINK_DNRTMSG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4597 |     PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG); | 
 | 4598 | #endif | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4599 | #ifdef NETLINK_TAPBASE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4600 |     PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE); | 
| Martin v. Löwis | 5fe60e7 | 2006-04-06 22:29:33 +0000 | [diff] [blame] | 4601 | #endif | 
| Georg Brandl | dcfdae7 | 2006-04-01 07:33:08 +0000 | [diff] [blame] | 4602 | #endif /* AF_NETLINK */ | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4603 | #ifdef AF_ROUTE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4604 |     /* Alias to emulate 4.4BSD */ | 
 | 4605 |     PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4606 | #endif | 
 | 4607 | #ifdef AF_ASH | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4608 |     /* Ash */ | 
 | 4609 |     PyModule_AddIntConstant(m, "AF_ASH", AF_ASH); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4610 | #endif | 
 | 4611 | #ifdef AF_ECONET | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4612 |     /* Acorn Econet */ | 
 | 4613 |     PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4614 | #endif | 
 | 4615 | #ifdef AF_ATMSVC | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4616 |     /* ATM SVCs */ | 
 | 4617 |     PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4618 | #endif | 
 | 4619 | #ifdef AF_SNA | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4620 |     /* Linux SNA Project (nutters!) */ | 
 | 4621 |     PyModule_AddIntConstant(m, "AF_SNA", AF_SNA); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4622 | #endif | 
 | 4623 | #ifdef AF_IRDA | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4624 |     /* IRDA sockets */ | 
 | 4625 |     PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4626 | #endif | 
 | 4627 | #ifdef AF_PPPOX | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4628 |     /* PPPoX sockets */ | 
 | 4629 |     PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4630 | #endif | 
 | 4631 | #ifdef AF_WANPIPE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4632 |     /* Wanpipe API Sockets */ | 
 | 4633 |     PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4634 | #endif | 
 | 4635 | #ifdef AF_LLC | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4636 |     /* Linux LLC */ | 
 | 4637 |     PyModule_AddIntConstant(m, "AF_LLC", AF_LLC); | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 4638 | #endif | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 4639 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 4640 | #ifdef USE_BLUETOOTH | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4641 |     PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH); | 
 | 4642 |     PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP); | 
 | 4643 |     PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI); | 
 | 4644 |     PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI); | 
 | 4645 |     PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER); | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 4646 | #if !defined(__FreeBSD__) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4647 |     PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP); | 
 | 4648 |     PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR); | 
 | 4649 |     PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO); | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 4650 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4651 |     PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM); | 
 | 4652 |     PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00"); | 
 | 4653 |     PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 4654 | #endif | 
 | 4655 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 4656 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4657 |     PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET); | 
 | 4658 |     PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET); | 
 | 4659 |     PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST); | 
 | 4660 |     PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST); | 
 | 4661 |     PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST); | 
 | 4662 |     PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST); | 
 | 4663 |     PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING); | 
 | 4664 |     PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK); | 
 | 4665 |     PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE); | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 4666 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4667 |  | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4668 | #ifdef HAVE_LINUX_TIPC_H | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4669 |     PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4670 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4671 |     /* for addresses */ | 
 | 4672 |     PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ); | 
 | 4673 |     PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME); | 
 | 4674 |     PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4675 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4676 |     PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE); | 
 | 4677 |     PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE); | 
 | 4678 |     PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4679 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4680 |     /* for setsockopt() */ | 
 | 4681 |     PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC); | 
 | 4682 |     PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE); | 
 | 4683 |     PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE); | 
 | 4684 |     PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE", | 
 | 4685 |                     TIPC_DEST_DROPPABLE); | 
 | 4686 |     PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4687 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4688 |     PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE", | 
 | 4689 |                     TIPC_LOW_IMPORTANCE); | 
 | 4690 |     PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE", | 
 | 4691 |                     TIPC_MEDIUM_IMPORTANCE); | 
 | 4692 |     PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE", | 
 | 4693 |                     TIPC_HIGH_IMPORTANCE); | 
 | 4694 |     PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE", | 
 | 4695 |                     TIPC_CRITICAL_IMPORTANCE); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4696 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4697 |     /* for subscriptions */ | 
 | 4698 |     PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS); | 
 | 4699 |     PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE); | 
| Georg Brandl | ff15c86 | 2008-01-11 09:19:11 +0000 | [diff] [blame] | 4700 | #ifdef TIPC_SUB_CANCEL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4701 |     /* doesn't seem to be available everywhere */ | 
 | 4702 |     PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL); | 
| Georg Brandl | ff15c86 | 2008-01-11 09:19:11 +0000 | [diff] [blame] | 4703 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4704 |     PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER); | 
 | 4705 |     PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED); | 
 | 4706 |     PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN); | 
 | 4707 |     PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT); | 
 | 4708 |     PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV); | 
 | 4709 |     PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV); | 
| Christian Heimes | fb2d25a | 2008-01-07 16:12:44 +0000 | [diff] [blame] | 4710 | #endif | 
 | 4711 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4712 |     /* Socket types */ | 
 | 4713 |     PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM); | 
 | 4714 |     PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 4715 | #ifndef __BEOS__ | 
 | 4716 | /* We have incomplete socket support. */ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4717 |     PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW); | 
 | 4718 |     PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET); | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 4719 | #if defined(SOCK_RDM) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4720 |     PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 4721 | #endif | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 4722 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4723 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4724 | #ifdef  SO_DEBUG | 
 | 4725 |     PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4726 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4727 | #ifdef  SO_ACCEPTCONN | 
 | 4728 |     PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4729 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4730 | #ifdef  SO_REUSEADDR | 
 | 4731 |     PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4732 | #endif | 
| Andrew M. Kuchling | 42851ab | 2004-07-10 14:19:21 +0000 | [diff] [blame] | 4733 | #ifdef SO_EXCLUSIVEADDRUSE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4734 |     PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE); | 
| Andrew M. Kuchling | 42851ab | 2004-07-10 14:19:21 +0000 | [diff] [blame] | 4735 | #endif | 
 | 4736 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4737 | #ifdef  SO_KEEPALIVE | 
 | 4738 |     PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4739 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4740 | #ifdef  SO_DONTROUTE | 
 | 4741 |     PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4742 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4743 | #ifdef  SO_BROADCAST | 
 | 4744 |     PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4745 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4746 | #ifdef  SO_USELOOPBACK | 
 | 4747 |     PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4748 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4749 | #ifdef  SO_LINGER | 
 | 4750 |     PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4751 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4752 | #ifdef  SO_OOBINLINE | 
 | 4753 |     PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4754 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4755 | #ifdef  SO_REUSEPORT | 
 | 4756 |     PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4757 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4758 | #ifdef  SO_SNDBUF | 
 | 4759 |     PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4760 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4761 | #ifdef  SO_RCVBUF | 
 | 4762 |     PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4763 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4764 | #ifdef  SO_SNDLOWAT | 
 | 4765 |     PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4766 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4767 | #ifdef  SO_RCVLOWAT | 
 | 4768 |     PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4769 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4770 | #ifdef  SO_SNDTIMEO | 
 | 4771 |     PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4772 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4773 | #ifdef  SO_RCVTIMEO | 
 | 4774 |     PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4775 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4776 | #ifdef  SO_ERROR | 
 | 4777 |     PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4778 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4779 | #ifdef  SO_TYPE | 
 | 4780 |     PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4781 | #endif | 
| Larry Hastings | 3b958e3 | 2010-04-02 11:18:17 +0000 | [diff] [blame] | 4782 | #ifdef SO_SETFIB | 
 | 4783 |     PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB); | 
 | 4784 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4785 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4786 |     /* Maximum number of connections for "listen" */ | 
 | 4787 | #ifdef  SOMAXCONN | 
 | 4788 |     PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4789 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4790 |     PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */ | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4791 | #endif | 
 | 4792 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4793 |     /* Flags for send, recv */ | 
 | 4794 | #ifdef  MSG_OOB | 
 | 4795 |     PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4796 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4797 | #ifdef  MSG_PEEK | 
 | 4798 |     PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4799 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4800 | #ifdef  MSG_DONTROUTE | 
 | 4801 |     PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4802 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4803 | #ifdef  MSG_DONTWAIT | 
 | 4804 |     PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT); | 
| Guido van Rossum | 2c8bcb8 | 2000-04-25 21:34:53 +0000 | [diff] [blame] | 4805 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4806 | #ifdef  MSG_EOR | 
 | 4807 |     PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4808 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4809 | #ifdef  MSG_TRUNC | 
 | 4810 |     PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4811 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4812 | #ifdef  MSG_CTRUNC | 
 | 4813 |     PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4814 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4815 | #ifdef  MSG_WAITALL | 
 | 4816 |     PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4817 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4818 | #ifdef  MSG_BTAG | 
 | 4819 |     PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4820 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4821 | #ifdef  MSG_ETAG | 
 | 4822 |     PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4823 | #endif | 
 | 4824 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4825 |     /* Protocol level and numbers, usable for [gs]etsockopt */ | 
 | 4826 | #ifdef  SOL_SOCKET | 
 | 4827 |     PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4828 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4829 | #ifdef  SOL_IP | 
 | 4830 |     PyModule_AddIntConstant(m, "SOL_IP", SOL_IP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4831 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4832 |     PyModule_AddIntConstant(m, "SOL_IP", 0); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4833 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4834 | #ifdef  SOL_IPX | 
 | 4835 |     PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4836 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4837 | #ifdef  SOL_AX25 | 
 | 4838 |     PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4839 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4840 | #ifdef  SOL_ATALK | 
 | 4841 |     PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4842 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4843 | #ifdef  SOL_NETROM | 
 | 4844 |     PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4845 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4846 | #ifdef  SOL_ROSE | 
 | 4847 |     PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4848 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4849 | #ifdef  SOL_TCP | 
 | 4850 |     PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4851 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4852 |     PyModule_AddIntConstant(m, "SOL_TCP", 6); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4853 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4854 | #ifdef  SOL_UDP | 
 | 4855 |     PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4856 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4857 |     PyModule_AddIntConstant(m, "SOL_UDP", 17); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4858 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4859 | #ifdef  IPPROTO_IP | 
 | 4860 |     PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4861 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4862 |     PyModule_AddIntConstant(m, "IPPROTO_IP", 0); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4863 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4864 | #ifdef  IPPROTO_HOPOPTS | 
 | 4865 |     PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4866 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4867 | #ifdef  IPPROTO_ICMP | 
 | 4868 |     PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4869 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4870 |     PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4871 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4872 | #ifdef  IPPROTO_IGMP | 
 | 4873 |     PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4874 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4875 | #ifdef  IPPROTO_GGP | 
 | 4876 |     PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4877 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4878 | #ifdef  IPPROTO_IPV4 | 
 | 4879 |     PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4880 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4881 | #ifdef  IPPROTO_IPV6 | 
 | 4882 |     PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6); | 
| Martin v. Löwis | a0f1734 | 2003-10-03 13:56:20 +0000 | [diff] [blame] | 4883 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4884 | #ifdef  IPPROTO_IPIP | 
 | 4885 |     PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4886 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4887 | #ifdef  IPPROTO_TCP | 
 | 4888 |     PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4889 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4890 |     PyModule_AddIntConstant(m, "IPPROTO_TCP", 6); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4891 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4892 | #ifdef  IPPROTO_EGP | 
 | 4893 |     PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4894 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4895 | #ifdef  IPPROTO_PUP | 
 | 4896 |     PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4897 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4898 | #ifdef  IPPROTO_UDP | 
 | 4899 |     PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4900 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4901 |     PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4902 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4903 | #ifdef  IPPROTO_IDP | 
 | 4904 |     PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4905 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4906 | #ifdef  IPPROTO_HELLO | 
 | 4907 |     PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4908 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4909 | #ifdef  IPPROTO_ND | 
 | 4910 |     PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4911 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4912 | #ifdef  IPPROTO_TP | 
 | 4913 |     PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4914 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4915 | #ifdef  IPPROTO_IPV6 | 
 | 4916 |     PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4917 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4918 | #ifdef  IPPROTO_ROUTING | 
 | 4919 |     PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4920 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4921 | #ifdef  IPPROTO_FRAGMENT | 
 | 4922 |     PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4923 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4924 | #ifdef  IPPROTO_RSVP | 
 | 4925 |     PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4926 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4927 | #ifdef  IPPROTO_GRE | 
 | 4928 |     PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4929 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4930 | #ifdef  IPPROTO_ESP | 
 | 4931 |     PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4932 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4933 | #ifdef  IPPROTO_AH | 
 | 4934 |     PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4935 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4936 | #ifdef  IPPROTO_MOBILE | 
 | 4937 |     PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4938 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4939 | #ifdef  IPPROTO_ICMPV6 | 
 | 4940 |     PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4941 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4942 | #ifdef  IPPROTO_NONE | 
 | 4943 |     PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4944 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4945 | #ifdef  IPPROTO_DSTOPTS | 
 | 4946 |     PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4947 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4948 | #ifdef  IPPROTO_XTP | 
 | 4949 |     PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4950 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4951 | #ifdef  IPPROTO_EON | 
 | 4952 |     PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4953 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4954 | #ifdef  IPPROTO_PIM | 
 | 4955 |     PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4956 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4957 | #ifdef  IPPROTO_IPCOMP | 
 | 4958 |     PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4959 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4960 | #ifdef  IPPROTO_VRRP | 
 | 4961 |     PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4962 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4963 | #ifdef  IPPROTO_BIP | 
 | 4964 |     PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4965 | #endif | 
 | 4966 | /**/ | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4967 | #ifdef  IPPROTO_RAW | 
 | 4968 |     PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4969 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4970 |     PyModule_AddIntConstant(m, "IPPROTO_RAW", 255); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4971 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4972 | #ifdef  IPPROTO_MAX | 
 | 4973 |     PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4974 | #endif | 
 | 4975 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4976 |     /* Some port configuration */ | 
 | 4977 | #ifdef  IPPORT_RESERVED | 
 | 4978 |     PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4979 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4980 |     PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4981 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4982 | #ifdef  IPPORT_USERRESERVED | 
 | 4983 |     PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4984 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4985 |     PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4986 | #endif | 
 | 4987 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4988 |     /* Some reserved IP v.4 addresses */ | 
 | 4989 | #ifdef  INADDR_ANY | 
 | 4990 |     PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4991 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4992 |     PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4993 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4994 | #ifdef  INADDR_BROADCAST | 
 | 4995 |     PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4996 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4997 |     PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4998 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 4999 | #ifdef  INADDR_LOOPBACK | 
 | 5000 |     PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5001 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5002 |     PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5003 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5004 | #ifdef  INADDR_UNSPEC_GROUP | 
 | 5005 |     PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5006 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5007 |     PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5008 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5009 | #ifdef  INADDR_ALLHOSTS_GROUP | 
 | 5010 |     PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", | 
 | 5011 |                             INADDR_ALLHOSTS_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5012 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5013 |     PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5014 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5015 | #ifdef  INADDR_MAX_LOCAL_GROUP | 
 | 5016 |     PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", | 
 | 5017 |                             INADDR_MAX_LOCAL_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5018 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5019 |     PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5020 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5021 | #ifdef  INADDR_NONE | 
 | 5022 |     PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5023 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5024 |     PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 5025 | #endif | 
 | 5026 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5027 |     /* IPv4 [gs]etsockopt options */ | 
 | 5028 | #ifdef  IP_OPTIONS | 
 | 5029 |     PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5030 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5031 | #ifdef  IP_HDRINCL | 
 | 5032 |     PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5033 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5034 | #ifdef  IP_TOS | 
 | 5035 |     PyModule_AddIntConstant(m, "IP_TOS", IP_TOS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5036 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5037 | #ifdef  IP_TTL | 
 | 5038 |     PyModule_AddIntConstant(m, "IP_TTL", IP_TTL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5039 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5040 | #ifdef  IP_RECVOPTS | 
 | 5041 |     PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5042 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5043 | #ifdef  IP_RECVRETOPTS | 
 | 5044 |     PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5045 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5046 | #ifdef  IP_RECVDSTADDR | 
 | 5047 |     PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5048 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5049 | #ifdef  IP_RETOPTS | 
 | 5050 |     PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5051 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5052 | #ifdef  IP_MULTICAST_IF | 
 | 5053 |     PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5054 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5055 | #ifdef  IP_MULTICAST_TTL | 
 | 5056 |     PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5057 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5058 | #ifdef  IP_MULTICAST_LOOP | 
 | 5059 |     PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5060 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5061 | #ifdef  IP_ADD_MEMBERSHIP | 
 | 5062 |     PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5063 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5064 | #ifdef  IP_DROP_MEMBERSHIP | 
 | 5065 |     PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 5066 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5067 | #ifdef  IP_DEFAULT_MULTICAST_TTL | 
 | 5068 |     PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL", | 
 | 5069 |                             IP_DEFAULT_MULTICAST_TTL); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5070 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5071 | #ifdef  IP_DEFAULT_MULTICAST_LOOP | 
 | 5072 |     PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP", | 
 | 5073 |                             IP_DEFAULT_MULTICAST_LOOP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5074 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5075 | #ifdef  IP_MAX_MEMBERSHIPS | 
 | 5076 |     PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5077 | #endif | 
 | 5078 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5079 |     /* IPv6 [gs]etsockopt options, defined in RFC2553 */ | 
 | 5080 | #ifdef  IPV6_JOIN_GROUP | 
 | 5081 |     PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5082 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5083 | #ifdef  IPV6_LEAVE_GROUP | 
 | 5084 |     PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5085 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5086 | #ifdef  IPV6_MULTICAST_HOPS | 
 | 5087 |     PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5088 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5089 | #ifdef  IPV6_MULTICAST_IF | 
 | 5090 |     PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5091 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5092 | #ifdef  IPV6_MULTICAST_LOOP | 
 | 5093 |     PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5094 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5095 | #ifdef  IPV6_UNICAST_HOPS | 
 | 5096 |     PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5097 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5098 |     /* Additional IPV6 socket options, defined in RFC 3493 */ | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5099 | #ifdef IPV6_V6ONLY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5100 |     PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5101 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5102 |     /* Advanced IPV6 socket options, from RFC 3542 */ | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5103 | #ifdef IPV6_CHECKSUM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5104 |     PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5105 | #endif | 
 | 5106 | #ifdef IPV6_DONTFRAG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5107 |     PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5108 | #endif | 
 | 5109 | #ifdef IPV6_DSTOPTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5110 |     PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5111 | #endif | 
 | 5112 | #ifdef IPV6_HOPLIMIT | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5113 |     PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5114 | #endif | 
 | 5115 | #ifdef IPV6_HOPOPTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5116 |     PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5117 | #endif | 
 | 5118 | #ifdef IPV6_NEXTHOP | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5119 |     PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5120 | #endif | 
 | 5121 | #ifdef IPV6_PATHMTU | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5122 |     PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5123 | #endif | 
 | 5124 | #ifdef IPV6_PKTINFO | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5125 |     PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5126 | #endif | 
 | 5127 | #ifdef IPV6_RECVDSTOPTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5128 |     PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5129 | #endif | 
 | 5130 | #ifdef IPV6_RECVHOPLIMIT | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5131 |     PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5132 | #endif | 
 | 5133 | #ifdef IPV6_RECVHOPOPTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5134 |     PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5135 | #endif | 
 | 5136 | #ifdef IPV6_RECVPKTINFO | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5137 |     PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5138 | #endif | 
 | 5139 | #ifdef IPV6_RECVRTHDR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5140 |     PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5141 | #endif | 
 | 5142 | #ifdef IPV6_RECVTCLASS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5143 |     PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5144 | #endif | 
 | 5145 | #ifdef IPV6_RTHDR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5146 |     PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5147 | #endif | 
 | 5148 | #ifdef IPV6_RTHDRDSTOPTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5149 |     PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5150 | #endif | 
 | 5151 | #ifdef IPV6_RTHDR_TYPE_0 | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5152 |     PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5153 | #endif | 
 | 5154 | #ifdef IPV6_RECVPATHMTU | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5155 |     PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5156 | #endif | 
 | 5157 | #ifdef IPV6_TCLASS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5158 |     PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5159 | #endif | 
 | 5160 | #ifdef IPV6_USE_MIN_MTU | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5161 |     PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5162 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 5163 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5164 |     /* TCP options */ | 
 | 5165 | #ifdef  TCP_NODELAY | 
 | 5166 |     PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5167 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5168 | #ifdef  TCP_MAXSEG | 
 | 5169 |     PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5170 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5171 | #ifdef  TCP_CORK | 
 | 5172 |     PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5173 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5174 | #ifdef  TCP_KEEPIDLE | 
 | 5175 |     PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5176 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5177 | #ifdef  TCP_KEEPINTVL | 
 | 5178 |     PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5179 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5180 | #ifdef  TCP_KEEPCNT | 
 | 5181 |     PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5182 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5183 | #ifdef  TCP_SYNCNT | 
 | 5184 |     PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5185 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5186 | #ifdef  TCP_LINGER2 | 
 | 5187 |     PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5188 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5189 | #ifdef  TCP_DEFER_ACCEPT | 
 | 5190 |     PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5191 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5192 | #ifdef  TCP_WINDOW_CLAMP | 
 | 5193 |     PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5194 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5195 | #ifdef  TCP_INFO | 
 | 5196 |     PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5197 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5198 | #ifdef  TCP_QUICKACK | 
 | 5199 |     PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 5200 | #endif | 
 | 5201 |  | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5202 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5203 |     /* IPX options */ | 
 | 5204 | #ifdef  IPX_TYPE | 
 | 5205 |     PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 5206 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 5207 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5208 |     /* get{addr,name}info parameters */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5209 | #ifdef EAI_ADDRFAMILY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5210 |     PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5211 | #endif | 
 | 5212 | #ifdef EAI_AGAIN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5213 |     PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5214 | #endif | 
 | 5215 | #ifdef EAI_BADFLAGS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5216 |     PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5217 | #endif | 
 | 5218 | #ifdef EAI_FAIL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5219 |     PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5220 | #endif | 
 | 5221 | #ifdef EAI_FAMILY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5222 |     PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5223 | #endif | 
 | 5224 | #ifdef EAI_MEMORY | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5225 |     PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5226 | #endif | 
 | 5227 | #ifdef EAI_NODATA | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5228 |     PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5229 | #endif | 
 | 5230 | #ifdef EAI_NONAME | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5231 |     PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5232 | #endif | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5233 | #ifdef EAI_OVERFLOW | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5234 |     PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5235 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5236 | #ifdef EAI_SERVICE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5237 |     PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5238 | #endif | 
 | 5239 | #ifdef EAI_SOCKTYPE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5240 |     PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5241 | #endif | 
 | 5242 | #ifdef EAI_SYSTEM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5243 |     PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5244 | #endif | 
 | 5245 | #ifdef EAI_BADHINTS | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5246 |     PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5247 | #endif | 
 | 5248 | #ifdef EAI_PROTOCOL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5249 |     PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5250 | #endif | 
 | 5251 | #ifdef EAI_MAX | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5252 |     PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5253 | #endif | 
 | 5254 | #ifdef AI_PASSIVE | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5255 |     PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5256 | #endif | 
 | 5257 | #ifdef AI_CANONNAME | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5258 |     PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5259 | #endif | 
 | 5260 | #ifdef AI_NUMERICHOST | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5261 |     PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5262 | #endif | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5263 | #ifdef AI_NUMERICSERV | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5264 |     PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV); | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 5265 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5266 | #ifdef AI_MASK | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5267 |     PyModule_AddIntConstant(m, "AI_MASK", AI_MASK); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5268 | #endif | 
 | 5269 | #ifdef AI_ALL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5270 |     PyModule_AddIntConstant(m, "AI_ALL", AI_ALL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5271 | #endif | 
 | 5272 | #ifdef AI_V4MAPPED_CFG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5273 |     PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5274 | #endif | 
 | 5275 | #ifdef AI_ADDRCONFIG | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5276 |     PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5277 | #endif | 
 | 5278 | #ifdef AI_V4MAPPED | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5279 |     PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5280 | #endif | 
 | 5281 | #ifdef AI_DEFAULT | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5282 |     PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5283 | #endif | 
 | 5284 | #ifdef NI_MAXHOST | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5285 |     PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5286 | #endif | 
 | 5287 | #ifdef NI_MAXSERV | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5288 |     PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5289 | #endif | 
 | 5290 | #ifdef NI_NOFQDN | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5291 |     PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5292 | #endif | 
 | 5293 | #ifdef NI_NUMERICHOST | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5294 |     PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5295 | #endif | 
 | 5296 | #ifdef NI_NAMEREQD | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5297 |     PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5298 | #endif | 
 | 5299 | #ifdef NI_NUMERICSERV | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5300 |     PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5301 | #endif | 
 | 5302 | #ifdef NI_DGRAM | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5303 |     PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 5304 | #endif | 
 | 5305 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5306 |     /* shutdown() parameters */ | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5307 | #ifdef SHUT_RD | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5308 |     PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5309 | #elif defined(SD_RECEIVE) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5310 |     PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5311 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5312 |     PyModule_AddIntConstant(m, "SHUT_RD", 0); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5313 | #endif | 
 | 5314 | #ifdef SHUT_WR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5315 |     PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5316 | #elif defined(SD_SEND) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5317 |     PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5318 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5319 |     PyModule_AddIntConstant(m, "SHUT_WR", 1); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5320 | #endif | 
 | 5321 | #ifdef SHUT_RDWR | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5322 |     PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5323 | #elif defined(SD_BOTH) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5324 |     PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5325 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5326 |     PyModule_AddIntConstant(m, "SHUT_RDWR", 2); | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 5327 | #endif | 
 | 5328 |  | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 5329 | #ifdef SIO_RCVALL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5330 |     { | 
 | 5331 |         DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS}; | 
 | 5332 |         const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"}; | 
 | 5333 |         int i; | 
 | 5334 |         for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) { | 
 | 5335 |             PyObject *tmp; | 
 | 5336 |             tmp = PyLong_FromUnsignedLong(codes[i]); | 
 | 5337 |             if (tmp == NULL) | 
 | 5338 |                 return; | 
 | 5339 |             PyModule_AddObject(m, names[i], tmp); | 
 | 5340 |         } | 
 | 5341 |     } | 
 | 5342 |     PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF); | 
 | 5343 |     PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON); | 
 | 5344 |     PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY); | 
| Amaury Forgeot d'Arc | 94eba71 | 2008-03-28 21:55:29 +0000 | [diff] [blame] | 5345 | #ifdef RCVALL_IPLEVEL | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5346 |     PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL); | 
| Amaury Forgeot d'Arc | 94eba71 | 2008-03-28 21:55:29 +0000 | [diff] [blame] | 5347 | #endif | 
 | 5348 | #ifdef RCVALL_MAX | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5349 |     PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX); | 
| Amaury Forgeot d'Arc | 94eba71 | 2008-03-28 21:55:29 +0000 | [diff] [blame] | 5350 | #endif | 
| Christian Heimes | 04ae916 | 2008-01-04 15:23:30 +0000 | [diff] [blame] | 5351 | #endif /* _MSTCPIP_ */ | 
 | 5352 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5353 |     /* Initialize gethostbyname lock */ | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 5354 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5355 |     netdb_lock = PyThread_allocate_lock(); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 5356 | #endif | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 5357 | } | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5358 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 5359 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5360 | #ifndef HAVE_INET_PTON | 
| Christian Heimes | e8954f8 | 2007-11-22 11:21:16 +0000 | [diff] [blame] | 5361 | #if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN) | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 5362 |  | 
 | 5363 | /* Simplistic emulation code for inet_pton that only works for IPv4 */ | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 5364 | /* These are not exposed because they do not set errno properly */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 5365 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 5366 | int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 5367 | inet_pton(int af, const char *src, void *dst) | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5368 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5369 |     if (af == AF_INET) { | 
| Gregory P. Smith | 3605b5c | 2009-02-11 23:45:25 +0000 | [diff] [blame] | 5370 | #if (SIZEOF_INT != 4) | 
 | 5371 | #error "Not sure if in_addr_t exists and int is not 32-bits." | 
 | 5372 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5373 |         unsigned int packed_addr; | 
 | 5374 |         packed_addr = inet_addr(src); | 
 | 5375 |         if (packed_addr == INADDR_NONE) | 
 | 5376 |             return 0; | 
 | 5377 |         memcpy(dst, &packed_addr, 4); | 
 | 5378 |         return 1; | 
 | 5379 |     } | 
 | 5380 |     /* Should set errno to EAFNOSUPPORT */ | 
 | 5381 |     return -1; | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5382 | } | 
 | 5383 |  | 
| Martin v. Löwis | c925b153 | 2001-07-21 09:42:15 +0000 | [diff] [blame] | 5384 | const char * | 
 | 5385 | inet_ntop(int af, const void *src, char *dst, socklen_t size) | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5386 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 5387 |     if (af == AF_INET) { | 
 | 5388 |         struct in_addr packed_addr; | 
 | 5389 |         if (size < 16) | 
 | 5390 |             /* Should set errno to ENOSPC. */ | 
 | 5391 |             return NULL; | 
 | 5392 |         memcpy(&packed_addr, src, sizeof(packed_addr)); | 
 | 5393 |         return strncpy(dst, inet_ntoa(packed_addr), size); | 
 | 5394 |     } | 
 | 5395 |     /* Should set errno to EAFNOSUPPORT */ | 
 | 5396 |     return NULL; | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5397 | } | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 5398 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 5399 | #endif | 
| Christian Heimes | e8954f8 | 2007-11-22 11:21:16 +0000 | [diff] [blame] | 5400 | #endif |