| 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 | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 10 |   portable manner, though AF_PACKET is supported under Linux. | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 11 | - No read/write operations (use sendall/recv or makefile instead). | 
 | 12 | - Additional restrictions apply on some non-Unix platforms (compensated | 
 | 13 |   for by socket.py). | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 14 |  | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 15 | Module interface: | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 16 |  | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 17 | - socket.error: exception raised for socket specific errors | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 18 | - socket.gaierror: exception raised for getaddrinfo/getnameinfo errors, | 
 | 19 | 	a subclass of socket.error | 
 | 20 | - socket.herror: exception raised for gethostby* errors, | 
 | 21 | 	a subclass of socket.error | 
| Guido van Rossum | 83a072d | 2002-09-03 19:10:18 +0000 | [diff] [blame] | 22 | - socket.fromfd(fd, family, type[, proto]) --> new socket object (created | 
 | 23 |         from an existing file descriptor) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 24 | - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd') | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 25 | - socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...]) | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 26 | - socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com') | 
| Guido van Rossum | 25405c7 | 1996-12-19 16:42:52 +0000 | [diff] [blame] | 27 | - socket.getprotobyname(protocolname) --> protocol number | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 28 | - socket.getservbyname(servicename[, protocolname]) --> port number | 
 | 29 | - socket.getservbyport(portnumber[, protocolname]) --> service name | 
| Guido van Rossum | 83a072d | 2002-09-03 19:10:18 +0000 | [diff] [blame] | 30 | - socket.socket([family[, type [, proto]]]) --> new socket object | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 31 | - socket.socketpair([family[, type [, proto]]]) --> (socket, socket) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 32 | - socket.ntohs(16 bit value) --> new int object | 
 | 33 | - socket.ntohl(32 bit value) --> new int object | 
 | 34 | - socket.htons(16 bit value) --> new int object | 
 | 35 | - socket.htonl(32 bit value) --> new int object | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 36 | - socket.getaddrinfo(host, port [, family, socktype, proto, flags]) | 
 | 37 | 	--> List of (family, socktype, proto, canonname, sockaddr) | 
 | 38 | - socket.getnameinfo(sockaddr, flags) --> (host, port) | 
| Guido van Rossum | 27e177d | 1995-03-16 15:43:47 +0000 | [diff] [blame] | 39 | - socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h> | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 40 | - socket.has_ipv6: boolean value indicating if IPv6 is supported | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 41 | - socket.inet_aton(IP address) -> 32-bit packed IP representation | 
 | 42 | - socket.inet_ntoa(packed IP) -> IP address string | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 43 | - socket.getdefaulttimeout() -> None | float | 
 | 44 | - socket.setdefaulttimeout(None | float) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 45 | - an Internet socket address is a pair (hostname, port) | 
 | 46 |   where hostname can be anything recognized by gethostbyname() | 
 | 47 |   (including the dd.dd.dd.dd notation) and port is in host byte order | 
 | 48 | - 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] | 49 | - a UNIX domain socket address is a string specifying the pathname | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 50 | - an AF_PACKET socket address is a tuple containing a string | 
 | 51 |   specifying the ethernet interface and an integer specifying | 
 | 52 |   the Ethernet protocol number to be received. For example: | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 53 |   ("eth0",0x1234).  Optional 3rd,4th,5th elements in the tuple | 
| Andrew M. Kuchling | b8e1717 | 2004-07-10 23:39:35 +0000 | [diff] [blame] | 54 |   specify packet-type and ha-type/addr. | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 55 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 56 | Local naming conventions: | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 57 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 58 | - names starting with sock_ are socket object methods | 
 | 59 | - names starting with socket_ are module-level functions | 
 | 60 | - names starting with PySocket are exported through socketmodule.h | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 61 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 62 | */ | 
 | 63 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 64 | #include "Python.h" | 
 | 65 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 66 | #undef MAX | 
 | 67 | #define MAX(x, y) ((x) < (y) ? (y) : (x)) | 
 | 68 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 69 | /* Socket object documentation */ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 70 | PyDoc_STRVAR(sock_doc, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 71 | "socket([family[, type[, proto]]]) -> socket object\n\ | 
 | 72 | \n\ | 
 | 73 | Open a socket of the given type.  The family argument specifies the\n\ | 
 | 74 | address family; it defaults to AF_INET.  The type argument specifies\n\ | 
 | 75 | whether this is a stream (SOCK_STREAM, this is the default)\n\ | 
 | 76 | or datagram (SOCK_DGRAM) socket.  The protocol argument defaults to 0,\n\ | 
 | 77 | specifying the default protocol.  Keyword arguments are accepted.\n\ | 
 | 78 | \n\ | 
 | 79 | A socket object represents one endpoint of a network connection.\n\ | 
 | 80 | \n\ | 
 | 81 | Methods of socket objects (keyword arguments not allowed):\n\ | 
 | 82 | \n\ | 
 | 83 | accept() -- accept a connection, returning new socket and client address\n\ | 
 | 84 | bind(addr) -- bind the socket to a local address\n\ | 
 | 85 | close() -- close the socket\n\ | 
 | 86 | connect(addr) -- connect the socket to a remote address\n\ | 
 | 87 | connect_ex(addr) -- connect, return an error code instead of an exception\n\ | 
 | 88 | dup() -- return a new socket object identical to the current one [*]\n\ | 
 | 89 | fileno() -- return underlying file descriptor\n\ | 
 | 90 | getpeername() -- return remote address [*]\n\ | 
 | 91 | getsockname() -- return local address\n\ | 
 | 92 | getsockopt(level, optname[, buflen]) -- get socket options\n\ | 
 | 93 | gettimeout() -- return timeout or None\n\ | 
 | 94 | listen(n) -- start listening for incoming connections\n\ | 
 | 95 | makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\ | 
 | 96 | recv(buflen[, flags]) -- receive data\n\ | 
 | 97 | recvfrom(buflen[, flags]) -- receive data and sender's address\n\ | 
 | 98 | sendall(data[, flags]) -- send all data\n\ | 
 | 99 | send(data[, flags]) -- send data, may not send all of it\n\ | 
 | 100 | sendto(data[, flags], addr) -- send data to a given address\n\ | 
 | 101 | setblocking(0 | 1) -- set or clear the blocking I/O flag\n\ | 
 | 102 | setsockopt(level, optname, value) -- set socket options\n\ | 
 | 103 | settimeout(None | float) -- set or clear the timeout\n\ | 
 | 104 | shutdown(how) -- shut down traffic in one or both directions\n\ | 
 | 105 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 106 |  [*] not available on all platforms!"); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 107 |  | 
| Walter Dörwald | f0dfc7a | 2003-10-20 14:01:56 +0000 | [diff] [blame] | 108 | /* XXX This is a terrible mess of platform-dependent preprocessor hacks. | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 109 |    I hope some day someone can clean this up please... */ | 
 | 110 |  | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 111 | /* Hacks for gethostbyname_r().  On some non-Linux platforms, the configure | 
 | 112 |    script doesn't get this right, so we hardcode some platform checks below. | 
 | 113 |    On the other hand, not all Linux versions agree, so there the settings | 
 | 114 |    computed by the configure script are needed! */ | 
 | 115 |  | 
 | 116 | #ifndef linux | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 117 | # undef HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 118 | # undef HAVE_GETHOSTBYNAME_R_5_ARG | 
 | 119 | # undef HAVE_GETHOSTBYNAME_R_6_ARG | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 120 | #endif | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 121 |  | 
| Guido van Rossum | 7a12299 | 1999-04-13 04:07:32 +0000 | [diff] [blame] | 122 | #ifndef WITH_THREAD | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 123 | # undef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7a12299 | 1999-04-13 04:07:32 +0000 | [diff] [blame] | 124 | #endif | 
 | 125 |  | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 126 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 127 | # if defined(_AIX) || defined(__osf__) | 
 | 128 | #  define HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 129 | # elif defined(__sun) || defined(__sgi) | 
 | 130 | #  define HAVE_GETHOSTBYNAME_R_5_ARG | 
 | 131 | # elif defined(linux) | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 132 | /* Rely on the configure script */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 133 | # else | 
 | 134 | #  undef HAVE_GETHOSTBYNAME_R | 
 | 135 | # endif | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 136 | #endif | 
 | 137 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 138 | #if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \ | 
 | 139 |     !defined(MS_WINDOWS) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 140 | # define USE_GETHOSTBYNAME_LOCK | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 141 | #endif | 
 | 142 |  | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 143 | /* 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] | 144 |    (this includes the getaddrinfo emulation) protect access with a lock. */ | 
| Just van Rossum | 16e426b | 2003-05-09 08:12:00 +0000 | [diff] [blame] | 145 | #if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \ | 
 | 146 |     defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO)) | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 147 | #define USE_GETADDRINFO_LOCK | 
 | 148 | #endif | 
 | 149 |  | 
 | 150 | #ifdef USE_GETADDRINFO_LOCK | 
 | 151 | #define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1); | 
 | 152 | #define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock); | 
 | 153 | #else | 
 | 154 | #define ACQUIRE_GETADDRINFO_LOCK | 
 | 155 | #define RELEASE_GETADDRINFO_LOCK | 
 | 156 | #endif | 
 | 157 |  | 
 | 158 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 159 | # include "pythread.h" | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 160 | #endif | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 161 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 162 | #if defined(PYCC_VACPP) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 163 | # include <types.h> | 
 | 164 | # include <io.h> | 
 | 165 | # include <sys/ioctl.h> | 
 | 166 | # include <utils.h> | 
 | 167 | # include <ctype.h> | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 168 | #endif | 
 | 169 |  | 
| Martin v. Löwis | 9e43730 | 2002-12-06 12:57:26 +0000 | [diff] [blame] | 170 | #if defined(__VMS) | 
 | 171 | #if ! defined(_SOCKADDR_LEN) | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 172 | #   ifdef getaddrinfo | 
 | 173 | #      undef getaddrinfo | 
 | 174 | #   endif | 
 | 175 | #  include "TCPIP_IOCTL_ROUTINE" | 
 | 176 | #else | 
 | 177 | #  include <ioctl.h> | 
 | 178 | #endif | 
| Martin v. Löwis | 9e43730 | 2002-12-06 12:57:26 +0000 | [diff] [blame] | 179 | #endif | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 180 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 181 | #if defined(PYOS_OS2) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 182 | # define  INCL_DOS | 
 | 183 | # define  INCL_DOSERRORS | 
 | 184 | # define  INCL_NOPMAPI | 
 | 185 | # include <os2.h> | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 186 | #endif | 
 | 187 |  | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 188 | #if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 189 | /* make sure that the reentrant (gethostbyaddr_r etc) | 
 | 190 |    functions are declared correctly if compiling with | 
 | 191 |    MIPSPro 7.x in ANSI C mode (default) */ | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 192 |  | 
 | 193 | /* XXX Using _SGIAPI is the wrong thing,  | 
 | 194 |    but I don't know what the right thing is. */ | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 195 | #define _SGIAPI 1 | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 196 |  | 
| Jeremy Hylton | fb509a3 | 2003-07-17 16:58:48 +0000 | [diff] [blame] | 197 | #define HAVE_INET_PTON | 
 | 198 | #include <netdb.h> | 
| Martin v. Löwis | 8eb92a0 | 2002-09-19 08:03:21 +0000 | [diff] [blame] | 199 | #endif | 
 | 200 |  | 
| Anthony Baxter | bab23cf | 2003-10-04 08:00:49 +0000 | [diff] [blame] | 201 | /* Irix 6.5 fails to define this variable at all. This is needed  | 
 | 202 |    for both GCC and SGI's compiler. I'd say that the SGI headers  | 
 | 203 |    are just busted. */ | 
 | 204 | #if defined(__sgi) && !defined(INET_ADDRSTRLEN) | 
 | 205 | #define INET_ADDRSTRLEN 16 | 
 | 206 | #endif | 
 | 207 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 208 | /* Generic includes */ | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 209 | #include <sys/types.h> | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 210 | #include <signal.h> | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 211 |  | 
| Marc-André Lemburg | 976ade6 | 2002-02-16 18:47:07 +0000 | [diff] [blame] | 212 | /* Generic socket object definitions and includes */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 213 | #define PySocket_BUILDING_SOCKET | 
| Marc-André Lemburg | bb8b78b | 2002-02-16 18:44:52 +0000 | [diff] [blame] | 214 | #include "socketmodule.h" | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 215 |  | 
 | 216 | /* Addressing includes */ | 
 | 217 |  | 
| Guido van Rossum | 6f489d9 | 1996-06-28 20:15:15 +0000 | [diff] [blame] | 218 | #ifndef MS_WINDOWS | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 219 |  | 
 | 220 | /* Non-MS WINDOWS includes */ | 
 | 221 | # include <netdb.h> | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 222 |  | 
| Guido van Rossum | 9376b74 | 1999-09-15 22:01:40 +0000 | [diff] [blame] | 223 | /* Headers needed for inet_ntoa() and inet_addr() */ | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 224 | # ifdef __BEOS__ | 
 | 225 | #  include <net/netdb.h> | 
 | 226 | # elif defined(PYOS_OS2) && defined(PYCC_VACPP) | 
 | 227 | #  include <netdb.h> | 
| Tim Peters | 603c683 | 2001-11-05 02:45:59 +0000 | [diff] [blame] | 228 | typedef size_t socklen_t; | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 229 | # else | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 230 | #   include <arpa/inet.h> | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 231 | # endif | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 232 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 233 | # ifndef RISCOS | 
 | 234 | #  include <fcntl.h> | 
 | 235 | # else | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 236 | #  include <sys/ioctl.h> | 
 | 237 | #  include <socklib.h> | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 238 | #  define NO_DUP | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 239 | int h_errno; /* not used */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 240 | #  define INET_ADDRSTRLEN 16 | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 241 | # endif | 
 | 242 |  | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 243 | #else | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 244 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 245 | /* MS_WINDOWS includes */ | 
 | 246 | # include <fcntl.h> | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 247 |  | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 248 | #endif | 
 | 249 |  | 
| Skip Montanaro | 7befb99 | 2004-02-10 16:50:21 +0000 | [diff] [blame] | 250 | #include <stddef.h> | 
| Martin v. Löwis | a45ecae | 2001-06-24 21:28:42 +0000 | [diff] [blame] | 251 |  | 
 | 252 | #ifndef offsetof | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 253 | # define offsetof(type, member)	((size_t)(&((type *)0)->member)) | 
| Martin v. Löwis | a45ecae | 2001-06-24 21:28:42 +0000 | [diff] [blame] | 254 | #endif | 
 | 255 |  | 
| Neal Norwitz | 39d22e5 | 2002-11-02 19:55:21 +0000 | [diff] [blame] | 256 | #ifndef O_NONBLOCK | 
 | 257 | # define O_NONBLOCK O_NDELAY | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 258 | #endif | 
 | 259 |  | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 260 | #include "addrinfo.h" | 
| Jason Tishler | c246cb7 | 2004-08-09 13:25:59 +0000 | [diff] [blame] | 261 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 262 | #ifndef HAVE_INET_PTON | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 263 | int inet_pton(int af, const char *src, void *dst); | 
| Martin v. Löwis | c925b153 | 2001-07-21 09:42:15 +0000 | [diff] [blame] | 264 | 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] | 265 | #endif | 
 | 266 |  | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 267 | #ifdef __APPLE__ | 
 | 268 | /* On OS X, getaddrinfo returns no error indication of lookup | 
 | 269 |    failure, so we must use the emulation instead of the libinfo | 
 | 270 |    implementation. Unfortunately, performing an autoconf test | 
 | 271 |    for this bug would require DNS access for the machine performing | 
 | 272 |    the configuration, which is not acceptable. Therefore, we | 
 | 273 |    determine the bug just by checking for __APPLE__. If this bug | 
 | 274 |    gets ever fixed, perhaps checking for sys/version.h would be | 
 | 275 |    appropriate, which is 10/0 on the system with the bug. */ | 
| Jack Jansen | 84262fb | 2002-07-02 14:40:42 +0000 | [diff] [blame] | 276 | #ifndef HAVE_GETNAMEINFO | 
 | 277 | /* This bug seems to be fixed in Jaguar. Ths easiest way I could | 
 | 278 |    Find to check for Jaguar is that it has getnameinfo(), which | 
 | 279 |    older releases don't have */ | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 280 | #undef HAVE_GETADDRINFO | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 281 | #endif | 
| Jack Jansen | 84262fb | 2002-07-02 14:40:42 +0000 | [diff] [blame] | 282 | #endif | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 283 |  | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 284 | /* 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] | 285 | #if !defined(HAVE_GETADDRINFO) | 
| Martin v. Löwis | fccac2e | 2003-05-01 05:20:46 +0000 | [diff] [blame] | 286 | /* avoid clashes with the C library definition of the symbol. */ | 
 | 287 | #define getaddrinfo fake_getaddrinfo | 
 | 288 | #define gai_strerror fake_gai_strerror | 
 | 289 | #define freeaddrinfo fake_freeaddrinfo | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 290 | #include "getaddrinfo.c" | 
 | 291 | #endif | 
| Martin v. Löwis | ae26dc2 | 2001-08-03 10:02:29 +0000 | [diff] [blame] | 292 | #if !defined(HAVE_GETNAMEINFO) | 
| Martin v. Löwis | fccac2e | 2003-05-01 05:20:46 +0000 | [diff] [blame] | 293 | #define getnameinfo fake_getnameinfo | 
| Martin v. Löwis | 01dfdb3 | 2001-06-23 16:30:13 +0000 | [diff] [blame] | 294 | #include "getnameinfo.c" | 
 | 295 | #endif | 
 | 296 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 297 | #if defined(MS_WINDOWS) || defined(__BEOS__) | 
 | 298 | /* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */ | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 299 | /* seem to be a few differences in the API */ | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 300 | #define SOCKETCLOSE closesocket | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 301 | #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] | 302 | #endif | 
 | 303 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 304 | #ifdef MS_WIN32 | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 305 | #define EAFNOSUPPORT WSAEAFNOSUPPORT | 
 | 306 | #define snprintf _snprintf | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 307 | #endif | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 308 |  | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 309 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 310 | #define SOCKETCLOSE soclose | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 311 | #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] | 312 | #endif | 
 | 313 |  | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 314 | #ifndef SOCKETCLOSE | 
 | 315 | #define SOCKETCLOSE close | 
 | 316 | #endif | 
 | 317 |  | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 318 | #ifdef __VMS | 
 | 319 | /* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */ | 
 | 320 | #define SEGMENT_SIZE 65535 | 
 | 321 | #endif | 
 | 322 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 323 | #if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H) | 
 | 324 | #define USE_BLUETOOTH 1 | 
 | 325 | #if defined(__FreeBSD__) | 
 | 326 | #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP | 
 | 327 | #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM | 
 | 328 | #define sockaddr_l2 sockaddr_l2cap | 
 | 329 | #define sockaddr_rc sockaddr_rfcomm | 
 | 330 | #define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr) | 
 | 331 | #define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb) | 
 | 332 | #define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) | 
 | 333 | #else | 
| Anthony Baxter | 5d7c067 | 2004-02-16 05:35:28 +0000 | [diff] [blame] | 334 | #define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto) | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 335 | #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) | 
 | 336 | #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) | 
 | 337 | #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) | 
 | 338 | #endif | 
 | 339 | #endif | 
 | 340 |  | 
| Martin v. Löwis | e941617 | 2003-05-03 10:12:45 +0000 | [diff] [blame] | 341 | /* | 
 | 342 |  * Constants for getnameinfo() | 
 | 343 |  */ | 
 | 344 | #if !defined(NI_MAXHOST) | 
 | 345 | #define NI_MAXHOST 1025 | 
 | 346 | #endif | 
 | 347 | #if !defined(NI_MAXSERV) | 
 | 348 | #define NI_MAXSERV 32 | 
 | 349 | #endif | 
 | 350 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 351 | /* XXX There's a problem here: *static* functions are not supposed to have | 
 | 352 |    a Py prefix (or use CapitalizedWords).  Later... */ | 
 | 353 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 354 | /* Global variable holding the exception type for errors detected | 
 | 355 |    by this module (but not argument type or memory errors, etc.). */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 356 | static PyObject *socket_error; | 
 | 357 | static PyObject *socket_herror; | 
 | 358 | static PyObject *socket_gaierror; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 359 | static PyObject *socket_timeout; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 360 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 361 | #ifdef RISCOS | 
 | 362 | /* Global variable which is !=0 if Python is running in a RISC OS taskwindow */ | 
 | 363 | static int taskwindow; | 
 | 364 | #endif | 
 | 365 |  | 
| Tim Peters | 643a7fc | 2002-02-17 04:13:21 +0000 | [diff] [blame] | 366 | /* A forward reference to the socket type object. | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 367 |    The sock_type variable contains pointers to various functions, | 
 | 368 |    some of which call new_sockobject(), which uses sock_type, so | 
| Tim Peters | 643a7fc | 2002-02-17 04:13:21 +0000 | [diff] [blame] | 369 |    there has to be a circular reference. */ | 
| Jeremy Hylton | 938ace6 | 2002-07-17 16:30:39 +0000 | [diff] [blame] | 370 | static PyTypeObject sock_type; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 371 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 372 | /* Convenience function to raise an error according to errno | 
 | 373 |    and return a NULL pointer from a function. */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 374 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 375 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 376 | set_error(void) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 377 | { | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 378 | #ifdef MS_WINDOWS | 
| Mark Hammond | 46a733d | 2000-07-24 01:45:11 +0000 | [diff] [blame] | 379 | 	int err_no = WSAGetLastError(); | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 380 | 	static struct { | 
 | 381 | 		int no; | 
 | 382 | 		const char *msg; | 
 | 383 | 	} *msgp, msgs[] = { | 
 | 384 | 		{WSAEINTR, "Interrupted system call"}, | 
 | 385 | 		{WSAEBADF, "Bad file descriptor"}, | 
 | 386 | 		{WSAEACCES, "Permission denied"}, | 
 | 387 | 		{WSAEFAULT, "Bad address"}, | 
 | 388 | 		{WSAEINVAL, "Invalid argument"}, | 
 | 389 | 		{WSAEMFILE, "Too many open files"}, | 
 | 390 | 		{WSAEWOULDBLOCK, | 
 | 391 | 		  "The socket operation could not complete " | 
 | 392 | 		  "without blocking"}, | 
 | 393 | 		{WSAEINPROGRESS, "Operation now in progress"}, | 
 | 394 | 		{WSAEALREADY, "Operation already in progress"}, | 
 | 395 | 		{WSAENOTSOCK, "Socket operation on non-socket"}, | 
 | 396 | 		{WSAEDESTADDRREQ, "Destination address required"}, | 
 | 397 | 		{WSAEMSGSIZE, "Message too long"}, | 
 | 398 | 		{WSAEPROTOTYPE, "Protocol wrong type for socket"}, | 
 | 399 | 		{WSAENOPROTOOPT, "Protocol not available"}, | 
 | 400 | 		{WSAEPROTONOSUPPORT, "Protocol not supported"}, | 
 | 401 | 		{WSAESOCKTNOSUPPORT, "Socket type not supported"}, | 
 | 402 | 		{WSAEOPNOTSUPP, "Operation not supported"}, | 
 | 403 | 		{WSAEPFNOSUPPORT, "Protocol family not supported"}, | 
 | 404 | 		{WSAEAFNOSUPPORT, "Address family not supported"}, | 
 | 405 | 		{WSAEADDRINUSE, "Address already in use"}, | 
 | 406 | 		{WSAEADDRNOTAVAIL, "Can't assign requested address"}, | 
 | 407 | 		{WSAENETDOWN, "Network is down"}, | 
 | 408 | 		{WSAENETUNREACH, "Network is unreachable"}, | 
 | 409 | 		{WSAENETRESET, "Network dropped connection on reset"}, | 
 | 410 | 		{WSAECONNABORTED, "Software caused connection abort"}, | 
 | 411 | 		{WSAECONNRESET, "Connection reset by peer"}, | 
 | 412 | 		{WSAENOBUFS, "No buffer space available"}, | 
 | 413 | 		{WSAEISCONN, "Socket is already connected"}, | 
 | 414 | 		{WSAENOTCONN, "Socket is not connected"}, | 
 | 415 | 		{WSAESHUTDOWN, "Can't send after socket shutdown"}, | 
 | 416 | 		{WSAETOOMANYREFS, "Too many references: can't splice"}, | 
 | 417 | 		{WSAETIMEDOUT, "Operation timed out"}, | 
 | 418 | 		{WSAECONNREFUSED, "Connection refused"}, | 
 | 419 | 		{WSAELOOP, "Too many levels of symbolic links"}, | 
 | 420 | 		{WSAENAMETOOLONG, "File name too long"}, | 
 | 421 | 		{WSAEHOSTDOWN, "Host is down"}, | 
 | 422 | 		{WSAEHOSTUNREACH, "No route to host"}, | 
 | 423 | 		{WSAENOTEMPTY, "Directory not empty"}, | 
 | 424 | 		{WSAEPROCLIM, "Too many processes"}, | 
 | 425 | 		{WSAEUSERS, "Too many users"}, | 
 | 426 | 		{WSAEDQUOT, "Disc quota exceeded"}, | 
 | 427 | 		{WSAESTALE, "Stale NFS file handle"}, | 
 | 428 | 		{WSAEREMOTE, "Too many levels of remote in path"}, | 
 | 429 | 		{WSASYSNOTREADY, "Network subsystem is unvailable"}, | 
 | 430 | 		{WSAVERNOTSUPPORTED, "WinSock version is not supported"}, | 
 | 431 | 		{WSANOTINITIALISED, | 
 | 432 | 		  "Successful WSAStartup() not yet performed"}, | 
 | 433 | 		{WSAEDISCON, "Graceful shutdown in progress"}, | 
 | 434 | 		/* Resolver errors */ | 
 | 435 | 		{WSAHOST_NOT_FOUND, "No such host is known"}, | 
 | 436 | 		{WSATRY_AGAIN, "Host not found, or server failed"}, | 
 | 437 | 		{WSANO_RECOVERY, "Unexpected server error encountered"}, | 
 | 438 | 		{WSANO_DATA, "Valid name without requested data"}, | 
 | 439 | 		{WSANO_ADDRESS, "No address, look for MX record"}, | 
 | 440 | 		{0, NULL} | 
 | 441 | 	}; | 
| Mark Hammond | 46a733d | 2000-07-24 01:45:11 +0000 | [diff] [blame] | 442 | 	if (err_no) { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 443 | 		PyObject *v; | 
| Mark Hammond | 46a733d | 2000-07-24 01:45:11 +0000 | [diff] [blame] | 444 | 		const char *msg = "winsock error"; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 445 |  | 
| Mark Hammond | 46a733d | 2000-07-24 01:45:11 +0000 | [diff] [blame] | 446 | 		for (msgp = msgs; msgp->msg; msgp++) { | 
 | 447 | 			if (err_no == msgp->no) { | 
 | 448 | 				msg = msgp->msg; | 
 | 449 | 				break; | 
 | 450 | 			} | 
 | 451 | 		} | 
 | 452 |  | 
 | 453 | 		v = Py_BuildValue("(is)", err_no, msg); | 
| Guido van Rossum | 14ed0b2 | 1994-09-29 09:50:09 +0000 | [diff] [blame] | 454 | 		if (v != NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 455 | 			PyErr_SetObject(socket_error, v); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 456 | 			Py_DECREF(v); | 
| Guido van Rossum | 14ed0b2 | 1994-09-29 09:50:09 +0000 | [diff] [blame] | 457 | 		} | 
 | 458 | 		return NULL; | 
 | 459 | 	} | 
 | 460 | 	else | 
 | 461 | #endif | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 462 |  | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 463 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 464 | 	if (sock_errno() != NO_ERROR) { | 
 | 465 | 		APIRET rc; | 
 | 466 | 		ULONG  msglen; | 
 | 467 | 		char outbuf[100]; | 
 | 468 | 		int myerrorcode = sock_errno(); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 469 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 470 | 		/* Retrieve socket-related error message from MPTN.MSG file */ | 
 | 471 | 		rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf), | 
 | 472 | 				   myerrorcode - SOCBASEERR + 26, | 
 | 473 | 				   "mptn.msg", | 
 | 474 | 				   &msglen); | 
 | 475 | 		if (rc == NO_ERROR) { | 
 | 476 | 			PyObject *v; | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 477 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 478 | 			/* OS/2 doesn't guarantee a terminator */ | 
 | 479 | 			outbuf[msglen] = '\0'; | 
 | 480 | 			if (strlen(outbuf) > 0) { | 
 | 481 | 				/* If non-empty msg, trim CRLF */ | 
 | 482 | 				char *lastc = &outbuf[ strlen(outbuf)-1 ]; | 
 | 483 | 				while (lastc > outbuf && isspace(*lastc)) { | 
 | 484 | 					/* Trim trailing whitespace (CRLF) */ | 
 | 485 | 					*lastc-- = '\0'; | 
 | 486 | 				} | 
 | 487 | 			} | 
 | 488 | 			v = Py_BuildValue("(is)", myerrorcode, outbuf); | 
 | 489 | 			if (v != NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 490 | 				PyErr_SetObject(socket_error, v); | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 491 | 				Py_DECREF(v); | 
 | 492 | 			} | 
 | 493 | 			return NULL; | 
 | 494 | 		} | 
 | 495 | 	} | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 496 | #endif | 
 | 497 |  | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 498 | #if defined(RISCOS) | 
 | 499 | 	if (_inet_error.errnum != NULL) { | 
 | 500 | 		PyObject *v; | 
 | 501 | 		v = Py_BuildValue("(is)", errno, _inet_err()); | 
 | 502 | 		if (v != NULL) { | 
 | 503 | 			PyErr_SetObject(socket_error, v); | 
 | 504 | 			Py_DECREF(v); | 
 | 505 | 		} | 
 | 506 | 		return NULL; | 
 | 507 | 	} | 
 | 508 | #endif | 
 | 509 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 510 | 	return PyErr_SetFromErrno(socket_error); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 511 | } | 
 | 512 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 513 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 514 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 515 | set_herror(int h_error) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 516 | { | 
 | 517 | 	PyObject *v; | 
 | 518 |  | 
 | 519 | #ifdef HAVE_HSTRERROR | 
 | 520 | 	v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error)); | 
 | 521 | #else | 
 | 522 | 	v = Py_BuildValue("(is)", h_error, "host not found"); | 
 | 523 | #endif | 
 | 524 | 	if (v != NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 525 | 		PyErr_SetObject(socket_herror, v); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 526 | 		Py_DECREF(v); | 
 | 527 | 	} | 
 | 528 |  | 
 | 529 | 	return NULL; | 
 | 530 | } | 
 | 531 |  | 
 | 532 |  | 
 | 533 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 534 | set_gaierror(int error) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 535 | { | 
 | 536 | 	PyObject *v; | 
 | 537 |  | 
| Martin v. Löwis | 272cb40 | 2002-03-01 08:31:07 +0000 | [diff] [blame] | 538 | #ifdef EAI_SYSTEM | 
 | 539 | 	/* EAI_SYSTEM is not available on Windows XP. */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 540 | 	if (error == EAI_SYSTEM) | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 541 | 		return set_error(); | 
| Martin v. Löwis | 272cb40 | 2002-03-01 08:31:07 +0000 | [diff] [blame] | 542 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 543 |  | 
| Martin v. Löwis | f95dd0a | 2001-08-15 17:14:33 +0000 | [diff] [blame] | 544 | #ifdef HAVE_GAI_STRERROR | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 545 | 	v = Py_BuildValue("(is)", error, gai_strerror(error)); | 
| Martin v. Löwis | f95dd0a | 2001-08-15 17:14:33 +0000 | [diff] [blame] | 546 | #else | 
 | 547 | 	v = Py_BuildValue("(is)", error, "getaddrinfo failed"); | 
 | 548 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 549 | 	if (v != NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 550 | 		PyErr_SetObject(socket_gaierror, v); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 551 | 		Py_DECREF(v); | 
 | 552 | 	} | 
 | 553 |  | 
 | 554 | 	return NULL; | 
 | 555 | } | 
 | 556 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 557 | /* Function to perform the setting of socket blocking mode | 
 | 558 |    internally. block = (1 | 0). */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 559 | static int | 
 | 560 | internal_setblocking(PySocketSockObject *s, int block) | 
 | 561 | { | 
 | 562 | #ifndef RISCOS | 
 | 563 | #ifndef MS_WINDOWS | 
 | 564 | 	int delay_flag; | 
 | 565 | #endif | 
 | 566 | #endif | 
 | 567 |  | 
 | 568 | 	Py_BEGIN_ALLOW_THREADS | 
 | 569 | #ifdef __BEOS__ | 
 | 570 | 	block = !block; | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 571 | 	setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK, | 
 | 572 | 		   (void *)(&block), sizeof(int)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 573 | #else | 
 | 574 | #ifndef RISCOS | 
 | 575 | #ifndef MS_WINDOWS | 
 | 576 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
 | 577 | 	block = !block; | 
 | 578 | 	ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block)); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 579 | #elif defined(__VMS) | 
 | 580 | 	block = !block; | 
 | 581 | 	ioctl(s->sock_fd, FIONBIO, (char *)&block); | 
 | 582 | #else  /* !PYOS_OS2 && !_VMS */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 583 | 	delay_flag = fcntl(s->sock_fd, F_GETFL, 0); | 
 | 584 | 	if (block) | 
| Neal Norwitz | 39d22e5 | 2002-11-02 19:55:21 +0000 | [diff] [blame] | 585 | 		delay_flag &= (~O_NONBLOCK); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 586 | 	else | 
| Neal Norwitz | 39d22e5 | 2002-11-02 19:55:21 +0000 | [diff] [blame] | 587 | 		delay_flag |= O_NONBLOCK; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 588 | 	fcntl(s->sock_fd, F_SETFL, delay_flag); | 
 | 589 | #endif /* !PYOS_OS2 */ | 
 | 590 | #else /* MS_WINDOWS */ | 
 | 591 | 	block = !block; | 
 | 592 | 	ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block); | 
 | 593 | #endif /* MS_WINDOWS */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 594 | #else /* RISCOS */ | 
 | 595 | 	block = !block; | 
 | 596 | 	socketioctl(s->sock_fd, FIONBIO, (u_long*)&block); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 597 | #endif /* RISCOS */ | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 598 | #endif /* __BEOS__ */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 599 | 	Py_END_ALLOW_THREADS | 
 | 600 |  | 
 | 601 | 	/* Since these don't return anything */ | 
 | 602 | 	return 1; | 
 | 603 | } | 
 | 604 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 605 | /* Do a select() on the socket, if necessary (sock_timeout > 0). | 
 | 606 |    The argument writing indicates the direction. | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 607 |    This does not raise an exception; we'll let our caller do that | 
 | 608 |    after they've reacquired the interpreter lock. | 
 | 609 |    Returns 1 on timeout, 0 otherwise. */ | 
 | 610 | static int | 
| Guido van Rossum | b9e916a | 2002-06-07 01:42:47 +0000 | [diff] [blame] | 611 | internal_select(PySocketSockObject *s, int writing) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 612 | { | 
 | 613 | 	fd_set fds; | 
 | 614 | 	struct timeval tv; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 615 | 	int n; | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 616 |  | 
| Guido van Rossum | ad65490 | 2002-07-19 12:44:59 +0000 | [diff] [blame] | 617 | 	/* Nothing to do unless we're in timeout mode (not non-blocking) */ | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 618 | 	if (s->sock_timeout <= 0.0) | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 619 | 		return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 620 |  | 
| Guido van Rossum | ad65490 | 2002-07-19 12:44:59 +0000 | [diff] [blame] | 621 | 	/* Guard against closed socket */ | 
 | 622 | 	if (s->sock_fd < 0) | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 623 | 		return 0; | 
| Guido van Rossum | ad65490 | 2002-07-19 12:44:59 +0000 | [diff] [blame] | 624 |  | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 625 | 	/* Construct the arguments to select */ | 
 | 626 | 	tv.tv_sec = (int)s->sock_timeout; | 
| Guido van Rossum | b9e916a | 2002-06-07 01:42:47 +0000 | [diff] [blame] | 627 | 	tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 628 | 	FD_ZERO(&fds); | 
 | 629 | 	FD_SET(s->sock_fd, &fds); | 
 | 630 |  | 
 | 631 | 	/* See if the socket is ready */ | 
| Guido van Rossum | b9e916a | 2002-06-07 01:42:47 +0000 | [diff] [blame] | 632 | 	if (writing) | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 633 | 		n = select(s->sock_fd+1, NULL, &fds, NULL, &tv); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 634 | 	else | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 635 | 		n = select(s->sock_fd+1, &fds, NULL, NULL, &tv); | 
 | 636 | 	if (n == 0) | 
 | 637 | 		return 1; | 
 | 638 | 	return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 639 | } | 
 | 640 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 641 | /* Initialize a new socket object. */ | 
 | 642 |  | 
| Tim Peters | a12b4cf | 2002-07-18 22:38:44 +0000 | [diff] [blame] | 643 | static double defaulttimeout = -1.0; /* Default timeout for new sockets */ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 644 |  | 
| Mark Hammond | 62b1ab1 | 2002-07-23 06:31:15 +0000 | [diff] [blame] | 645 | PyMODINIT_FUNC | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 646 | init_sockobject(PySocketSockObject *s, | 
 | 647 | 		SOCKET_T fd, int family, int type, int proto) | 
 | 648 | { | 
 | 649 | #ifdef RISCOS | 
 | 650 | 	int block = 1; | 
 | 651 | #endif | 
 | 652 | 	s->sock_fd = fd; | 
 | 653 | 	s->sock_family = family; | 
 | 654 | 	s->sock_type = type; | 
 | 655 | 	s->sock_proto = proto; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 656 | 	s->sock_timeout = defaulttimeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 657 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 658 | 	s->errorhandler = &set_error; | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 659 |  | 
 | 660 | 	if (defaulttimeout >= 0.0) | 
 | 661 | 		internal_setblocking(s, 0); | 
 | 662 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 663 | #ifdef RISCOS | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 664 | 	if (taskwindow) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 665 | 		socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 666 | #endif | 
 | 667 | } | 
 | 668 |  | 
 | 669 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 670 | /* Create a new socket object. | 
 | 671 |    This just creates the object and initializes it. | 
 | 672 |    If the creation fails, return NULL and set an exception (implicit | 
 | 673 |    in NEWOBJ()). */ | 
 | 674 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 675 | static PySocketSockObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 676 | new_sockobject(SOCKET_T fd, int family, int type, int proto) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 677 | { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 678 | 	PySocketSockObject *s; | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 679 | 	s = (PySocketSockObject *) | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 680 | 		PyType_GenericNew(&sock_type, NULL, NULL); | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 681 | 	if (s != NULL) | 
 | 682 | 		init_sockobject(s, fd, family, type, proto); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 683 | 	return s; | 
 | 684 | } | 
 | 685 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 686 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 687 | /* Lock to allow python interpreter to continue, but only allow one | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 688 |    thread to be in gethostbyname or getaddrinfo */ | 
 | 689 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
 | 690 | PyThread_type_lock netdb_lock; | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 691 | #endif | 
 | 692 |  | 
 | 693 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 694 | /* Convert a string specifying a host name or one of a few symbolic | 
 | 695 |    names to a numeric IP address.  This usually calls gethostbyname() | 
 | 696 |    to do the work; the names "" and "<broadcast>" are special. | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 697 |    Return the length (IPv4 should be 4 bytes), or negative if | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 698 |    an error occurred; then an exception is raised. */ | 
 | 699 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 700 | static int | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 701 | 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] | 702 | { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 703 | 	struct addrinfo hints, *res; | 
 | 704 | 	int error; | 
| Anthony Baxter | 0e85f9d | 2003-05-02 15:40:46 +0000 | [diff] [blame] | 705 | 	int d1, d2, d3, d4; | 
 | 706 | 	char ch; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 707 |  | 
| Guido van Rossum | a376cc5 | 1996-12-05 23:43:35 +0000 | [diff] [blame] | 708 | 	memset((void *) addr_ret, '\0', sizeof(*addr_ret)); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 709 | 	if (name[0] == '\0') { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 710 | 		int siz; | 
 | 711 | 		memset(&hints, 0, sizeof(hints)); | 
 | 712 | 		hints.ai_family = af; | 
 | 713 | 		hints.ai_socktype = SOCK_DGRAM;	/*dummy*/ | 
 | 714 | 		hints.ai_flags = AI_PASSIVE; | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 715 | 		Py_BEGIN_ALLOW_THREADS | 
 | 716 | 		ACQUIRE_GETADDRINFO_LOCK | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 717 | 		error = getaddrinfo(NULL, "0", &hints, &res); | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 718 | 		Py_END_ALLOW_THREADS | 
 | 719 | 		/* We assume that those thread-unsafe getaddrinfo() versions | 
 | 720 | 		   *are* safe regarding their return value, ie. that a | 
 | 721 | 		   subsequent call to getaddrinfo() does not destroy the | 
 | 722 | 		   outcome of the first call. */ | 
 | 723 | 		RELEASE_GETADDRINFO_LOCK | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 724 | 		if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 725 | 			set_gaierror(error); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 726 | 			return -1; | 
 | 727 | 		} | 
 | 728 | 		switch (res->ai_family) { | 
 | 729 | 		case AF_INET: | 
 | 730 | 			siz = 4; | 
 | 731 | 			break; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 732 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 733 | 		case AF_INET6: | 
 | 734 | 			siz = 16; | 
 | 735 | 			break; | 
 | 736 | #endif | 
 | 737 | 		default: | 
 | 738 | 			freeaddrinfo(res); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 739 | 			PyErr_SetString(socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 740 | 				"unsupported address family"); | 
 | 741 | 			return -1; | 
 | 742 | 		} | 
 | 743 | 		if (res->ai_next) { | 
| Martin v. Löwis | f0b11d2 | 2001-11-07 08:31:03 +0000 | [diff] [blame] | 744 | 			freeaddrinfo(res); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 745 | 			PyErr_SetString(socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 746 | 				"wildcard resolved to multiple address"); | 
 | 747 | 			return -1; | 
 | 748 | 		} | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 749 | 		if (res->ai_addrlen < addr_ret_size) | 
 | 750 | 			addr_ret_size = res->ai_addrlen; | 
 | 751 | 		memcpy(addr_ret, res->ai_addr, addr_ret_size); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 752 | 		freeaddrinfo(res); | 
 | 753 | 		return siz; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 754 | 	} | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 755 | 	if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 756 | 		struct sockaddr_in *sin; | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 757 | 		if (af != AF_INET && af != AF_UNSPEC) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 758 | 			PyErr_SetString(socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 759 | 				"address family mismatched"); | 
 | 760 | 			return -1; | 
 | 761 | 		} | 
 | 762 | 		sin = (struct sockaddr_in *)addr_ret; | 
 | 763 | 		memset((void *) sin, '\0', sizeof(*sin)); | 
 | 764 | 		sin->sin_family = AF_INET; | 
 | 765 | #ifdef HAVE_SOCKADDR_SA_LEN | 
 | 766 | 		sin->sin_len = sizeof(*sin); | 
 | 767 | #endif | 
 | 768 | 		sin->sin_addr.s_addr = INADDR_BROADCAST; | 
 | 769 | 		return sizeof(sin->sin_addr); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 770 | 	} | 
| Anthony Baxter | 0e85f9d | 2003-05-02 15:40:46 +0000 | [diff] [blame] | 771 | 	if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 && | 
 | 772 | 	    0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 && | 
 | 773 | 	    0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) { | 
 | 774 | 		struct sockaddr_in *sin; | 
 | 775 | 		sin = (struct sockaddr_in *)addr_ret; | 
 | 776 | 		sin->sin_addr.s_addr = htonl( | 
 | 777 | 			((long) d1 << 24) | ((long) d2 << 16) | | 
 | 778 | 			((long) d3 << 8) | ((long) d4 << 0)); | 
 | 779 | 		sin->sin_family = AF_INET; | 
 | 780 | #ifdef HAVE_SOCKADDR_SA_LEN | 
 | 781 | 		sin->sin_len = sizeof(*sin); | 
 | 782 | #endif | 
 | 783 | 		return 4; | 
 | 784 | 	} | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 785 | 	memset(&hints, 0, sizeof(hints)); | 
 | 786 | 	hints.ai_family = af; | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 787 | 	Py_BEGIN_ALLOW_THREADS | 
 | 788 | 	ACQUIRE_GETADDRINFO_LOCK | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 789 | 	error = getaddrinfo(name, NULL, &hints, &res); | 
| Martin v. Löwis | 7c4b5fa | 2001-10-25 09:04:03 +0000 | [diff] [blame] | 790 | #if defined(__digital__) && defined(__unix__) | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 791 | 	if (error == EAI_NONAME && af == AF_UNSPEC) { | 
 | 792 | 		/* On Tru64 V5.1, numeric-to-addr conversion fails | 
 | 793 | 		   if no address family is given. Assume IPv4 for now.*/ | 
 | 794 | 		hints.ai_family = AF_INET; | 
 | 795 | 		error = getaddrinfo(name, NULL, &hints, &res); | 
 | 796 | 	} | 
| Martin v. Löwis | 7c4b5fa | 2001-10-25 09:04:03 +0000 | [diff] [blame] | 797 | #endif | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 798 | 	Py_END_ALLOW_THREADS | 
 | 799 | 	RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 800 | 	if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 801 | 		set_gaierror(error); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 802 | 		return -1; | 
 | 803 | 	} | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 804 | 	if (res->ai_addrlen < addr_ret_size) | 
 | 805 | 		addr_ret_size = res->ai_addrlen; | 
 | 806 | 	memcpy((char *) addr_ret, res->ai_addr, addr_ret_size); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 807 | 	freeaddrinfo(res); | 
 | 808 | 	switch (addr_ret->sa_family) { | 
 | 809 | 	case AF_INET: | 
 | 810 | 		return 4; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 811 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 812 | 	case AF_INET6: | 
 | 813 | 		return 16; | 
| Guido van Rossum | 955becc | 1999-03-22 20:14:53 +0000 | [diff] [blame] | 814 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 815 | 	default: | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 816 | 		PyErr_SetString(socket_error, "unknown address family"); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 817 | 		return -1; | 
 | 818 | 	} | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 819 | } | 
 | 820 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 821 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 822 | /* Create a string object representing an IP address. | 
 | 823 |    This is always a string of the form 'dd.dd.dd.dd' (with variable | 
 | 824 |    size numbers). */ | 
 | 825 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 826 | static PyObject * | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 827 | makeipaddr(struct sockaddr *addr, int addrlen) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 828 | { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 829 | 	char buf[NI_MAXHOST]; | 
 | 830 | 	int error; | 
 | 831 |  | 
 | 832 | 	error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0, | 
 | 833 | 		NI_NUMERICHOST); | 
 | 834 | 	if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 835 | 		set_gaierror(error); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 836 | 		return NULL; | 
 | 837 | 	} | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 838 | 	return PyString_FromString(buf); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 839 | } | 
 | 840 |  | 
 | 841 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 842 | #ifdef USE_BLUETOOTH | 
 | 843 | /* Convert a string representation of a Bluetooth address into a numeric | 
 | 844 |    address.  Returns the length (6), or raises an exception and returns -1 if | 
 | 845 |    an error occurred. */ | 
 | 846 |  | 
 | 847 | static int | 
 | 848 | setbdaddr(char *name, bdaddr_t *bdaddr) | 
 | 849 | { | 
 | 850 | 	unsigned int b0, b1, b2, b3, b4, b5; | 
 | 851 | 	char ch; | 
 | 852 | 	int n; | 
 | 853 |  | 
 | 854 | 	n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", | 
 | 855 | 		   &b5, &b4, &b3, &b2, &b1, &b0, &ch); | 
 | 856 | 	if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { | 
 | 857 | 		bdaddr->b[0] = b0; | 
 | 858 | 		bdaddr->b[1] = b1; | 
 | 859 | 		bdaddr->b[2] = b2; | 
 | 860 | 		bdaddr->b[3] = b3; | 
 | 861 | 		bdaddr->b[4] = b4; | 
 | 862 | 		bdaddr->b[5] = b5; | 
 | 863 | 		return 6; | 
 | 864 | 	} else { | 
 | 865 | 		PyErr_SetString(socket_error, "bad bluetooth address"); | 
 | 866 | 		return -1; | 
 | 867 | 	} | 
 | 868 | } | 
 | 869 |  | 
 | 870 | /* Create a string representation of the Bluetooth address.  This is always a | 
 | 871 |    string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal | 
 | 872 |    value (zero padded if necessary). */ | 
 | 873 |  | 
 | 874 | static PyObject * | 
 | 875 | makebdaddr(bdaddr_t *bdaddr) | 
 | 876 | { | 
 | 877 | 	char buf[(6 * 2) + 5 + 1]; | 
 | 878 |  | 
 | 879 | 	sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", | 
 | 880 | 		bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], | 
 | 881 | 		bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); | 
 | 882 | 	return PyString_FromString(buf); | 
 | 883 | } | 
 | 884 | #endif | 
 | 885 |  | 
 | 886 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 887 | /* Create an object representing the given socket address, | 
 | 888 |    suitable for passing it back to bind(), connect() etc. | 
 | 889 |    The family field of the sockaddr structure is inspected | 
 | 890 |    to determine what kind of address it really is. */ | 
 | 891 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 892 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 893 | static PyObject * | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 894 | makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 895 | { | 
| Guido van Rossum | 25bec8c | 1992-08-05 19:00:45 +0000 | [diff] [blame] | 896 | 	if (addrlen == 0) { | 
 | 897 | 		/* No address -- may be recvfrom() from known socket */ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 898 | 		Py_INCREF(Py_None); | 
 | 899 | 		return Py_None; | 
| Guido van Rossum | 25bec8c | 1992-08-05 19:00:45 +0000 | [diff] [blame] | 900 | 	} | 
 | 901 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 902 | #ifdef __BEOS__ | 
| Guido van Rossum | 2c8bcb8 | 2000-04-25 21:34:53 +0000 | [diff] [blame] | 903 | 	/* XXX: BeOS version of accept() doesn't set family correctly */ | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 904 | 	addr->sa_family = AF_INET; | 
 | 905 | #endif | 
 | 906 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 907 | 	switch (addr->sa_family) { | 
 | 908 |  | 
 | 909 | 	case AF_INET: | 
 | 910 | 	{ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 911 | 		struct sockaddr_in *a; | 
 | 912 | 		PyObject *addrobj = makeipaddr(addr, sizeof(*a)); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 913 | 		PyObject *ret = NULL; | 
 | 914 | 		if (addrobj) { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 915 | 			a = (struct sockaddr_in *)addr; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 916 | 			ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port)); | 
 | 917 | 			Py_DECREF(addrobj); | 
 | 918 | 		} | 
| Guido van Rossum | 6f5afc9 | 1993-02-05 09:46:15 +0000 | [diff] [blame] | 919 | 		return ret; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 920 | 	} | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 921 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 922 | #if defined(AF_UNIX) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 923 | 	case AF_UNIX: | 
 | 924 | 	{ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 925 | 		struct sockaddr_un *a = (struct sockaddr_un *) addr; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 926 | 		return PyString_FromString(a->sun_path); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 927 | 	} | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 928 | #endif /* AF_UNIX */ | 
 | 929 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 930 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 931 | 	case AF_INET6: | 
 | 932 | 	{ | 
 | 933 | 		struct sockaddr_in6 *a; | 
 | 934 | 		PyObject *addrobj = makeipaddr(addr, sizeof(*a)); | 
 | 935 | 		PyObject *ret = NULL; | 
 | 936 | 		if (addrobj) { | 
 | 937 | 			a = (struct sockaddr_in6 *)addr; | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 938 | 			ret = Py_BuildValue("Oiii", | 
 | 939 | 					    addrobj, | 
 | 940 | 					    ntohs(a->sin6_port), | 
 | 941 | 					    a->sin6_flowinfo, | 
 | 942 | 					    a->sin6_scope_id); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 943 | 			Py_DECREF(addrobj); | 
 | 944 | 		} | 
 | 945 | 		return ret; | 
 | 946 | 	} | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 947 | #endif | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 948 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 949 | #ifdef USE_BLUETOOTH | 
 | 950 | 	case AF_BLUETOOTH: | 
 | 951 | 		switch (proto) { | 
 | 952 |  | 
 | 953 | 		case BTPROTO_L2CAP: | 
 | 954 | 		{ | 
 | 955 | 			struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr; | 
 | 956 | 			PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr)); | 
 | 957 | 			PyObject *ret = NULL; | 
 | 958 | 			if (addrobj) { | 
 | 959 | 				ret = Py_BuildValue("Oi", | 
 | 960 | 						    addrobj, | 
 | 961 | 						    _BT_L2_MEMB(a, psm)); | 
 | 962 | 				Py_DECREF(addrobj); | 
 | 963 | 			} | 
 | 964 | 			return ret; | 
 | 965 | 		} | 
 | 966 |  | 
 | 967 | 		case BTPROTO_RFCOMM: | 
 | 968 | 		{ | 
 | 969 | 			struct sockaddr_rc *a = (struct sockaddr_rc *) addr; | 
 | 970 | 			PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr)); | 
 | 971 | 			PyObject *ret = NULL; | 
 | 972 | 			if (addrobj) { | 
 | 973 | 				ret = Py_BuildValue("Oi", | 
 | 974 | 						    addrobj, | 
 | 975 | 						    _BT_RC_MEMB(a, channel)); | 
 | 976 | 				Py_DECREF(addrobj); | 
 | 977 | 			} | 
 | 978 | 			return ret; | 
 | 979 | 		} | 
 | 980 |  | 
 | 981 | #if !defined(__FreeBSD__) | 
 | 982 | 		case BTPROTO_SCO: | 
 | 983 | 		{ | 
 | 984 | 			struct sockaddr_sco *a = (struct sockaddr_sco *) addr; | 
 | 985 | 			return makebdaddr(&_BT_SCO_MEMB(a, bdaddr)); | 
 | 986 | 		} | 
 | 987 | #endif | 
 | 988 |  | 
 | 989 | 		} | 
 | 990 | #endif | 
 | 991 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 992 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 993 | 	case AF_PACKET: | 
 | 994 | 	{ | 
 | 995 | 		struct sockaddr_ll *a = (struct sockaddr_ll *)addr; | 
 | 996 | 		char *ifname = ""; | 
 | 997 | 		struct ifreq ifr; | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 998 | 		/* need to look up interface name give index */ | 
 | 999 | 		if (a->sll_ifindex) { | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1000 | 			ifr.ifr_ifindex = a->sll_ifindex; | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 1001 | 			if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0) | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1002 | 				ifname = ifr.ifr_name; | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1003 | 		} | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1004 | 		return Py_BuildValue("shbhs#", | 
 | 1005 | 				     ifname, | 
 | 1006 | 				     ntohs(a->sll_protocol), | 
 | 1007 | 				     a->sll_pkttype, | 
 | 1008 | 				     a->sll_hatype, | 
 | 1009 | 				     a->sll_addr, | 
 | 1010 | 				     a->sll_halen); | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1011 | 	} | 
 | 1012 | #endif | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1013 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1014 | 	/* More cases here... */ | 
 | 1015 |  | 
 | 1016 | 	default: | 
| Guido van Rossum | aa948df | 1997-05-07 17:41:48 +0000 | [diff] [blame] | 1017 | 		/* If we don't know the address family, don't raise an | 
 | 1018 | 		   exception -- return it as a tuple. */ | 
 | 1019 | 		return Py_BuildValue("is#", | 
 | 1020 | 				     addr->sa_family, | 
 | 1021 | 				     addr->sa_data, | 
 | 1022 | 				     sizeof(addr->sa_data)); | 
| Guido van Rossum | 25bec8c | 1992-08-05 19:00:45 +0000 | [diff] [blame] | 1023 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1024 | 	} | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1025 | } | 
 | 1026 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1027 |  | 
 | 1028 | /* Parse a socket address argument according to the socket object's | 
 | 1029 |    address family.  Return 1 if the address was in the proper format, | 
 | 1030 |    0 of not.  The address is returned through addr_ret, its length | 
 | 1031 |    through len_ret. */ | 
 | 1032 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1033 | static int | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1034 | getsockaddrarg(PySocketSockObject *s, PyObject *args, | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 1035 | 	       struct sockaddr **addr_ret, int *len_ret) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1036 | { | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1037 | 	switch (s->sock_family) { | 
 | 1038 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 1039 | #if defined(AF_UNIX) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1040 | 	case AF_UNIX: | 
 | 1041 | 	{ | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1042 | 		struct sockaddr_un* addr; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1043 | 		char *path; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1044 | 		int len; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1045 | 		addr = (struct sockaddr_un*)&(s->sock_addr).un; | 
| Guido van Rossum | 7e48898 | 1998-10-08 02:25:24 +0000 | [diff] [blame] | 1046 | 		if (!PyArg_Parse(args, "t#", &path, &len)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1047 | 			return 0; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1048 | 		if (len > sizeof addr->sun_path) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1049 | 			PyErr_SetString(socket_error, | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1050 | 					"AF_UNIX path too long"); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1051 | 			return 0; | 
 | 1052 | 		} | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1053 | 		addr->sun_family = s->sock_family; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1054 | 		memcpy(addr->sun_path, path, len); | 
| Guido van Rossum | 30b6b2b | 1995-06-14 22:28:08 +0000 | [diff] [blame] | 1055 | 		addr->sun_path[len] = 0; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1056 | 		*addr_ret = (struct sockaddr *) addr; | 
| Andrew MacIntyre | daedf21 | 2004-04-11 12:03:57 +0000 | [diff] [blame] | 1057 | #if defined(PYOS_OS2) | 
 | 1058 | 		*len_ret = sizeof(*addr); | 
 | 1059 | #else | 
| Guido van Rossum | 65af28a | 1996-06-11 18:36:33 +0000 | [diff] [blame] | 1060 | 		*len_ret = len + sizeof(*addr) - sizeof(addr->sun_path); | 
| Andrew MacIntyre | daedf21 | 2004-04-11 12:03:57 +0000 | [diff] [blame] | 1061 | #endif | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1062 | 		return 1; | 
 | 1063 | 	} | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1064 | #endif /* AF_UNIX */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1065 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1066 | 	case AF_INET: | 
 | 1067 | 	{ | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1068 | 		struct sockaddr_in* addr; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1069 | 		char *host; | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 1070 | 		int port, result; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1071 |  		addr=(struct sockaddr_in*)&(s->sock_addr).in; | 
| Guido van Rossum | e4dad90 | 2000-12-01 13:13:11 +0000 | [diff] [blame] | 1072 | 		if (!PyTuple_Check(args)) { | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1073 | 			PyErr_Format( | 
 | 1074 | 				PyExc_TypeError, | 
 | 1075 | 				"getsockaddrarg: " | 
 | 1076 | 				"AF_INET address must be tuple, not %.500s", | 
 | 1077 | 				args->ob_type->tp_name); | 
| Guido van Rossum | e4dad90 | 2000-12-01 13:13:11 +0000 | [diff] [blame] | 1078 | 			return 0; | 
 | 1079 | 		} | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 1080 | 		if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",  | 
 | 1081 | 				      "idna", &host, &port)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1082 | 			return 0; | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 1083 |                 result = setipaddr(host, (struct sockaddr *)addr,  | 
 | 1084 |                                    sizeof(*addr),  AF_INET); | 
 | 1085 |                 PyMem_Free(host); | 
 | 1086 |                 if (result < 0) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1087 | 			return 0; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1088 | 		addr->sin_family = AF_INET; | 
| Guido van Rossum | 644a12b | 1997-04-09 19:24:53 +0000 | [diff] [blame] | 1089 | 		addr->sin_port = htons((short)port); | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 1090 | 		*addr_ret = (struct sockaddr *) addr; | 
 | 1091 | 		*len_ret = sizeof *addr; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1092 | 		return 1; | 
 | 1093 | 	} | 
 | 1094 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 1095 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1096 | 	case AF_INET6: | 
 | 1097 | 	{ | 
 | 1098 | 		struct sockaddr_in6* addr; | 
 | 1099 | 		char *host; | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 1100 | 		int port, flowinfo, scope_id, result; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1101 |  		addr = (struct sockaddr_in6*)&(s->sock_addr).in6; | 
 | 1102 | 		flowinfo = scope_id = 0; | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 1103 | 		if (!PyArg_ParseTuple(args, "eti|ii",  | 
 | 1104 | 				      "idna", &host, &port, &flowinfo, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1105 | 				      &scope_id)) { | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1106 | 			return 0; | 
 | 1107 | 		} | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 1108 |                 result = setipaddr(host, (struct sockaddr *)addr,   | 
 | 1109 |                                    sizeof(*addr), AF_INET6); | 
 | 1110 |                 PyMem_Free(host); | 
 | 1111 |                 if (result < 0) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1112 | 			return 0; | 
 | 1113 | 		addr->sin6_family = s->sock_family; | 
 | 1114 | 		addr->sin6_port = htons((short)port); | 
 | 1115 | 		addr->sin6_flowinfo = flowinfo; | 
 | 1116 | 		addr->sin6_scope_id = scope_id; | 
 | 1117 | 		*addr_ret = (struct sockaddr *) addr; | 
 | 1118 | 		*len_ret = sizeof *addr; | 
 | 1119 | 		return 1; | 
 | 1120 | 	} | 
 | 1121 | #endif | 
 | 1122 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1123 | #ifdef USE_BLUETOOTH | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1124 | 	case AF_BLUETOOTH: | 
 | 1125 | 	{ | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1126 | 		switch (s->sock_proto) { | 
 | 1127 | 		case BTPROTO_L2CAP: | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1128 | 		{ | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1129 | 			struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2); | 
 | 1130 | 			char *straddr; | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1131 |  | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1132 | 			_BT_L2_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1133 | 			if (!PyArg_ParseTuple(args, "si", &straddr, | 
 | 1134 | 					      &_BT_L2_MEMB(addr, psm))) { | 
 | 1135 | 				PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1136 | 						"wrong format"); | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1137 | 				return 0; | 
 | 1138 | 			} | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1139 | 			if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) | 
 | 1140 | 				return 0; | 
 | 1141 |  | 
 | 1142 | 			*addr_ret = (struct sockaddr *) addr; | 
 | 1143 | 			*len_ret = sizeof *addr; | 
 | 1144 | 			return 1; | 
 | 1145 | 		} | 
 | 1146 | 		case BTPROTO_RFCOMM: | 
 | 1147 | 		{ | 
 | 1148 | 			struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc); | 
 | 1149 | 			char *straddr; | 
 | 1150 |  | 
 | 1151 | 			_BT_RC_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1152 | 			if (!PyArg_ParseTuple(args, "si", &straddr, | 
 | 1153 | 					      &_BT_RC_MEMB(addr, channel))) { | 
 | 1154 | 				PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1155 | 						"wrong format"); | 
 | 1156 | 				return 0; | 
 | 1157 | 			} | 
 | 1158 | 			if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0) | 
 | 1159 | 				return 0; | 
 | 1160 |  | 
 | 1161 | 			*addr_ret = (struct sockaddr *) addr; | 
 | 1162 | 			*len_ret = sizeof *addr; | 
 | 1163 | 			return 1; | 
 | 1164 | 		} | 
 | 1165 | #if !defined(__FreeBSD__) | 
 | 1166 | 		case BTPROTO_SCO: | 
 | 1167 | 		{ | 
 | 1168 | 			struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco); | 
 | 1169 | 			char *straddr; | 
 | 1170 |  | 
 | 1171 | 			_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; | 
 | 1172 | 			straddr = PyString_AsString(args); | 
 | 1173 | 			if (straddr == NULL) { | 
 | 1174 | 				PyErr_SetString(socket_error, "getsockaddrarg: " | 
 | 1175 | 						"wrong format"); | 
 | 1176 | 				return 0; | 
 | 1177 | 			} | 
 | 1178 | 			if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) | 
 | 1179 | 				return 0; | 
 | 1180 |  | 
 | 1181 | 			*addr_ret = (struct sockaddr *) addr; | 
 | 1182 | 			*len_ret = sizeof *addr; | 
 | 1183 | 			return 1; | 
 | 1184 | 		} | 
 | 1185 | #endif | 
 | 1186 | 		default: | 
 | 1187 | 			PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol"); | 
 | 1188 | 			return 0; | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1189 | 		} | 
 | 1190 | 	} | 
 | 1191 | #endif | 
 | 1192 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 1193 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1194 | 	case AF_PACKET: | 
 | 1195 | 	{ | 
 | 1196 | 		struct sockaddr_ll* addr; | 
 | 1197 | 		struct ifreq ifr; | 
 | 1198 | 		char *interfaceName; | 
 | 1199 | 		int protoNumber; | 
 | 1200 | 		int hatype = 0; | 
 | 1201 | 		int pkttype = 0; | 
| Andrew M. Kuchling | b8e1717 | 2004-07-10 23:39:35 +0000 | [diff] [blame] | 1202 | 		char *haddr = NULL; | 
 | 1203 | 		unsigned int halen = 0; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1204 |  | 
| Andrew M. Kuchling | b8e1717 | 2004-07-10 23:39:35 +0000 | [diff] [blame] | 1205 | 		if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName, | 
 | 1206 | 				      &protoNumber, &pkttype, &hatype, | 
 | 1207 | 				      &haddr, &halen)) | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1208 | 			return 0; | 
 | 1209 | 		strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)); | 
 | 1210 | 		ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 1211 | 		if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1212 | 		        s->errorhandler(); | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1213 | 			return 0; | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 1214 | 		} | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1215 | 		addr = &(s->sock_addr.ll); | 
 | 1216 | 		addr->sll_family = AF_PACKET; | 
 | 1217 | 		addr->sll_protocol = htons((short)protoNumber); | 
 | 1218 | 		addr->sll_ifindex = ifr.ifr_ifindex; | 
 | 1219 | 		addr->sll_pkttype = pkttype; | 
 | 1220 | 		addr->sll_hatype = hatype; | 
| Andrew M. Kuchling | b8e1717 | 2004-07-10 23:39:35 +0000 | [diff] [blame] | 1221 | 		if (halen > 8) { | 
 | 1222 | 		  PyErr_SetString(PyExc_ValueError, | 
 | 1223 | 				  "Hardware address must be 8 bytes or less"); | 
 | 1224 | 		  return 0; | 
 | 1225 | 		} | 
 | 1226 | 		if (halen != 0) { | 
 | 1227 | 		  memcpy(&addr->sll_addr, haddr, halen); | 
 | 1228 | 		} | 
 | 1229 | 		addr->sll_halen = halen; | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1230 | 		*addr_ret = (struct sockaddr *) addr; | 
 | 1231 | 		*len_ret = sizeof *addr; | 
 | 1232 | 		return 1; | 
 | 1233 | 	} | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1234 | #endif | 
 | 1235 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1236 | 	/* More cases here... */ | 
 | 1237 |  | 
 | 1238 | 	default: | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1239 | 		PyErr_SetString(socket_error, "getsockaddrarg: bad family"); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1240 | 		return 0; | 
 | 1241 |  | 
 | 1242 | 	} | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1243 | } | 
 | 1244 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1245 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1246 | /* 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] | 1247 |    Return 1 if the family is known, 0 otherwise.  The length is returned | 
 | 1248 |    through len_ret. */ | 
 | 1249 |  | 
 | 1250 | static int | 
| Peter Schneider-Kamp | 618e25d | 2000-07-11 23:00:12 +0000 | [diff] [blame] | 1251 | getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1252 | { | 
 | 1253 | 	switch (s->sock_family) { | 
 | 1254 |  | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 1255 | #if defined(AF_UNIX) | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1256 | 	case AF_UNIX: | 
 | 1257 | 	{ | 
 | 1258 | 		*len_ret = sizeof (struct sockaddr_un); | 
 | 1259 | 		return 1; | 
 | 1260 | 	} | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1261 | #endif /* AF_UNIX */ | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1262 |  | 
 | 1263 | 	case AF_INET: | 
 | 1264 | 	{ | 
 | 1265 | 		*len_ret = sizeof (struct sockaddr_in); | 
 | 1266 | 		return 1; | 
 | 1267 | 	} | 
 | 1268 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 1269 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 1270 | 	case AF_INET6: | 
 | 1271 | 	{ | 
 | 1272 | 		*len_ret = sizeof (struct sockaddr_in6); | 
 | 1273 | 		return 1; | 
 | 1274 | 	} | 
 | 1275 | #endif | 
 | 1276 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1277 | #ifdef USE_BLUETOOTH | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1278 | 	case AF_BLUETOOTH: | 
 | 1279 | 	{ | 
 | 1280 | 		switch(s->sock_proto) | 
 | 1281 | 		{ | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1282 |  | 
 | 1283 | 		case BTPROTO_L2CAP: | 
 | 1284 | 			*len_ret = sizeof (struct sockaddr_l2); | 
 | 1285 | 			return 1; | 
 | 1286 | 		case BTPROTO_RFCOMM: | 
 | 1287 | 			*len_ret = sizeof (struct sockaddr_rc); | 
 | 1288 | 			return 1; | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1289 | #if !defined(__FreeBSD__) | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1290 | 		case BTPROTO_SCO: | 
 | 1291 | 			*len_ret = sizeof (struct sockaddr_sco); | 
 | 1292 | 			return 1; | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 1293 | #endif | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1294 | 		default: | 
 | 1295 | 			PyErr_SetString(socket_error, "getsockaddrlen: " | 
 | 1296 | 					"unknown BT protocol"); | 
 | 1297 | 			return 0; | 
 | 1298 |  | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 1299 | 		} | 
 | 1300 | 	} | 
 | 1301 | #endif | 
 | 1302 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 1303 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Jeremy Hylton | 2230865 | 2001-02-02 03:23:09 +0000 | [diff] [blame] | 1304 | 	case AF_PACKET: | 
 | 1305 | 	{ | 
 | 1306 | 		*len_ret = sizeof (struct sockaddr_ll); | 
 | 1307 | 		return 1; | 
 | 1308 | 	} | 
 | 1309 | #endif | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1310 |  | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1311 | 	/* More cases here... */ | 
 | 1312 |  | 
 | 1313 | 	default: | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1314 | 		PyErr_SetString(socket_error, "getsockaddrlen: bad family"); | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1315 | 		return 0; | 
 | 1316 |  | 
 | 1317 | 	} | 
 | 1318 | } | 
 | 1319 |  | 
 | 1320 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1321 | /* s.accept() method */ | 
 | 1322 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1323 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1324 | sock_accept(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1325 | { | 
 | 1326 | 	char addrbuf[256]; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1327 | 	SOCKET_T newfd; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 1328 | 	socklen_t addrlen; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1329 | 	PyObject *sock = NULL; | 
 | 1330 | 	PyObject *addr = NULL; | 
 | 1331 | 	PyObject *res = NULL; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1332 | 	int timeout; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1333 |  | 
| Guido van Rossum | 710e1df | 1992-06-12 10:39:36 +0000 | [diff] [blame] | 1334 | 	if (!getsockaddrlen(s, &addrlen)) | 
 | 1335 | 		return NULL; | 
| Fred Drake | fd16834 | 2001-05-09 19:11:33 +0000 | [diff] [blame] | 1336 | 	memset(addrbuf, 0, addrlen); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1337 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1338 | #ifdef MS_WINDOWS | 
 | 1339 | 	newfd = INVALID_SOCKET; | 
 | 1340 | #else | 
 | 1341 | 	newfd = -1; | 
 | 1342 | #endif | 
 | 1343 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1344 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1345 | 	timeout = internal_select(s, 0); | 
 | 1346 | 	if (!timeout) | 
 | 1347 | 		newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, | 
 | 1348 | 			       &addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1349 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1350 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1351 | 	if (timeout) { | 
 | 1352 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 1353 | 		return NULL; | 
 | 1354 | 	} | 
 | 1355 |  | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1356 | #ifdef MS_WINDOWS | 
 | 1357 | 	if (newfd == INVALID_SOCKET) | 
 | 1358 | #else | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1359 | 	if (newfd < 0) | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1360 | #endif | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1361 | 		return s->errorhandler(); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1362 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1363 | 	/* Create the new object with unspecified family, | 
 | 1364 | 	   to avoid calls to bind() etc. on it. */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1365 | 	sock = (PyObject *) new_sockobject(newfd, | 
 | 1366 | 					   s->sock_family, | 
 | 1367 | 					   s->sock_type, | 
 | 1368 | 					   s->sock_proto); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1369 |  | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1370 | 	if (sock == NULL) { | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 1371 | 		SOCKETCLOSE(newfd); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1372 | 		goto finally; | 
 | 1373 | 	} | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1374 | 	addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1375 | 			    addrlen, s->sock_proto); | 
| Jeremy Hylton | dbfb662 | 2001-02-02 19:55:17 +0000 | [diff] [blame] | 1376 | 	if (addr == NULL) | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1377 | 		goto finally; | 
 | 1378 |  | 
| Raymond Hettinger | 8ae4689 | 2003-10-12 19:09:37 +0000 | [diff] [blame] | 1379 | 	res = PyTuple_Pack(2, sock, addr); | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1380 |  | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1381 | finally: | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1382 | 	Py_XDECREF(sock); | 
 | 1383 | 	Py_XDECREF(addr); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1384 | 	return res; | 
 | 1385 | } | 
 | 1386 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1387 | PyDoc_STRVAR(accept_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1388 | "accept() -> (socket object, address info)\n\ | 
 | 1389 | \n\ | 
 | 1390 | Wait for an incoming connection.  Return a new socket representing the\n\ | 
 | 1391 | 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] | 1392 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1393 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1394 | /* s.setblocking(flag) method.  Argument: | 
 | 1395 |    False -- non-blocking mode; same as settimeout(0) | 
 | 1396 |    True -- blocking mode; same as settimeout(None) | 
 | 1397 | */ | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1398 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1399 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1400 | sock_setblocking(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1401 | { | 
 | 1402 | 	int block; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1403 |  | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1404 | 	block = PyInt_AsLong(arg); | 
 | 1405 | 	if (block == -1 && PyErr_Occurred()) | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1406 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1407 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1408 | 	s->sock_timeout = block ? -1.0 : 0.0; | 
| Guido van Rossum | e8008f0 | 2002-06-07 03:36:20 +0000 | [diff] [blame] | 1409 | 	internal_setblocking(s, block); | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1410 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1411 | 	Py_INCREF(Py_None); | 
 | 1412 | 	return Py_None; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1413 | } | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1414 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1415 | PyDoc_STRVAR(setblocking_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1416 | "setblocking(flag)\n\ | 
 | 1417 | \n\ | 
 | 1418 | 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] | 1419 | setblocking(True) is equivalent to settimeout(None);\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1420 | setblocking(False) is equivalent to settimeout(0.0)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1421 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1422 | /* s.settimeout(timeout) method.  Argument: | 
 | 1423 |    None -- no timeout, blocking mode; same as setblocking(True) | 
 | 1424 |    0.0  -- non-blocking mode; same as setblocking(False) | 
 | 1425 |    > 0  -- timeout mode; operations time out after timeout seconds | 
 | 1426 |    < 0  -- illegal; raises an exception | 
 | 1427 | */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1428 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1429 | sock_settimeout(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1430 | { | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1431 | 	double timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1432 |  | 
 | 1433 | 	if (arg == Py_None) | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1434 | 		timeout = -1.0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1435 | 	else { | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1436 | 		timeout = PyFloat_AsDouble(arg); | 
 | 1437 | 		if (timeout < 0.0) { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1438 | 			if (!PyErr_Occurred()) | 
 | 1439 | 				PyErr_SetString(PyExc_ValueError, | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1440 | 						"Timeout value out of range"); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1441 | 			return NULL; | 
 | 1442 | 		} | 
 | 1443 | 	} | 
 | 1444 |  | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1445 | 	s->sock_timeout = timeout; | 
 | 1446 | 	internal_setblocking(s, timeout < 0.0); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1447 |  | 
 | 1448 | 	Py_INCREF(Py_None); | 
 | 1449 | 	return Py_None; | 
 | 1450 | } | 
 | 1451 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1452 | PyDoc_STRVAR(settimeout_doc, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1453 | "settimeout(timeout)\n\ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1454 | \n\ | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1455 | Set a timeout on socket operations.  'timeout' can be a float,\n\ | 
 | 1456 | giving in seconds, or None.  Setting a timeout of None disables\n\ | 
 | 1457 | the timeout feature and is equivalent to setblocking(1).\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1458 | Setting a timeout of zero is the same as setblocking(0)."); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1459 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 1460 | /* s.gettimeout() method. | 
 | 1461 |    Returns the timeout associated with a socket. */ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1462 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1463 | sock_gettimeout(PySocketSockObject *s) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1464 | { | 
 | 1465 | 	if (s->sock_timeout < 0.0) { | 
 | 1466 | 		Py_INCREF(Py_None); | 
 | 1467 | 		return Py_None; | 
 | 1468 | 	} | 
 | 1469 | 	else | 
 | 1470 | 		return PyFloat_FromDouble(s->sock_timeout); | 
 | 1471 | } | 
 | 1472 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1473 | PyDoc_STRVAR(gettimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 1474 | "gettimeout() -> timeout\n\ | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1475 | \n\ | 
 | 1476 | Returns the timeout in floating seconds associated with socket \n\ | 
 | 1477 | 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] | 1478 | operations are disabled."); | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 1479 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1480 | #ifdef RISCOS | 
 | 1481 | /* s.sleeptaskw(1 | 0) method */ | 
 | 1482 |  | 
 | 1483 | static PyObject * | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 1484 | sock_sleeptaskw(PySocketSockObject *s,PyObject *arg) | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1485 | { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1486 | 	int block; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 1487 | 	block = PyInt_AsLong(arg); | 
 | 1488 | 	if (block == -1 && PyErr_Occurred()) | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1489 | 		return NULL; | 
 | 1490 | 	Py_BEGIN_ALLOW_THREADS | 
 | 1491 | 	socketioctl(s->sock_fd, 0x80046679, (u_long*)&block); | 
 | 1492 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1493 |  | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1494 | 	Py_INCREF(Py_None); | 
 | 1495 | 	return Py_None; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1496 | } | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1497 | PyDoc_STRVAR(sleeptaskw_doc, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1498 | "sleeptaskw(flag)\n\ | 
 | 1499 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1500 | Allow sleeps in taskwindows."); | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1501 | #endif | 
 | 1502 |  | 
 | 1503 |  | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1504 | /* s.setsockopt() method. | 
 | 1505 |    With an integer third argument, sets an integer option. | 
 | 1506 |    With a string third argument, sets an option from a buffer; | 
 | 1507 |    use optional built-in module 'struct' to encode the string. */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1508 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1509 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1510 | sock_setsockopt(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1511 | { | 
 | 1512 | 	int level; | 
 | 1513 | 	int optname; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1514 | 	int res; | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1515 | 	char *buf; | 
 | 1516 | 	int buflen; | 
 | 1517 | 	int flag; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1518 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 1519 | 	if (PyArg_ParseTuple(args, "iii:setsockopt", | 
 | 1520 | 			     &level, &optname, &flag)) { | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1521 | 		buf = (char *) &flag; | 
 | 1522 | 		buflen = sizeof flag; | 
 | 1523 | 	} | 
 | 1524 | 	else { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1525 | 		PyErr_Clear(); | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 1526 | 		if (!PyArg_ParseTuple(args, "iis#:setsockopt", | 
 | 1527 | 				      &level, &optname, &buf, &buflen)) | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1528 | 			return NULL; | 
 | 1529 | 	} | 
| Thomas Wouters | 334fb89 | 2000-07-25 12:56:38 +0000 | [diff] [blame] | 1530 | 	res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen); | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1531 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1532 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1533 | 	Py_INCREF(Py_None); | 
 | 1534 | 	return Py_None; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1535 | } | 
 | 1536 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1537 | PyDoc_STRVAR(setsockopt_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1538 | "setsockopt(level, option, value)\n\ | 
 | 1539 | \n\ | 
 | 1540 | 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] | 1541 | The value argument can either be an integer or a string."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1542 |  | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1543 |  | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1544 | /* s.getsockopt() method. | 
 | 1545 |    With two arguments, retrieves an integer option. | 
 | 1546 |    With a third integer argument, retrieves a string buffer of that size; | 
 | 1547 |    use optional built-in module 'struct' to decode the string. */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1548 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1549 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1550 | sock_getsockopt(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1551 | { | 
 | 1552 | 	int level; | 
 | 1553 | 	int optname; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1554 | 	int res; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1555 | 	PyObject *buf; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 1556 | 	socklen_t buflen = 0; | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1557 |  | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1558 | #ifdef __BEOS__ | 
| Fred Drake | 564a6cc | 2001-05-11 20:12:26 +0000 | [diff] [blame] | 1559 | 	/* We have incomplete socket support. */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1560 | 	PyErr_SetString(socket_error, "getsockopt not supported"); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1561 | 	return NULL; | 
 | 1562 | #else | 
 | 1563 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 1564 | 	if (!PyArg_ParseTuple(args, "ii|i:getsockopt", | 
 | 1565 | 			      &level, &optname, &buflen)) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1566 | 		return NULL; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1567 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1568 | 	if (buflen == 0) { | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1569 | 		int flag = 0; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 1570 | 		socklen_t flagsize = sizeof flag; | 
| Guido van Rossum | b376a4a | 1993-11-23 17:53:17 +0000 | [diff] [blame] | 1571 | 		res = getsockopt(s->sock_fd, level, optname, | 
| Thomas Wouters | 334fb89 | 2000-07-25 12:56:38 +0000 | [diff] [blame] | 1572 | 				 (void *)&flag, &flagsize); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1573 | 		if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1574 | 			return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1575 | 		return PyInt_FromLong(flag); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1576 | 	} | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1577 | #ifdef __VMS | 
 | 1578 | 	if (buflen > 1024) { | 
 | 1579 | #else | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1580 | 	if (buflen <= 0 || buflen > 1024) { | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1581 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1582 | 		PyErr_SetString(socket_error, | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 1583 | 				"getsockopt buflen out of range"); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1584 | 		return NULL; | 
 | 1585 | 	} | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1586 | 	buf = PyString_FromStringAndSize((char *)NULL, buflen); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1587 | 	if (buf == NULL) | 
 | 1588 | 		return NULL; | 
| Guido van Rossum | b376a4a | 1993-11-23 17:53:17 +0000 | [diff] [blame] | 1589 | 	res = getsockopt(s->sock_fd, level, optname, | 
| Fred Drake | 564a6cc | 2001-05-11 20:12:26 +0000 | [diff] [blame] | 1590 | 			 (void *)PyString_AS_STRING(buf), &buflen); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1591 | 	if (res < 0) { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1592 | 		Py_DECREF(buf); | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1593 | 		return s->errorhandler(); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1594 | 	} | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1595 | 	_PyString_Resize(&buf, buflen); | 
| Guido van Rossum | aee0879 | 1992-09-08 09:05:33 +0000 | [diff] [blame] | 1596 | 	return buf; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 1597 | #endif /* __BEOS__ */ | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1598 | } | 
 | 1599 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1600 | PyDoc_STRVAR(getsockopt_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1601 | "getsockopt(level, option[, buffersize]) -> value\n\ | 
 | 1602 | \n\ | 
 | 1603 | Get a socket option.  See the Unix manual for level and option.\n\ | 
 | 1604 | 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] | 1605 | string of that length; otherwise it is an integer."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1606 |  | 
| Guido van Rossum | 0e69587d | 1992-06-05 15:11:30 +0000 | [diff] [blame] | 1607 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1608 | /* s.bind(sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1609 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1610 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1611 | sock_bind(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1612 | { | 
 | 1613 | 	struct sockaddr *addr; | 
 | 1614 | 	int addrlen; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1615 | 	int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1616 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1617 | 	if (!getsockaddrarg(s, addro, &addr, &addrlen)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1618 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1619 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1620 | 	res = bind(s->sock_fd, addr, addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1621 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1622 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1623 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1624 | 	Py_INCREF(Py_None); | 
 | 1625 | 	return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1626 | } | 
 | 1627 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1628 | PyDoc_STRVAR(bind_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1629 | "bind(address)\n\ | 
 | 1630 | \n\ | 
 | 1631 | 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] | 1632 | 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] | 1633 | sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])"); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1634 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1635 |  | 
 | 1636 | /* s.close() method. | 
 | 1637 |    Set the file descriptor to -1 so operations tried subsequently | 
 | 1638 |    will surely fail. */ | 
 | 1639 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1640 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1641 | sock_close(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1642 | { | 
| Guido van Rossum | 20d3fc0 | 2000-12-18 22:23:44 +0000 | [diff] [blame] | 1643 | 	SOCKET_T fd; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1644 |  | 
| Guido van Rossum | 20d3fc0 | 2000-12-18 22:23:44 +0000 | [diff] [blame] | 1645 | 	if ((fd = s->sock_fd) != -1) { | 
 | 1646 | 		s->sock_fd = -1; | 
| Guido van Rossum | 0848146 | 1996-10-12 14:07:22 +0000 | [diff] [blame] | 1647 | 		Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | 20d3fc0 | 2000-12-18 22:23:44 +0000 | [diff] [blame] | 1648 | 		(void) SOCKETCLOSE(fd); | 
| Guido van Rossum | 0848146 | 1996-10-12 14:07:22 +0000 | [diff] [blame] | 1649 | 		Py_END_ALLOW_THREADS | 
 | 1650 | 	} | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1651 | 	Py_INCREF(Py_None); | 
 | 1652 | 	return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1653 | } | 
 | 1654 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1655 | PyDoc_STRVAR(close_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1656 | "close()\n\ | 
 | 1657 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1658 | Close the socket.  It cannot be used after this call."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1659 |  | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1660 | static int | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1661 | internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, | 
 | 1662 | 		 int *timeoutp) | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1663 | { | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1664 | 	int res, timeout; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1665 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1666 | 	timeout = 0; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1667 | 	res = connect(s->sock_fd, addr, addrlen); | 
 | 1668 |  | 
 | 1669 | #ifdef MS_WINDOWS | 
 | 1670 |  | 
 | 1671 | 	if (s->sock_timeout > 0.0) { | 
 | 1672 | 		if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) { | 
| Guido van Rossum | b76bdf8 | 2003-02-19 17:50:16 +0000 | [diff] [blame] | 1673 | 			/* This is a mess.  Best solution: trust select */ | 
 | 1674 | 			fd_set fds; | 
| Mark Hammond | a57ec93 | 2004-08-03 05:06:26 +0000 | [diff] [blame] | 1675 | 			fd_set fds_exc; | 
| Guido van Rossum | b76bdf8 | 2003-02-19 17:50:16 +0000 | [diff] [blame] | 1676 | 			struct timeval tv; | 
 | 1677 | 			tv.tv_sec = (int)s->sock_timeout; | 
 | 1678 | 			tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6); | 
 | 1679 | 			FD_ZERO(&fds); | 
 | 1680 | 			FD_SET(s->sock_fd, &fds); | 
| Mark Hammond | a57ec93 | 2004-08-03 05:06:26 +0000 | [diff] [blame] | 1681 | 			FD_ZERO(&fds_exc); | 
 | 1682 | 			FD_SET(s->sock_fd, &fds_exc); | 
 | 1683 | 			res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv); | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1684 | 			if (res == 0) { | 
| Guido van Rossum | b76bdf8 | 2003-02-19 17:50:16 +0000 | [diff] [blame] | 1685 | 				res = WSAEWOULDBLOCK; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1686 | 				timeout = 1; | 
| Mark Hammond | a57ec93 | 2004-08-03 05:06:26 +0000 | [diff] [blame] | 1687 | 			} else if (res > 0) { | 
 | 1688 | 				if (FD_ISSET(s->sock_fd, &fds)) | 
 | 1689 | 					/* The socket is in the writeable set - this | 
 | 1690 | 					   means connected */ | 
 | 1691 | 					res = 0; | 
 | 1692 | 				else { | 
 | 1693 | 					/* As per MS docs, we need to call getsockopt() | 
 | 1694 | 					   to get the underlying error */ | 
 | 1695 | 					int res_size = sizeof res; | 
 | 1696 | 					/* It must be in the exception set */ | 
 | 1697 | 					assert(FD_ISSET(s->sock_fd, &fds_exc)); | 
 | 1698 | 					if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,  | 
 | 1699 | 					                    (char *)&res, &res_size)) | 
 | 1700 | 						/* getsockopt also clears WSAGetLastError, | 
 | 1701 | 						   so reset it back. */ | 
 | 1702 | 						WSASetLastError(res); | 
 | 1703 | 					else | 
 | 1704 | 						res = WSAGetLastError(); | 
 | 1705 | 				} | 
 | 1706 | 			} | 
| Guido van Rossum | b76bdf8 | 2003-02-19 17:50:16 +0000 | [diff] [blame] | 1707 | 			/* else if (res < 0) an error occurred */ | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1708 | 		} | 
 | 1709 | 	} | 
 | 1710 |  | 
 | 1711 | 	if (res < 0) | 
 | 1712 | 		res = WSAGetLastError(); | 
 | 1713 |  | 
 | 1714 | #else | 
 | 1715 |  | 
 | 1716 | 	if (s->sock_timeout > 0.0) { | 
 | 1717 | 		if (res < 0 && errno == EINPROGRESS) { | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1718 | 			timeout = internal_select(s, 1); | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1719 | 			res = connect(s->sock_fd, addr, addrlen); | 
| Guido van Rossum | 12e3c71 | 2002-08-08 20:39:30 +0000 | [diff] [blame] | 1720 | 			if (res < 0 && errno == EISCONN) | 
 | 1721 | 				res = 0; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1722 | 		} | 
 | 1723 | 	} | 
 | 1724 |  | 
 | 1725 | 	if (res < 0) | 
 | 1726 | 		res = errno; | 
 | 1727 |  | 
 | 1728 | #endif | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1729 | 	*timeoutp = timeout; | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1730 |  | 
 | 1731 | 	return res; | 
 | 1732 | } | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1733 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1734 | /* s.connect(sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1735 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1736 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1737 | sock_connect(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1738 | { | 
 | 1739 | 	struct sockaddr *addr; | 
 | 1740 | 	int addrlen; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1741 | 	int res; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1742 | 	int timeout; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1743 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1744 | 	if (!getsockaddrarg(s, addro, &addr, &addrlen)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1745 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1746 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1747 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1748 | 	res = internal_connect(s, addr, addrlen, &timeout); | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 1749 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1750 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1751 | 	if (timeout) { | 
 | 1752 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 1753 | 		return NULL; | 
 | 1754 | 	} | 
| Guido van Rossum | 7b8bac1 | 2002-06-13 16:07:04 +0000 | [diff] [blame] | 1755 | 	if (res != 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1756 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1757 | 	Py_INCREF(Py_None); | 
 | 1758 | 	return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1759 | } | 
 | 1760 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1761 | PyDoc_STRVAR(connect_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1762 | "connect(address)\n\ | 
 | 1763 | \n\ | 
 | 1764 | 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] | 1765 | is a pair (host, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1766 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1767 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1768 | /* s.connect_ex(sockaddr) method */ | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1769 |  | 
 | 1770 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1771 | sock_connect_ex(PySocketSockObject *s, PyObject *addro) | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1772 | { | 
 | 1773 | 	struct sockaddr *addr; | 
 | 1774 | 	int addrlen; | 
 | 1775 | 	int res; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1776 | 	int timeout; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1777 |  | 
| Fred Drake | 728819a | 2000-07-01 03:40:12 +0000 | [diff] [blame] | 1778 | 	if (!getsockaddrarg(s, addro, &addr, &addrlen)) | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1779 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1780 |  | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1781 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 1782 | 	res = internal_connect(s, addr, addrlen, &timeout); | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1783 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 1784 |  | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1785 | 	return PyInt_FromLong((long) res); | 
 | 1786 | } | 
 | 1787 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1788 | PyDoc_STRVAR(connect_ex_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 1789 | "connect_ex(address) -> errno\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1790 | \n\ | 
 | 1791 | 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] | 1792 | instead of raising an exception when an error occurs."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1793 |  | 
| Guido van Rossum | fc4255d | 1997-11-19 18:57:13 +0000 | [diff] [blame] | 1794 |  | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 1795 | /* s.fileno() method */ | 
 | 1796 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1797 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1798 | sock_fileno(PySocketSockObject *s) | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 1799 | { | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1800 | #if SIZEOF_SOCKET_T <= SIZEOF_LONG | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1801 | 	return PyInt_FromLong((long) s->sock_fd); | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1802 | #else | 
| Martin v. Löwis | b9a0f91 | 2003-03-29 10:06:18 +0000 | [diff] [blame] | 1803 | 	return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd); | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1804 | #endif | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 1805 | } | 
 | 1806 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1807 | PyDoc_STRVAR(fileno_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1808 | "fileno() -> integer\n\ | 
 | 1809 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1810 | Return the integer file descriptor of the socket."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1811 |  | 
| Guido van Rossum | ed233a5 | 1992-06-23 09:07:03 +0000 | [diff] [blame] | 1812 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1813 | #ifndef NO_DUP | 
 | 1814 | /* s.dup() method */ | 
 | 1815 |  | 
 | 1816 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1817 | sock_dup(PySocketSockObject *s) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1818 | { | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1819 | 	SOCKET_T newfd; | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1820 | 	PyObject *sock; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1821 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1822 | 	newfd = dup(s->sock_fd); | 
 | 1823 | 	if (newfd < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1824 | 		return s->errorhandler(); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1825 | 	sock = (PyObject *) new_sockobject(newfd, | 
 | 1826 | 					   s->sock_family, | 
 | 1827 | 					   s->sock_type, | 
 | 1828 | 					   s->sock_proto); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1829 | 	if (sock == NULL) | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 1830 | 		SOCKETCLOSE(newfd); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1831 | 	return sock; | 
 | 1832 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1833 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1834 | PyDoc_STRVAR(dup_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1835 | "dup() -> socket object\n\ | 
 | 1836 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1837 | Return a new socket object connected to the same system resource."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1838 |  | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 1839 | #endif | 
 | 1840 |  | 
 | 1841 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1842 | /* s.getsockname() method */ | 
 | 1843 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1844 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1845 | sock_getsockname(PySocketSockObject *s) | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1846 | { | 
 | 1847 | 	char addrbuf[256]; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 1848 | 	int res; | 
 | 1849 | 	socklen_t addrlen; | 
 | 1850 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1851 | 	if (!getsockaddrlen(s, &addrlen)) | 
 | 1852 | 		return NULL; | 
| Guido van Rossum | ca42b16 | 1996-01-12 01:36:05 +0000 | [diff] [blame] | 1853 | 	memset(addrbuf, 0, addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1854 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1855 | 	res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1856 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1857 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1858 | 		return s->errorhandler(); | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1859 | 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen, | 
 | 1860 | 			    s->sock_proto); | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1861 | } | 
 | 1862 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1863 | PyDoc_STRVAR(getsockname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1864 | "getsockname() -> address info\n\ | 
 | 1865 | \n\ | 
 | 1866 | 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] | 1867 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1868 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1869 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1870 | #ifdef HAVE_GETPEERNAME		/* Cray APP doesn't have this :-( */ | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1871 | /* s.getpeername() method */ | 
 | 1872 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1873 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1874 | sock_getpeername(PySocketSockObject *s) | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1875 | { | 
 | 1876 | 	char addrbuf[256]; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 1877 | 	int res; | 
 | 1878 | 	socklen_t addrlen; | 
 | 1879 |  | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1880 | 	if (!getsockaddrlen(s, &addrlen)) | 
 | 1881 | 		return NULL; | 
| Fred Drake | fd16834 | 2001-05-09 19:11:33 +0000 | [diff] [blame] | 1882 | 	memset(addrbuf, 0, addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1883 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1884 | 	res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1885 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1886 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1887 | 		return s->errorhandler(); | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 1888 | 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen, | 
 | 1889 | 			    s->sock_proto); | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1890 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1891 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1892 | PyDoc_STRVAR(getpeername_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1893 | "getpeername() -> address info\n\ | 
 | 1894 | \n\ | 
 | 1895 | 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] | 1896 | info is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1897 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1898 | #endif /* HAVE_GETPEERNAME */ | 
| Guido van Rossum | c89705d | 1992-11-26 08:54:07 +0000 | [diff] [blame] | 1899 |  | 
 | 1900 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1901 | /* s.listen(n) method */ | 
 | 1902 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1903 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1904 | sock_listen(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1905 | { | 
 | 1906 | 	int backlog; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1907 | 	int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 1908 |  | 
 | 1909 | 	backlog = PyInt_AsLong(arg); | 
 | 1910 | 	if (backlog == -1 && PyErr_Occurred()) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1911 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1912 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1913 | 	if (backlog < 1) | 
 | 1914 | 		backlog = 1; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1915 | 	res = listen(s->sock_fd, backlog); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1916 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 1917 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1918 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1919 | 	Py_INCREF(Py_None); | 
 | 1920 | 	return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1921 | } | 
 | 1922 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1923 | PyDoc_STRVAR(listen_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1924 | "listen(backlog)\n\ | 
 | 1925 | \n\ | 
 | 1926 | Enable a server to accept connections.  The backlog argument must be at\n\ | 
 | 1927 | 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] | 1928 | will allow before refusing new connections."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1929 |  | 
 | 1930 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 1931 | #ifndef NO_DUP | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1932 | /* s.makefile(mode) method. | 
 | 1933 |    Create a new open file object referring to a dupped version of | 
 | 1934 |    the socket's file descriptor.  (The dup() call is necessary so | 
 | 1935 |    that the open file and socket objects may be closed independent | 
 | 1936 |    of each other.) | 
 | 1937 |    The mode argument specifies 'r' or 'w' passed to fdopen(). */ | 
 | 1938 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1939 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1940 | sock_makefile(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1941 | { | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 1942 | 	extern int fclose(FILE *); | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 1943 | 	char *mode = "r"; | 
 | 1944 | 	int bufsize = -1; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1945 | #ifdef MS_WIN32 | 
| Tim Peters | 79248aa | 2001-08-29 21:37:10 +0000 | [diff] [blame] | 1946 | 	Py_intptr_t fd; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 1947 | #else | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1948 | 	int fd; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1949 | #endif | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1950 | 	FILE *fp; | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 1951 | 	PyObject *f; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1952 | #ifdef __VMS | 
 | 1953 | 	char *mode_r = "r"; | 
 | 1954 | 	char *mode_w = "w"; | 
 | 1955 | #endif | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 1956 |  | 
| Guido van Rossum | 43713e5 | 2000-02-29 13:59:29 +0000 | [diff] [blame] | 1957 | 	if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 1958 | 		return NULL; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1959 | #ifdef __VMS | 
 | 1960 | 	if (strcmp(mode,"rb") == 0) { | 
 | 1961 | 	    mode = mode_r; | 
 | 1962 | 	} | 
 | 1963 | 	else { | 
 | 1964 | 		if (strcmp(mode,"wb") == 0) { | 
 | 1965 | 			mode = mode_w; | 
 | 1966 | 		} | 
 | 1967 | 	} | 
 | 1968 | #endif | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 1969 | #ifdef MS_WIN32 | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1970 | 	if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) || | 
 | 1971 | 	    ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) | 
| Guido van Rossum | 30b6b2b | 1995-06-14 22:28:08 +0000 | [diff] [blame] | 1972 | #else | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1973 | 	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] | 1974 | #endif | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1975 | 	{ | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 1976 | 		if (fd >= 0) | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 1977 | 			SOCKETCLOSE(fd); | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 1978 | 		return s->errorhandler(); | 
| Guido van Rossum | 6b14491 | 1995-03-14 15:05:13 +0000 | [diff] [blame] | 1979 | 	} | 
 | 1980 | 	f = PyFile_FromFile(fp, "<socket>", mode, fclose); | 
 | 1981 | 	if (f != NULL) | 
 | 1982 | 		PyFile_SetBufSize(f, bufsize); | 
 | 1983 | 	return f; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1984 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1985 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1986 | PyDoc_STRVAR(makefile_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 1987 | "makefile([mode[, buffersize]]) -> file object\n\ | 
 | 1988 | \n\ | 
 | 1989 | Return a regular file object corresponding to the socket.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 1990 | 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] | 1991 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 1992 | #endif /* NO_DUP */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1993 |  | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 1994 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 1995 | /* s.recv(nbytes [,flags]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1996 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 1997 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 1998 | sock_recv(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 1999 | { | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2000 | 	int len, n = 0, flags = 0, timeout; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2001 | 	PyObject *buf; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2002 | #ifdef __VMS | 
 | 2003 | 	int read_length; | 
 | 2004 | 	char *read_buf; | 
 | 2005 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2006 |  | 
| Guido van Rossum | 43713e5 | 2000-02-29 13:59:29 +0000 | [diff] [blame] | 2007 | 	if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags)) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2008 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2009 |  | 
 | 2010 | 	if (len < 0) { | 
| Martin v. Löwis | fba64e1 | 2001-11-19 10:41:26 +0000 | [diff] [blame] | 2011 | 		PyErr_SetString(PyExc_ValueError, | 
| Guido van Rossum | 11ba094 | 2002-06-13 15:07:44 +0000 | [diff] [blame] | 2012 | 				"negative buffersize in recv"); | 
| Martin v. Löwis | fba64e1 | 2001-11-19 10:41:26 +0000 | [diff] [blame] | 2013 | 		return NULL; | 
 | 2014 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2015 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2016 | 	buf = PyString_FromStringAndSize((char *) 0, len); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2017 | 	if (buf == NULL) | 
 | 2018 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2019 |  | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2020 | #ifndef __VMS | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2021 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2022 | 	timeout = internal_select(s, 0); | 
 | 2023 | 	if (!timeout) | 
 | 2024 | 		n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2025 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2026 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2027 | 	if (timeout) { | 
 | 2028 | 		Py_DECREF(buf); | 
 | 2029 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 2030 | 		return NULL; | 
 | 2031 | 	} | 
| Guido van Rossum | 7c53b77 | 1995-09-13 18:39:47 +0000 | [diff] [blame] | 2032 | 	if (n < 0) { | 
 | 2033 | 		Py_DECREF(buf); | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2034 | 		return s->errorhandler(); | 
| Guido van Rossum | 7c53b77 | 1995-09-13 18:39:47 +0000 | [diff] [blame] | 2035 | 	} | 
| Tim Peters | 5de9842 | 2002-04-27 18:44:32 +0000 | [diff] [blame] | 2036 | 	if (n != len) | 
 | 2037 | 		_PyString_Resize(&buf, n); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2038 | #else | 
 | 2039 | 	read_buf = PyString_AsString(buf); | 
 | 2040 | 	read_length = len; | 
 | 2041 | 	while (read_length != 0) { | 
 | 2042 | 		unsigned int segment; | 
 | 2043 |  | 
 | 2044 | 		segment = read_length /SEGMENT_SIZE; | 
 | 2045 | 		if (segment != 0) { | 
 | 2046 | 			segment = SEGMENT_SIZE; | 
 | 2047 | 		} | 
 | 2048 | 		else { | 
 | 2049 | 			segment = read_length; | 
 | 2050 | 		} | 
 | 2051 |  | 
 | 2052 | 		Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2053 | 		timeout = internal_select(s, 0); | 
 | 2054 | 		if (!timeout) | 
 | 2055 | 			n = recv(s->sock_fd, read_buf, segment, flags); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2056 | 		Py_END_ALLOW_THREADS | 
 | 2057 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2058 | 		if (timeout) { | 
 | 2059 | 			Py_DECREF(buf); | 
 | 2060 | 			PyErr_SetString(socket_timeout, "timed out"); | 
 | 2061 | 			return NULL; | 
 | 2062 | 		} | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2063 | 		if (n < 0) { | 
 | 2064 | 			Py_DECREF(buf); | 
 | 2065 | 			return s->errorhandler(); | 
 | 2066 | 		} | 
 | 2067 | 		if (n != read_length) { | 
 | 2068 | 			read_buf += n; | 
 | 2069 | 			break; | 
 | 2070 | 		} | 
 | 2071 |  | 
 | 2072 | 		read_length -= segment; | 
 | 2073 | 		read_buf += segment; | 
 | 2074 | 	} | 
 | 2075 | 	if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0) | 
 | 2076 | 	{ | 
 | 2077 | 	    return NULL; | 
 | 2078 | 	} | 
 | 2079 | #endif /* !__VMS */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2080 | 	return buf; | 
 | 2081 | } | 
 | 2082 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2083 | PyDoc_STRVAR(recv_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2084 | "recv(buffersize[, flags]) -> data\n\ | 
 | 2085 | \n\ | 
 | 2086 | Receive up to buffersize bytes from the socket.  For the optional flags\n\ | 
 | 2087 | argument, see the Unix manual.  When no data is available, block until\n\ | 
 | 2088 | 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] | 2089 | 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] | 2090 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2091 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2092 | /* s.recvfrom(nbytes [,flags]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2093 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2094 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2095 | sock_recvfrom(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2096 | { | 
 | 2097 | 	char addrbuf[256]; | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 2098 | 	PyObject *buf = NULL; | 
 | 2099 | 	PyObject *addr = NULL; | 
 | 2100 | 	PyObject *ret = NULL; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2101 | 	int len, n = 0, flags = 0, timeout; | 
| Guido van Rossum | ff3ab42 | 2000-04-24 15:16:03 +0000 | [diff] [blame] | 2102 | 	socklen_t addrlen; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2103 |  | 
| Guido van Rossum | 43713e5 | 2000-02-29 13:59:29 +0000 | [diff] [blame] | 2104 | 	if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags)) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2105 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2106 |  | 
| Guido van Rossum | 18c9a4f | 1993-05-25 12:16:29 +0000 | [diff] [blame] | 2107 | 	if (!getsockaddrlen(s, &addrlen)) | 
 | 2108 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2109 | 	buf = PyString_FromStringAndSize((char *) 0, len); | 
| Guido van Rossum | 18c9a4f | 1993-05-25 12:16:29 +0000 | [diff] [blame] | 2110 | 	if (buf == NULL) | 
 | 2111 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2112 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2113 | 	Py_BEGIN_ALLOW_THREADS | 
| Fred Drake | fd16834 | 2001-05-09 19:11:33 +0000 | [diff] [blame] | 2114 | 	memset(addrbuf, 0, addrlen); | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2115 | 	timeout = internal_select(s, 0); | 
 | 2116 | 	if (!timeout) | 
 | 2117 | 		n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags, | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 2118 | #ifndef MS_WINDOWS | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 2119 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2120 | 			     (struct sockaddr *)addrbuf, &addrlen | 
| Guido van Rossum | 32c575d | 1997-12-02 20:37:32 +0000 | [diff] [blame] | 2121 | #else | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2122 | 			     (void *)addrbuf, &addrlen | 
| Guido van Rossum | 32c575d | 1997-12-02 20:37:32 +0000 | [diff] [blame] | 2123 | #endif | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2124 | #else | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2125 | 			     (struct sockaddr *)addrbuf, &addrlen | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2126 | #endif | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2127 | 			); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2128 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2129 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2130 | 	if (timeout) { | 
 | 2131 | 		Py_DECREF(buf); | 
 | 2132 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 2133 | 		return NULL; | 
 | 2134 | 	} | 
| Guido van Rossum | 7c53b77 | 1995-09-13 18:39:47 +0000 | [diff] [blame] | 2135 | 	if (n < 0) { | 
 | 2136 | 		Py_DECREF(buf); | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2137 | 		return s->errorhandler(); | 
| Guido van Rossum | 7c53b77 | 1995-09-13 18:39:47 +0000 | [diff] [blame] | 2138 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2139 |  | 
| Guido van Rossum | 53a9bf8 | 1996-06-11 18:35:24 +0000 | [diff] [blame] | 2140 | 	if (n != len && _PyString_Resize(&buf, n) < 0) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2141 | 		return NULL; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2142 |  | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2143 | 	if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 2144 | 				  addrlen, s->sock_proto))) | 
| Barry Warsaw | 752300b | 1997-01-03 17:18:10 +0000 | [diff] [blame] | 2145 | 		goto finally; | 
 | 2146 |  | 
| Raymond Hettinger | 8ae4689 | 2003-10-12 19:09:37 +0000 | [diff] [blame] | 2147 | 	ret = PyTuple_Pack(2, buf, addr); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2148 |  | 
 | 2149 | finally: | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2150 | 	Py_XDECREF(addr); | 
 | 2151 | 	Py_XDECREF(buf); | 
| Guido van Rossum | 6f5afc9 | 1993-02-05 09:46:15 +0000 | [diff] [blame] | 2152 | 	return ret; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2153 | } | 
 | 2154 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2155 | PyDoc_STRVAR(recvfrom_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2156 | "recvfrom(buffersize[, flags]) -> (data, address info)\n\ | 
 | 2157 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2158 | 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] | 2159 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2160 | /* s.send(data [,flags]) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2161 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2162 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2163 | sock_send(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2164 | { | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2165 | 	char *buf; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2166 | 	int len, n = 0, flags = 0, timeout; | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2167 | #ifdef __VMS | 
 | 2168 | 	int send_length; | 
 | 2169 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2170 |  | 
| Guido van Rossum | 43713e5 | 2000-02-29 13:59:29 +0000 | [diff] [blame] | 2171 | 	if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags)) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2172 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2173 |  | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2174 | #ifndef __VMS | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2175 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2176 | 	timeout = internal_select(s, 1); | 
 | 2177 | 	if (!timeout) | 
 | 2178 | 		n = send(s->sock_fd, buf, len, flags); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2179 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2180 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2181 | 	if (timeout) { | 
 | 2182 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 2183 | 		return NULL; | 
 | 2184 | 	} | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2185 | 	if (n < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2186 | 		return s->errorhandler(); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2187 | #else | 
 | 2188 | 	/* Divide packet into smaller segments for	*/ | 
 | 2189 | 	/*  TCP/IP Services for OpenVMS			*/ | 
 | 2190 | 	send_length = len; | 
 | 2191 | 	while (send_length != 0) { | 
 | 2192 | 		unsigned int segment; | 
 | 2193 |  | 
 | 2194 | 		segment = send_length / SEGMENT_SIZE; | 
 | 2195 | 		if (segment != 0) { | 
 | 2196 | 			segment = SEGMENT_SIZE; | 
 | 2197 | 		} | 
 | 2198 | 		else { | 
 | 2199 | 			segment = send_length; | 
 | 2200 | 		} | 
 | 2201 | 		Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2202 | 		timeout = internal_select(s, 1); | 
 | 2203 | 		if (!timeout) | 
 | 2204 | 			n = send(s->sock_fd, buf, segment, flags); | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2205 | 		Py_END_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2206 | 		if (timeout) { | 
 | 2207 | 			PyErr_SetString(socket_timeout, "timed out"); | 
 | 2208 | 			return NULL; | 
 | 2209 | 		} | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 2210 | 		if (n < 0) { | 
 | 2211 | 			return s->errorhandler(); | 
 | 2212 | 		} | 
 | 2213 | 		send_length -= segment; | 
 | 2214 | 		buf += segment; | 
 | 2215 | 	} /* end while */ | 
 | 2216 | #endif /* !__VMS */ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2217 | 	return PyInt_FromLong((long)n); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2218 | } | 
 | 2219 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2220 | PyDoc_STRVAR(send_doc, | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2221 | "send(data[, flags]) -> count\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2222 | \n\ | 
 | 2223 | 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] | 2224 | 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] | 2225 | 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] | 2226 |  | 
 | 2227 |  | 
 | 2228 | /* s.sendall(data [,flags]) method */ | 
 | 2229 |  | 
 | 2230 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2231 | sock_sendall(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2232 | { | 
 | 2233 | 	char *buf; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2234 | 	int len, n = 0, flags = 0, timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2235 |  | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2236 | 	if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags)) | 
 | 2237 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2238 |  | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2239 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2240 | 	do { | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2241 | 		timeout = internal_select(s, 1); | 
 | 2242 | 		if (timeout) | 
 | 2243 | 			break; | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2244 | 		n = send(s->sock_fd, buf, len, flags); | 
 | 2245 | 		if (n < 0) | 
 | 2246 | 			break; | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2247 | 		buf += n; | 
 | 2248 | 		len -= n; | 
 | 2249 | 	} while (len > 0); | 
 | 2250 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2251 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2252 | 	if (timeout) { | 
 | 2253 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 2254 | 		return NULL; | 
 | 2255 | 	} | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2256 | 	if (n < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2257 | 		return s->errorhandler(); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2258 |  | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2259 | 	Py_INCREF(Py_None); | 
 | 2260 | 	return Py_None; | 
 | 2261 | } | 
 | 2262 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2263 | PyDoc_STRVAR(sendall_doc, | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2264 | "sendall(data[, flags])\n\ | 
 | 2265 | \n\ | 
 | 2266 | Send a data string to the socket.  For the optional flags\n\ | 
 | 2267 | argument, see the Unix manual.  This calls send() repeatedly\n\ | 
 | 2268 | 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] | 2269 | to tell how much data has been sent."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2270 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2271 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2272 | /* s.sendto(data, [flags,] sockaddr) method */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2273 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2274 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2275 | sock_sendto(PySocketSockObject *s, PyObject *args) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2276 | { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2277 | 	PyObject *addro; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2278 | 	char *buf; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2279 | 	struct sockaddr *addr; | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2280 | 	int addrlen, len, n = 0, flags, timeout; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2281 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2282 | 	flags = 0; | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2283 | 	if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2284 | 		PyErr_Clear(); | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2285 | 		if (!PyArg_ParseTuple(args, "s#iO:sendto", | 
 | 2286 | 				      &buf, &len, &flags, &addro)) | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2287 | 			return NULL; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2288 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2289 |  | 
| Guido van Rossum | eb6b33a | 1993-05-25 09:38:27 +0000 | [diff] [blame] | 2290 | 	if (!getsockaddrarg(s, addro, &addr, &addrlen)) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2291 | 		return NULL; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2292 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2293 | 	Py_BEGIN_ALLOW_THREADS | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2294 | 	timeout = internal_select(s, 1); | 
 | 2295 | 	if (!timeout) | 
 | 2296 | 		n = sendto(s->sock_fd, buf, len, flags, addr, addrlen); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2297 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2298 |  | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 2299 | 	if (timeout) { | 
 | 2300 | 		PyErr_SetString(socket_timeout, "timed out"); | 
 | 2301 | 		return NULL; | 
 | 2302 | 	} | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2303 | 	if (n < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2304 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2305 | 	return PyInt_FromLong((long)n); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2306 | } | 
 | 2307 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2308 | PyDoc_STRVAR(sendto_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 2309 | "sendto(data[, flags], address) -> count\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2310 | \n\ | 
 | 2311 | 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] | 2312 | For IP sockets, the address is a pair (hostaddr, port)."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2313 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2314 |  | 
 | 2315 | /* s.shutdown(how) method */ | 
 | 2316 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2317 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2318 | sock_shutdown(PySocketSockObject *s, PyObject *arg) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2319 | { | 
 | 2320 | 	int how; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2321 | 	int res; | 
| Jeremy Hylton | ae0013d | 2001-10-11 16:36:35 +0000 | [diff] [blame] | 2322 |  | 
 | 2323 | 	how = PyInt_AsLong(arg); | 
 | 2324 | 	if (how == -1 && PyErr_Occurred()) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2325 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2326 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2327 | 	res = shutdown(s->sock_fd, how); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2328 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2329 | 	if (res < 0) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 2330 | 		return s->errorhandler(); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2331 | 	Py_INCREF(Py_None); | 
 | 2332 | 	return Py_None; | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2333 | } | 
 | 2334 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2335 | PyDoc_STRVAR(shutdown_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2336 | "shutdown(flag)\n\ | 
 | 2337 | \n\ | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 2338 | Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\ | 
 | 2339 | 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] | 2340 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2341 |  | 
 | 2342 | /* List of methods for socket objects */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2343 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2344 | static PyMethodDef sock_methods[] = { | 
 | 2345 | 	{"accept",	(PyCFunction)sock_accept, METH_NOARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2346 | 			accept_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2347 | 	{"bind",	(PyCFunction)sock_bind, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2348 | 			bind_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2349 | 	{"close",	(PyCFunction)sock_close, METH_NOARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2350 | 			close_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2351 | 	{"connect",	(PyCFunction)sock_connect, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2352 | 			connect_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2353 | 	{"connect_ex",	(PyCFunction)sock_connect_ex, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2354 | 			connect_ex_doc}, | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2355 | #ifndef NO_DUP | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2356 | 	{"dup",		(PyCFunction)sock_dup, METH_NOARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2357 | 			dup_doc}, | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 2358 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2359 | 	{"fileno",	(PyCFunction)sock_fileno, METH_NOARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2360 | 			fileno_doc}, | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 2361 | #ifdef HAVE_GETPEERNAME | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2362 | 	{"getpeername",	(PyCFunction)sock_getpeername, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2363 | 			METH_NOARGS, getpeername_doc}, | 
| Guido van Rossum | 9575a44 | 1993-04-07 14:06:14 +0000 | [diff] [blame] | 2364 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2365 | 	{"getsockname",	(PyCFunction)sock_getsockname, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2366 | 			METH_NOARGS, getsockname_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2367 | 	{"getsockopt",	(PyCFunction)sock_getsockopt, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2368 | 			getsockopt_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2369 | 	{"listen",	(PyCFunction)sock_listen, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2370 | 			listen_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2371 | #ifndef NO_DUP | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2372 | 	{"makefile",	(PyCFunction)sock_makefile, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2373 | 			makefile_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2374 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2375 | 	{"recv",	(PyCFunction)sock_recv, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2376 | 			recv_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2377 | 	{"recvfrom",	(PyCFunction)sock_recvfrom, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2378 | 			recvfrom_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2379 | 	{"send",	(PyCFunction)sock_send, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2380 | 			send_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2381 | 	{"sendall",	(PyCFunction)sock_sendall, METH_VARARGS, | 
| Guido van Rossum | 9f7a539 | 2001-10-26 03:25:00 +0000 | [diff] [blame] | 2382 | 			sendall_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2383 | 	{"sendto",	(PyCFunction)sock_sendto, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2384 | 			sendto_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2385 | 	{"setblocking",	(PyCFunction)sock_setblocking, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2386 | 			setblocking_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2387 | 	{"settimeout", (PyCFunction)sock_settimeout, METH_O, | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2388 | 			settimeout_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2389 | 	{"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS, | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2390 | 			gettimeout_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2391 | 	{"setsockopt",	(PyCFunction)sock_setsockopt, METH_VARARGS, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2392 | 			setsockopt_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2393 | 	{"shutdown",	(PyCFunction)sock_shutdown, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2394 | 			shutdown_doc}, | 
 | 2395 | #ifdef RISCOS | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 2396 | 	{"sleeptaskw",	(PyCFunction)sock_sleeptaskw, METH_O, | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2397 | 	 		sleeptaskw_doc}, | 
 | 2398 | #endif | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 2399 | 	{NULL,			NULL}		/* sentinel */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2400 | }; | 
 | 2401 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2402 |  | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2403 | /* Deallocate a socket object in response to the last Py_DECREF(). | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2404 |    First close the file description. */ | 
 | 2405 |  | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2406 | static void | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2407 | sock_dealloc(PySocketSockObject *s) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2408 | { | 
| Guido van Rossum | fa972c9 | 2000-04-10 12:45:45 +0000 | [diff] [blame] | 2409 | 	if (s->sock_fd != -1) | 
| Guido van Rossum | 2dd8ddd | 2000-04-21 20:33:00 +0000 | [diff] [blame] | 2410 | 		(void) SOCKETCLOSE(s->sock_fd); | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2411 | 	s->ob_type->tp_free((PyObject *)s); | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2412 | } | 
 | 2413 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2414 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2415 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2416 | sock_repr(PySocketSockObject *s) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2417 | { | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2418 | 	char buf[512]; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2419 | #if SIZEOF_SOCKET_T > SIZEOF_LONG | 
 | 2420 | 	if (s->sock_fd > LONG_MAX) { | 
 | 2421 | 		/* this can occur on Win64, and actually there is a special | 
 | 2422 | 		   ugly printf formatter for decimal pointer length integer | 
 | 2423 | 		   printing, only bother if necessary*/ | 
 | 2424 | 		PyErr_SetString(PyExc_OverflowError, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2425 | 				"no printf formatter to display " | 
 | 2426 | 				"the socket descriptor in decimal"); | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 2427 | 		return NULL; | 
 | 2428 | 	} | 
 | 2429 | #endif | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2430 | 	PyOS_snprintf( | 
 | 2431 | 		buf, sizeof(buf), | 
 | 2432 | 		"<socket object, fd=%ld, family=%d, type=%d, protocol=%d>", | 
 | 2433 | 		(long)s->sock_fd, s->sock_family, | 
 | 2434 | 		s->sock_type, | 
 | 2435 | 		s->sock_proto); | 
| Guido van Rossum | dc1c64a | 1996-02-27 15:21:19 +0000 | [diff] [blame] | 2436 | 	return PyString_FromString(buf); | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2437 | } | 
 | 2438 |  | 
 | 2439 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2440 | /* Create a new, uninitialized socket object. */ | 
 | 2441 |  | 
 | 2442 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2443 | sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2444 | { | 
 | 2445 | 	PyObject *new; | 
 | 2446 |  | 
 | 2447 | 	new = type->tp_alloc(type, 0); | 
| Guido van Rossum | e1c478f | 2002-06-06 20:08:25 +0000 | [diff] [blame] | 2448 | 	if (new != NULL) { | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2449 | 		((PySocketSockObject *)new)->sock_fd = -1; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2450 | 		((PySocketSockObject *)new)->sock_timeout = -1.0; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2451 | 		((PySocketSockObject *)new)->errorhandler = &set_error; | 
| Guido van Rossum | e1c478f | 2002-06-06 20:08:25 +0000 | [diff] [blame] | 2452 | 	} | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2453 | 	return new; | 
 | 2454 | } | 
 | 2455 |  | 
 | 2456 |  | 
 | 2457 | /* Initialize a new socket object. */ | 
 | 2458 |  | 
 | 2459 | /*ARGSUSED*/ | 
 | 2460 | static int | 
| Andrew MacIntyre | 7aec4a2 | 2002-06-13 11:53:52 +0000 | [diff] [blame] | 2461 | sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2462 | { | 
 | 2463 | 	PySocketSockObject *s = (PySocketSockObject *)self; | 
 | 2464 | 	SOCKET_T fd; | 
 | 2465 | 	int family = AF_INET, type = SOCK_STREAM, proto = 0; | 
 | 2466 | 	static char *keywords[] = {"family", "type", "proto", 0}; | 
 | 2467 |  | 
 | 2468 | 	if (!PyArg_ParseTupleAndKeywords(args, kwds, | 
 | 2469 | 					 "|iii:socket", keywords, | 
 | 2470 | 					 &family, &type, &proto)) | 
 | 2471 | 		return -1; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2472 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2473 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2474 | 	fd = socket(family, type, proto); | 
 | 2475 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2476 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2477 | #ifdef MS_WINDOWS | 
 | 2478 | 	if (fd == INVALID_SOCKET) | 
 | 2479 | #else | 
 | 2480 | 	if (fd < 0) | 
 | 2481 | #endif | 
 | 2482 | 	{ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2483 | 		set_error(); | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2484 | 		return -1; | 
 | 2485 | 	} | 
 | 2486 | 	init_sockobject(s, fd, family, type, proto); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2487 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2488 | 	return 0; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2489 |  | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2490 | } | 
 | 2491 |  | 
 | 2492 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 2493 | /* Type object for socket objects. */ | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2494 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2495 | static PyTypeObject sock_type = { | 
| Guido van Rossum | 5555854 | 1996-05-23 22:54:50 +0000 | [diff] [blame] | 2496 | 	PyObject_HEAD_INIT(0)	/* Must fill in type value later */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2497 | 	0,					/* ob_size */ | 
| Guido van Rossum | ca6dfa5 | 2001-10-28 12:31:33 +0000 | [diff] [blame] | 2498 | 	"_socket.socket",			/* tp_name */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2499 | 	sizeof(PySocketSockObject),		/* tp_basicsize */ | 
 | 2500 | 	0,					/* tp_itemsize */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2501 | 	(destructor)sock_dealloc,		/* tp_dealloc */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2502 | 	0,					/* tp_print */ | 
 | 2503 | 	0,					/* tp_getattr */ | 
 | 2504 | 	0,					/* tp_setattr */ | 
 | 2505 | 	0,					/* tp_compare */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2506 | 	(reprfunc)sock_repr,			/* tp_repr */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2507 | 	0,					/* tp_as_number */ | 
 | 2508 | 	0,					/* tp_as_sequence */ | 
 | 2509 | 	0,					/* tp_as_mapping */ | 
 | 2510 | 	0,					/* tp_hash */ | 
 | 2511 | 	0,					/* tp_call */ | 
 | 2512 | 	0,					/* tp_str */ | 
| Jason Tishler | fb8595d | 2003-01-06 12:41:26 +0000 | [diff] [blame] | 2513 | 	PyObject_GenericGetAttr,		/* tp_getattro */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2514 | 	0,					/* tp_setattro */ | 
 | 2515 | 	0,					/* tp_as_buffer */ | 
 | 2516 | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2517 | 	sock_doc,				/* tp_doc */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2518 | 	0,					/* tp_traverse */ | 
 | 2519 | 	0,					/* tp_clear */ | 
 | 2520 | 	0,					/* tp_richcompare */ | 
 | 2521 | 	0,					/* tp_weaklistoffset */ | 
 | 2522 | 	0,					/* tp_iter */ | 
 | 2523 | 	0,					/* tp_iternext */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2524 | 	sock_methods,				/* tp_methods */ | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 2525 | 	0,					/* tp_members */ | 
 | 2526 | 	0,					/* tp_getset */ | 
 | 2527 | 	0,					/* tp_base */ | 
 | 2528 | 	0,					/* tp_dict */ | 
 | 2529 | 	0,					/* tp_descr_get */ | 
 | 2530 | 	0,					/* tp_descr_set */ | 
 | 2531 | 	0,					/* tp_dictoffset */ | 
| Andrew MacIntyre | 7aec4a2 | 2002-06-13 11:53:52 +0000 | [diff] [blame] | 2532 | 	sock_initobj,				/* tp_init */ | 
| Jason Tishler | fb8595d | 2003-01-06 12:41:26 +0000 | [diff] [blame] | 2533 | 	PyType_GenericAlloc,			/* tp_alloc */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2534 | 	sock_new,				/* tp_new */ | 
| Jason Tishler | fb8595d | 2003-01-06 12:41:26 +0000 | [diff] [blame] | 2535 | 	PyObject_Del,				/* tp_free */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 2536 | }; | 
 | 2537 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2538 |  | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 2539 | /* Python interface to gethostname(). */ | 
 | 2540 |  | 
 | 2541 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2542 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2543 | socket_gethostname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 2544 | { | 
 | 2545 | 	char buf[1024]; | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2546 | 	int res; | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2547 | 	if (!PyArg_ParseTuple(args, ":gethostname")) | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 2548 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2549 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2550 | 	res = gethostname(buf, (int) sizeof buf - 1); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2551 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2552 | 	if (res < 0) | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2553 | 		return set_error(); | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 2554 | 	buf[sizeof buf - 1] = '\0'; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2555 | 	return PyString_FromString(buf); | 
| Guido van Rossum | 8119447 | 1991-07-27 21:42:02 +0000 | [diff] [blame] | 2556 | } | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2557 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2558 | PyDoc_STRVAR(gethostname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2559 | "gethostname() -> string\n\ | 
 | 2560 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2561 | Return the current host name."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2562 |  | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2563 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2564 | /* Python interface to gethostbyname(name). */ | 
 | 2565 |  | 
 | 2566 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2567 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2568 | socket_gethostbyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2569 | { | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 2570 | 	char *name; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 2571 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2572 | 	struct sockaddr_storage addrbuf; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 2573 | #else | 
 | 2574 |         struct sockaddr_in addrbuf; | 
 | 2575 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2576 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2577 | 	if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2578 | 		return NULL; | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 2579 | 	if (setipaddr(name, (struct sockaddr *)&addrbuf,  sizeof(addrbuf), AF_INET) < 0) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2580 | 		return NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2581 | 	return makeipaddr((struct sockaddr *)&addrbuf, | 
 | 2582 | 		sizeof(struct sockaddr_in)); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2583 | } | 
 | 2584 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2585 | PyDoc_STRVAR(gethostbyname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2586 | "gethostbyname(host) -> address\n\ | 
 | 2587 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2588 | 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] | 2589 |  | 
 | 2590 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2591 | /* Convenience function common to gethostbyname_ex and gethostbyaddr */ | 
 | 2592 |  | 
 | 2593 | static PyObject * | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2594 | 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] | 2595 | { | 
 | 2596 | 	char **pch; | 
 | 2597 | 	PyObject *rtn_tuple = (PyObject *)NULL; | 
 | 2598 | 	PyObject *name_list = (PyObject *)NULL; | 
 | 2599 | 	PyObject *addr_list = (PyObject *)NULL; | 
 | 2600 | 	PyObject *tmp; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2601 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2602 | 	if (h == NULL) { | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2603 | 		/* Let's get real error message to return */ | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 2604 | #ifndef RISCOS | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2605 | 		set_herror(h_errno); | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 2606 | #else | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2607 | 		PyErr_SetString(socket_error, "host not found"); | 
| Guido van Rossum | e2ae77b | 2001-10-24 20:42:55 +0000 | [diff] [blame] | 2608 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2609 | 		return NULL; | 
 | 2610 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2611 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2612 | 	if (h->h_addrtype != af) { | 
 | 2613 | #ifdef HAVE_STRERROR | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2614 | 		/* Let's get real error message to return */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2615 | 		PyErr_SetString(socket_error, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2616 | 				(char *)strerror(EAFNOSUPPORT)); | 
 | 2617 | #else | 
 | 2618 | 		PyErr_SetString( | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2619 | 			socket_error, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2620 | 			"Address family not supported by protocol family"); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2621 | #endif | 
 | 2622 | 		return NULL; | 
 | 2623 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2624 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2625 | 	switch (af) { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2626 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2627 | 	case AF_INET: | 
 | 2628 | 		if (alen < sizeof(struct sockaddr_in)) | 
 | 2629 | 			return NULL; | 
 | 2630 | 		break; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2631 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 2632 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2633 | 	case AF_INET6: | 
 | 2634 | 		if (alen < sizeof(struct sockaddr_in6)) | 
 | 2635 | 			return NULL; | 
 | 2636 | 		break; | 
 | 2637 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2638 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2639 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2640 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2641 | 	if ((name_list = PyList_New(0)) == NULL) | 
 | 2642 | 		goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2643 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2644 | 	if ((addr_list = PyList_New(0)) == NULL) | 
 | 2645 | 		goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2646 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2647 | 	for (pch = h->h_aliases; *pch != NULL; pch++) { | 
 | 2648 | 		int status; | 
 | 2649 | 		tmp = PyString_FromString(*pch); | 
 | 2650 | 		if (tmp == NULL) | 
 | 2651 | 			goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2652 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2653 | 		status = PyList_Append(name_list, tmp); | 
 | 2654 | 		Py_DECREF(tmp); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2655 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2656 | 		if (status) | 
 | 2657 | 			goto err; | 
 | 2658 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2659 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2660 | 	for (pch = h->h_addr_list; *pch != NULL; pch++) { | 
 | 2661 | 		int status; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2662 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2663 | 		switch (af) { | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2664 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2665 | 		case AF_INET: | 
 | 2666 | 		    { | 
 | 2667 | 			struct sockaddr_in sin; | 
 | 2668 | 			memset(&sin, 0, sizeof(sin)); | 
 | 2669 | 			sin.sin_family = af; | 
 | 2670 | #ifdef HAVE_SOCKADDR_SA_LEN | 
 | 2671 | 			sin.sin_len = sizeof(sin); | 
 | 2672 | #endif | 
 | 2673 | 			memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr)); | 
 | 2674 | 			tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2675 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2676 | 			if (pch == h->h_addr_list && alen >= sizeof(sin)) | 
 | 2677 | 				memcpy((char *) addr, &sin, sizeof(sin)); | 
 | 2678 | 			break; | 
 | 2679 | 		    } | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2680 |  | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 2681 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2682 | 		case AF_INET6: | 
 | 2683 | 		    { | 
 | 2684 | 			struct sockaddr_in6 sin6; | 
 | 2685 | 			memset(&sin6, 0, sizeof(sin6)); | 
 | 2686 | 			sin6.sin6_family = af; | 
 | 2687 | #ifdef HAVE_SOCKADDR_SA_LEN | 
 | 2688 | 			sin6.sin6_len = sizeof(sin6); | 
 | 2689 | #endif | 
 | 2690 | 			memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr)); | 
 | 2691 | 			tmp = makeipaddr((struct sockaddr *)&sin6, | 
 | 2692 | 				sizeof(sin6)); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2693 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2694 | 			if (pch == h->h_addr_list && alen >= sizeof(sin6)) | 
 | 2695 | 				memcpy((char *) addr, &sin6, sizeof(sin6)); | 
 | 2696 | 			break; | 
 | 2697 | 		    } | 
 | 2698 | #endif | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2699 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2700 | 		default:	/* can't happen */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2701 | 			PyErr_SetString(socket_error, | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2702 | 					"unsupported address family"); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2703 | 			return NULL; | 
 | 2704 | 		} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2705 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2706 | 		if (tmp == NULL) | 
 | 2707 | 			goto err; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2708 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2709 | 		status = PyList_Append(addr_list, tmp); | 
 | 2710 | 		Py_DECREF(tmp); | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2711 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2712 | 		if (status) | 
 | 2713 | 			goto err; | 
 | 2714 | 	} | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2715 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2716 | 	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] | 2717 |  | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2718 |  err: | 
 | 2719 | 	Py_XDECREF(name_list); | 
 | 2720 | 	Py_XDECREF(addr_list); | 
 | 2721 | 	return rtn_tuple; | 
 | 2722 | } | 
 | 2723 |  | 
 | 2724 |  | 
 | 2725 | /* Python interface to gethostbyname_ex(name). */ | 
 | 2726 |  | 
 | 2727 | /*ARGSUSED*/ | 
 | 2728 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2729 | socket_gethostbyname_ex(PyObject *self, PyObject *args) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2730 | { | 
 | 2731 | 	char *name; | 
 | 2732 | 	struct hostent *h; | 
| Martin v. Löwis | c16f3bd | 2003-05-03 09:14:54 +0000 | [diff] [blame] | 2733 | #ifdef ENABLE_IPV6 | 
 | 2734 |         struct sockaddr_storage addr; | 
 | 2735 | #else | 
 | 2736 |         struct sockaddr_in addr; | 
 | 2737 | #endif | 
| Martin v. Löwis | 9db2f57 | 2001-07-23 01:30:10 +0000 | [diff] [blame] | 2738 | 	struct sockaddr *sa; | 
| Guido van Rossum | 955becc | 1999-03-22 20:14:53 +0000 | [diff] [blame] | 2739 | 	PyObject *ret; | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2740 | #ifdef HAVE_GETHOSTBYNAME_R | 
 | 2741 | 	struct hostent hp_allocated; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2742 | #ifdef HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 2743 | 	struct hostent_data data; | 
 | 2744 | #else | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2745 | 	char buf[16384]; | 
 | 2746 | 	int buf_len = (sizeof buf) - 1; | 
 | 2747 | 	int errnop; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2748 | #endif | 
 | 2749 | #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 2750 | 	int result; | 
 | 2751 | #endif | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2752 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2753 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2754 | 	if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name)) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2755 | 		return NULL; | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 2756 | 	if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2757 | 		return NULL; | 
 | 2758 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2759 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2760 | #if   defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2761 | 	result = gethostbyname_r(name, &hp_allocated, buf, buf_len, | 
 | 2762 | 				 &h, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2763 | #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2764 | 	h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2765 | #else /* HAVE_GETHOSTBYNAME_R_3_ARG */ | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 2766 | 	memset((void *) &data, '\0', sizeof(data)); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2767 | 	result = gethostbyname_r(name, &hp_allocated, &data); | 
 | 2768 | 	h = (result != 0) ? NULL : &hp_allocated; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 2769 | #endif | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2770 | #else /* not HAVE_GETHOSTBYNAME_R */ | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2771 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 2772 | 	PyThread_acquire_lock(netdb_lock, 1); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2773 | #endif | 
 | 2774 | 	h = gethostbyname(name); | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2775 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
 | 2776 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2777 | 	/* Some C libraries would require addr.__ss_family instead of | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2778 | 	   addr.ss_family. | 
 | 2779 | 	   Therefore, we cast the sockaddr_storage into sockaddr to | 
 | 2780 | 	   access sa_family. */ | 
| Martin v. Löwis | 9db2f57 | 2001-07-23 01:30:10 +0000 | [diff] [blame] | 2781 | 	sa = (struct sockaddr*)&addr; | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 2782 | 	ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2783 | 			     sa->sa_family); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2784 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 2785 | 	PyThread_release_lock(netdb_lock); | 
| Guido van Rossum | 955becc | 1999-03-22 20:14:53 +0000 | [diff] [blame] | 2786 | #endif | 
 | 2787 | 	return ret; | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2788 | } | 
 | 2789 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2790 | PyDoc_STRVAR(ghbn_ex_doc, | 
| Guido van Rossum | 7d896ab | 1998-08-04 22:16:43 +0000 | [diff] [blame] | 2791 | "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\ | 
 | 2792 | \n\ | 
 | 2793 | 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] | 2794 | 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] | 2795 |  | 
 | 2796 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2797 | /* Python interface to gethostbyaddr(IP). */ | 
 | 2798 |  | 
 | 2799 | /*ARGSUSED*/ | 
 | 2800 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2801 | socket_gethostbyaddr(PyObject *self, PyObject *args) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2802 | { | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 2803 | #ifdef ENABLE_IPV6 | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 2804 | 	struct sockaddr_storage addr; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2805 | #else | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2806 | 	struct sockaddr_in addr; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2807 | #endif | 
 | 2808 | 	struct sockaddr *sa = (struct sockaddr *)&addr; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2809 | 	char *ip_num; | 
 | 2810 | 	struct hostent *h; | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2811 | 	PyObject *ret; | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2812 | #ifdef HAVE_GETHOSTBYNAME_R | 
 | 2813 | 	struct hostent hp_allocated; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2814 | #ifdef HAVE_GETHOSTBYNAME_R_3_ARG | 
 | 2815 | 	struct hostent_data data; | 
 | 2816 | #else | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2817 | 	char buf[16384]; | 
 | 2818 | 	int buf_len = (sizeof buf) - 1; | 
 | 2819 | 	int errnop; | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2820 | #endif | 
 | 2821 | #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 2822 | 	int result; | 
 | 2823 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2824 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2825 | 	char *ap; | 
 | 2826 | 	int al; | 
 | 2827 | 	int af; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2828 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2829 | 	if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num)) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2830 | 		return NULL; | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 2831 | 	af = AF_UNSPEC; | 
| Martin v. Löwis | ddc6f47 | 2002-07-28 16:10:31 +0000 | [diff] [blame] | 2832 | 	if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2833 | 		return NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2834 | 	af = sa->sa_family; | 
 | 2835 | 	ap = NULL; | 
 | 2836 | 	al = 0; | 
 | 2837 | 	switch (af) { | 
 | 2838 | 	case AF_INET: | 
 | 2839 | 		ap = (char *)&((struct sockaddr_in *)sa)->sin_addr; | 
 | 2840 | 		al = sizeof(((struct sockaddr_in *)sa)->sin_addr); | 
 | 2841 | 		break; | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 2842 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2843 | 	case AF_INET6: | 
 | 2844 | 		ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr; | 
 | 2845 | 		al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr); | 
 | 2846 | 		break; | 
 | 2847 | #endif | 
 | 2848 | 	default: | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2849 | 		PyErr_SetString(socket_error, "unsupported address family"); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2850 | 		return NULL; | 
 | 2851 | 	} | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2852 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2853 | #ifdef HAVE_GETHOSTBYNAME_R | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2854 | #if   defined(HAVE_GETHOSTBYNAME_R_6_ARG) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2855 | 	result = gethostbyaddr_r(ap, al, af, | 
 | 2856 | 		&hp_allocated, buf, buf_len, | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 2857 | 		&h, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2858 | #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2859 | 	h = gethostbyaddr_r(ap, al, af, | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2860 | 			    &hp_allocated, buf, buf_len, &errnop); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2861 | #else /* HAVE_GETHOSTBYNAME_R_3_ARG */ | 
| Guido van Rossum | e7de206 | 1999-03-24 17:24:33 +0000 | [diff] [blame] | 2862 | 	memset((void *) &data, '\0', sizeof(data)); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2863 | 	result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data); | 
| Guido van Rossum | 7b6c71f | 1999-03-24 17:20:40 +0000 | [diff] [blame] | 2864 | 	h = (result != 0) ? NULL : &hp_allocated; | 
| Guido van Rossum | e9cd07b | 1999-03-15 21:40:14 +0000 | [diff] [blame] | 2865 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2866 | #else /* not HAVE_GETHOSTBYNAME_R */ | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2867 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 2868 | 	PyThread_acquire_lock(netdb_lock, 1); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2869 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2870 | 	h = gethostbyaddr(ap, al, af); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 2871 | #endif /* HAVE_GETHOSTBYNAME_R */ | 
 | 2872 | 	Py_END_ALLOW_THREADS | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 2873 | 	ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2874 | #ifdef USE_GETHOSTBYNAME_LOCK | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 2875 | 	PyThread_release_lock(netdb_lock); | 
| Guido van Rossum | 3baaa13 | 1999-03-22 21:44:51 +0000 | [diff] [blame] | 2876 | #endif | 
 | 2877 | 	return ret; | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2878 | } | 
 | 2879 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2880 | PyDoc_STRVAR(gethostbyaddr_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2881 | "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\ | 
 | 2882 | \n\ | 
 | 2883 | 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] | 2884 | 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] | 2885 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2886 |  | 
 | 2887 | /* Python interface to getservbyname(name). | 
 | 2888 |    This only returns the port number, since the other info is already | 
 | 2889 |    known or not useful (like the list of aliases). */ | 
 | 2890 |  | 
 | 2891 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2892 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2893 | socket_getservbyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2894 | { | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 2895 | 	char *name, *proto=NULL; | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2896 | 	struct servent *sp; | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 2897 | 	if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto)) | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2898 | 		return NULL; | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2899 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | ff4949e | 1992-08-05 19:58:53 +0000 | [diff] [blame] | 2900 | 	sp = getservbyname(name, proto); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2901 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2902 | 	if (sp == NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2903 | 		PyErr_SetString(socket_error, "service/proto not found"); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2904 | 		return NULL; | 
 | 2905 | 	} | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 2906 | 	return PyInt_FromLong((long) ntohs(sp->s_port)); | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2907 | } | 
 | 2908 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2909 | PyDoc_STRVAR(getservbyname_doc, | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 2910 | "getservbyname(servicename[, protocolname]) -> integer\n\ | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2911 | \n\ | 
 | 2912 | Return a port number from a service name and protocol name.\n\ | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 2913 | The optional protocol name, if given, should be 'tcp' or 'udp',\n\ | 
 | 2914 | otherwise any protocol will match."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2915 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 2916 |  | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 2917 | /* Python interface to getservbyport(port). | 
 | 2918 |    This only returns the service name, since the other info is already | 
 | 2919 |    known or not useful (like the list of aliases). */ | 
 | 2920 |  | 
 | 2921 | /*ARGSUSED*/ | 
 | 2922 | static PyObject * | 
 | 2923 | socket_getservbyport(PyObject *self, PyObject *args) | 
 | 2924 | { | 
 | 2925 | 	int port; | 
 | 2926 | 	char *proto=NULL; | 
 | 2927 | 	struct servent *sp; | 
 | 2928 | 	if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto)) | 
 | 2929 | 		return NULL; | 
 | 2930 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2931 | 	sp = getservbyport(htons(port), proto); | 
 | 2932 | 	Py_END_ALLOW_THREADS | 
 | 2933 | 	if (sp == NULL) { | 
 | 2934 | 		PyErr_SetString(socket_error, "port/proto not found"); | 
 | 2935 | 		return NULL; | 
 | 2936 | 	} | 
 | 2937 | 	return PyString_FromString(sp->s_name); | 
 | 2938 | } | 
 | 2939 |  | 
 | 2940 | PyDoc_STRVAR(getservbyport_doc, | 
 | 2941 | "getservbyport(port[, protocolname]) -> string\n\ | 
 | 2942 | \n\ | 
 | 2943 | Return the service name from a port number and protocol name.\n\ | 
 | 2944 | The optional protocol name, if given, should be 'tcp' or 'udp',\n\ | 
 | 2945 | otherwise any protocol will match."); | 
 | 2946 |  | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2947 | /* Python interface to getprotobyname(name). | 
 | 2948 |    This only returns the protocol number, since the other info is | 
 | 2949 |    already known or not useful (like the list of aliases). */ | 
 | 2950 |  | 
 | 2951 | /*ARGSUSED*/ | 
 | 2952 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2953 | socket_getprotobyname(PyObject *self, PyObject *args) | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2954 | { | 
 | 2955 | 	char *name; | 
 | 2956 | 	struct protoent *sp; | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 2957 | #ifdef __BEOS__ | 
 | 2958 | /* Not available in BeOS yet. - [cjh] */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2959 | 	PyErr_SetString(socket_error, "getprotobyname not supported"); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 2960 | 	return NULL; | 
 | 2961 | #else | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 2962 | 	if (!PyArg_ParseTuple(args, "s:getprotobyname", &name)) | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2963 | 		return NULL; | 
 | 2964 | 	Py_BEGIN_ALLOW_THREADS | 
 | 2965 | 	sp = getprotobyname(name); | 
 | 2966 | 	Py_END_ALLOW_THREADS | 
 | 2967 | 	if (sp == NULL) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 2968 | 		PyErr_SetString(socket_error, "protocol not found"); | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2969 | 		return NULL; | 
 | 2970 | 	} | 
 | 2971 | 	return PyInt_FromLong((long) sp->p_proto); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 2972 | #endif | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2973 | } | 
 | 2974 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2975 | PyDoc_STRVAR(getprotobyname_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2976 | "getprotobyname(name) -> integer\n\ | 
 | 2977 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 2978 | Return the protocol number for the named protocol.  (Rarely used.)"); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 2979 |  | 
| Guido van Rossum | 3901d85 | 1996-12-19 16:35:04 +0000 | [diff] [blame] | 2980 |  | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 2981 | #ifdef HAVE_SOCKETPAIR | 
 | 2982 | /* Create a pair of sockets using the socketpair() function. | 
| Dave Cole | 07fda7e | 2004-08-23 05:16:23 +0000 | [diff] [blame] | 2983 |    Arguments as for socket() except the default family is AF_UNIX if | 
| Dave Cole | e8bbfe4 | 2004-08-26 00:51:16 +0000 | [diff] [blame] | 2984 |    defined on the platform; otherwise, the default is AF_INET. */ | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 2985 |  | 
 | 2986 | /*ARGSUSED*/ | 
 | 2987 | static PyObject * | 
 | 2988 | socket_socketpair(PyObject *self, PyObject *args) | 
 | 2989 | { | 
 | 2990 | 	PySocketSockObject *s0 = NULL, *s1 = NULL; | 
 | 2991 | 	SOCKET_T sv[2]; | 
 | 2992 | 	int family, type = SOCK_STREAM, proto = 0; | 
 | 2993 | 	PyObject *res = NULL; | 
 | 2994 |  | 
 | 2995 | #if defined(AF_UNIX) | 
 | 2996 | 	family = AF_UNIX; | 
 | 2997 | #else | 
 | 2998 | 	family = AF_INET; | 
 | 2999 | #endif | 
 | 3000 | 	if (!PyArg_ParseTuple(args, "|iii:socketpair", | 
 | 3001 | 			      &family, &type, &proto)) | 
 | 3002 | 		return NULL; | 
 | 3003 | 	/* Create a pair of socket fds */ | 
 | 3004 | 	if (socketpair(family, type, proto, sv) < 0) | 
 | 3005 | 		return set_error(); | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3006 | 	s0 = new_sockobject(sv[0], family, type, proto); | 
 | 3007 | 	if (s0 == NULL) | 
 | 3008 | 		goto finally; | 
 | 3009 | 	s1 = new_sockobject(sv[1], family, type, proto); | 
 | 3010 | 	if (s1 == NULL) | 
 | 3011 | 		goto finally; | 
 | 3012 | 	res = PyTuple_Pack(2, s0, s1); | 
 | 3013 |  | 
 | 3014 | finally: | 
 | 3015 | 	if (res == NULL) { | 
 | 3016 | 		if (s0 == NULL) | 
 | 3017 | 			SOCKETCLOSE(sv[0]); | 
 | 3018 | 		if (s1 == NULL) | 
 | 3019 | 			SOCKETCLOSE(sv[1]); | 
 | 3020 | 	} | 
 | 3021 | 	Py_XDECREF(s0); | 
 | 3022 | 	Py_XDECREF(s1); | 
 | 3023 | 	return res; | 
 | 3024 | } | 
 | 3025 |  | 
 | 3026 | PyDoc_STRVAR(socketpair_doc, | 
 | 3027 | "socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\ | 
 | 3028 | \n\ | 
 | 3029 | Create a pair of socket objects from the sockets returned by the platform\n\ | 
 | 3030 | socketpair() function.\n\ | 
| Dave Cole | 07fda7e | 2004-08-23 05:16:23 +0000 | [diff] [blame] | 3031 | 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] | 3032 | 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] | 3033 |  | 
 | 3034 | #endif /* HAVE_SOCKETPAIR */ | 
 | 3035 |  | 
 | 3036 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3037 | #ifndef NO_DUP | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3038 | /* Create a socket object from a numeric file description. | 
 | 3039 |    Useful e.g. if stdin is a socket. | 
 | 3040 |    Additional arguments as for socket(). */ | 
 | 3041 |  | 
 | 3042 | /*ARGSUSED*/ | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3043 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3044 | socket_fromfd(PyObject *self, PyObject *args) | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3045 | { | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3046 | 	PySocketSockObject *s; | 
| Fred Drake | a04eaad | 2000-06-30 02:46:07 +0000 | [diff] [blame] | 3047 | 	SOCKET_T fd; | 
 | 3048 | 	int family, type, proto = 0; | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 3049 | 	if (!PyArg_ParseTuple(args, "iii|i:fromfd", | 
 | 3050 | 			      &fd, &family, &type, &proto)) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3051 | 		return NULL; | 
| Guido van Rossum | 5f59d60 | 1992-12-14 16:59:51 +0000 | [diff] [blame] | 3052 | 	/* Dup the fd so it and the socket can be closed independently */ | 
 | 3053 | 	fd = dup(fd); | 
 | 3054 | 	if (fd < 0) | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3055 | 		return set_error(); | 
 | 3056 | 	s = new_sockobject(fd, family, type, proto); | 
| Guido van Rossum | 73624e9 | 1994-10-10 17:59:00 +0000 | [diff] [blame] | 3057 | 	return (PyObject *) s; | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3058 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3059 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3060 | PyDoc_STRVAR(fromfd_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3061 | "fromfd(fd, family, type[, proto]) -> socket object\n\ | 
 | 3062 | \n\ | 
 | 3063 | Create a socket object from the given file descriptor.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3064 | The remaining arguments are the same as for socket()."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3065 |  | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3066 | #endif /* NO_DUP */ | 
| Guido van Rossum | 2a7178e | 1992-12-08 13:38:24 +0000 | [diff] [blame] | 3067 |  | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3068 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3069 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3070 | socket_ntohs(PyObject *self, PyObject *args) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3071 | { | 
 | 3072 | 	int x1, x2; | 
 | 3073 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 3074 | 	if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) { | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3075 | 		return NULL; | 
 | 3076 | 	} | 
 | 3077 | 	x2 = (int)ntohs((short)x1); | 
 | 3078 | 	return PyInt_FromLong(x2); | 
 | 3079 | } | 
 | 3080 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3081 | PyDoc_STRVAR(ntohs_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3082 | "ntohs(integer) -> integer\n\ | 
 | 3083 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3084 | Convert a 16-bit integer from network to host byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3085 |  | 
 | 3086 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3087 | static PyObject * | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3088 | socket_ntohl(PyObject *self, PyObject *arg) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3089 | { | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3090 | 	unsigned long x; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3091 |  | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3092 | 	if (PyInt_Check(arg)) { | 
 | 3093 | 		x = PyInt_AS_LONG(arg); | 
| Jeremy Hylton | 825e47b | 2002-07-25 16:37:51 +0000 | [diff] [blame] | 3094 | 		if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3095 | 			return NULL; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3096 | 	} | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3097 | 	else if (PyLong_Check(arg)) { | 
 | 3098 | 		x = PyLong_AsUnsignedLong(arg); | 
| Jeremy Hylton | 825e47b | 2002-07-25 16:37:51 +0000 | [diff] [blame] | 3099 | 		if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3100 | 			return NULL; | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3101 | #if SIZEOF_LONG > 4 | 
 | 3102 | 		{ | 
 | 3103 | 			unsigned long y; | 
 | 3104 | 			/* only want the trailing 32 bits */ | 
 | 3105 | 			y = x & 0xFFFFFFFFUL; | 
 | 3106 | 			if (y ^ x) | 
 | 3107 | 				return PyErr_Format(PyExc_OverflowError, | 
 | 3108 | 					    "long int larger than 32 bits"); | 
 | 3109 | 			x = y; | 
| Tim Peters | 5814187 | 2002-08-06 22:25:02 +0000 | [diff] [blame] | 3110 | 		} | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3111 | #endif | 
 | 3112 | 	} | 
 | 3113 | 	else | 
| Tim Peters | 5814187 | 2002-08-06 22:25:02 +0000 | [diff] [blame] | 3114 | 		return PyErr_Format(PyExc_TypeError, | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3115 | 				    "expected int/long, %s found", | 
 | 3116 | 				    arg->ob_type->tp_name); | 
 | 3117 | 	if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3118 | 		return NULL; | 
 | 3119 | 	return PyInt_FromLong(ntohl(x)); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3120 | } | 
 | 3121 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3122 | PyDoc_STRVAR(ntohl_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3123 | "ntohl(integer) -> integer\n\ | 
 | 3124 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3125 | Convert a 32-bit integer from network to host byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3126 |  | 
 | 3127 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3128 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3129 | socket_htons(PyObject *self, PyObject *args) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3130 | { | 
| Hye-Shik Chang | a7b673f | 2003-12-17 09:40:23 +0000 | [diff] [blame] | 3131 | 	int x1, x2; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3132 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 3133 | 	if (!PyArg_ParseTuple(args, "i:htons", &x1)) { | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3134 | 		return NULL; | 
 | 3135 | 	} | 
 | 3136 | 	x2 = (int)htons((short)x1); | 
 | 3137 | 	return PyInt_FromLong(x2); | 
 | 3138 | } | 
 | 3139 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3140 | PyDoc_STRVAR(htons_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3141 | "htons(integer) -> integer\n\ | 
 | 3142 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3143 | Convert a 16-bit integer from host to network byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3144 |  | 
 | 3145 |  | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3146 | static PyObject * | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3147 | socket_htonl(PyObject *self, PyObject *arg) | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3148 | { | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3149 | 	unsigned long x; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3150 |  | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3151 | 	if (PyInt_Check(arg)) { | 
 | 3152 | 		x = PyInt_AS_LONG(arg); | 
| Jeremy Hylton | 825e47b | 2002-07-25 16:37:51 +0000 | [diff] [blame] | 3153 | 		if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3154 | 			return NULL; | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3155 | 	} | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3156 | 	else if (PyLong_Check(arg)) { | 
 | 3157 | 		x = PyLong_AsUnsignedLong(arg); | 
| Jeremy Hylton | 825e47b | 2002-07-25 16:37:51 +0000 | [diff] [blame] | 3158 | 		if (x == (unsigned long) -1 && PyErr_Occurred()) | 
 | 3159 | 			return NULL; | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3160 | #if SIZEOF_LONG > 4 | 
 | 3161 | 		{ | 
 | 3162 | 			unsigned long y; | 
 | 3163 | 			/* only want the trailing 32 bits */ | 
 | 3164 | 			y = x & 0xFFFFFFFFUL; | 
 | 3165 | 			if (y ^ x) | 
 | 3166 | 				return PyErr_Format(PyExc_OverflowError, | 
 | 3167 | 					    "long int larger than 32 bits"); | 
 | 3168 | 			x = y; | 
| Tim Peters | 5814187 | 2002-08-06 22:25:02 +0000 | [diff] [blame] | 3169 | 		} | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3170 | #endif | 
 | 3171 | 	} | 
 | 3172 | 	else | 
| Tim Peters | 5814187 | 2002-08-06 22:25:02 +0000 | [diff] [blame] | 3173 | 		return PyErr_Format(PyExc_TypeError, | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3174 | 				    "expected int/long, %s found", | 
 | 3175 | 				    arg->ob_type->tp_name); | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3176 | 	return PyInt_FromLong(htonl(x)); | 
| Guido van Rossum | 006bf91 | 1996-06-12 04:04:55 +0000 | [diff] [blame] | 3177 | } | 
 | 3178 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3179 | PyDoc_STRVAR(htonl_doc, | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3180 | "htonl(integer) -> integer\n\ | 
 | 3181 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3182 | Convert a 32-bit integer from host to network byte order."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3183 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3184 | /* socket.inet_aton() and socket.inet_ntoa() functions. */ | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3185 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3186 | PyDoc_STRVAR(inet_aton_doc, | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3187 | "inet_aton(string) -> packed 32-bit IP representation\n\ | 
 | 3188 | \n\ | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3189 | 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] | 3190 | binary format used in low-level network functions."); | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3191 |  | 
 | 3192 | static PyObject* | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3193 | socket_inet_aton(PyObject *self, PyObject *args) | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3194 | { | 
| Guido van Rossum | a2e4855 | 1999-09-09 15:42:59 +0000 | [diff] [blame] | 3195 | #ifndef INADDR_NONE | 
 | 3196 | #define INADDR_NONE (-1) | 
 | 3197 | #endif | 
| Neal Norwitz | 88f115b | 2003-02-13 02:15:42 +0000 | [diff] [blame] | 3198 | #ifdef HAVE_INET_ATON | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3199 | 	struct in_addr buf; | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3200 | #else | 
 | 3201 | 	/* Have to use inet_addr() instead */ | 
 | 3202 | 	unsigned long packed_addr; | 
 | 3203 | #endif | 
 | 3204 | 	char *ip_addr; | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3205 |  | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3206 | 	if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3207 | 		return NULL; | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3208 |  | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3209 |  | 
 | 3210 | #ifdef HAVE_INET_ATON | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3211 | 	if (inet_aton(ip_addr, &buf)) | 
 | 3212 | 		return PyString_FromStringAndSize((char *)(&buf), | 
 | 3213 | 						  sizeof(buf)); | 
 | 3214 |  | 
 | 3215 | 	PyErr_SetString(socket_error, | 
 | 3216 | 			"illegal IP address string passed to inet_aton"); | 
 | 3217 | 	return NULL; | 
 | 3218 |  | 
| Tim Peters | 1df9fdd | 2003-02-13 03:13:40 +0000 | [diff] [blame] | 3219 | #else /* ! HAVE_INET_ATON */ | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3220 | 	/* XXX Problem here: inet_aton('255.255.255.255') raises | 
 | 3221 | 	   an exception while it should be a valid address. */ | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3222 | 	packed_addr = inet_addr(ip_addr); | 
 | 3223 |  | 
 | 3224 | 	if (packed_addr == INADDR_NONE) {	/* invalid address */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3225 | 		PyErr_SetString(socket_error, | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3226 | 			"illegal IP address string passed to inet_aton"); | 
 | 3227 | 		return NULL; | 
 | 3228 | 	} | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3229 | 	return PyString_FromStringAndSize((char *) &packed_addr, | 
 | 3230 | 					  sizeof(packed_addr)); | 
| Guido van Rossum | ad05cdf | 2003-02-12 23:08:22 +0000 | [diff] [blame] | 3231 | #endif | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3232 | } | 
 | 3233 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3234 | PyDoc_STRVAR(inet_ntoa_doc, | 
| Fred Drake | e066134 | 2000-03-07 14:05:16 +0000 | [diff] [blame] | 3235 | "inet_ntoa(packed_ip) -> ip_address_string\n\ | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3236 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3237 | 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] | 3238 |  | 
 | 3239 | static PyObject* | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3240 | socket_inet_ntoa(PyObject *self, PyObject *args) | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3241 | { | 
 | 3242 | 	char *packed_str; | 
| Guido van Rossum | c6a164b | 1999-08-20 19:11:27 +0000 | [diff] [blame] | 3243 | 	int addr_len; | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3244 | 	struct in_addr packed_addr; | 
 | 3245 |  | 
| Guido van Rossum | 27fc3c0 | 2000-03-24 20:56:56 +0000 | [diff] [blame] | 3246 | 	if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) { | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3247 | 		return NULL; | 
 | 3248 | 	} | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 3249 |  | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3250 | 	if (addr_len != sizeof(packed_addr)) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3251 | 		PyErr_SetString(socket_error, | 
| Guido van Rossum | 5c9eb21 | 1999-08-20 18:21:51 +0000 | [diff] [blame] | 3252 | 			"packed IP wrong length for inet_ntoa"); | 
 | 3253 | 		return NULL; | 
 | 3254 | 	} | 
 | 3255 |  | 
 | 3256 | 	memcpy(&packed_addr, packed_str, addr_len); | 
 | 3257 |  | 
 | 3258 | 	return PyString_FromString(inet_ntoa(packed_addr)); | 
 | 3259 | } | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3260 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3261 | #ifdef HAVE_INET_PTON | 
 | 3262 |  | 
 | 3263 | PyDoc_STRVAR(inet_pton_doc, | 
 | 3264 | "inet_pton(af, ip) -> packed IP address string\n\ | 
 | 3265 | \n\ | 
 | 3266 | Convert an IP address from string format to a packed string suitable\n\ | 
 | 3267 | for use with low-level network functions."); | 
 | 3268 |  | 
 | 3269 | static PyObject * | 
 | 3270 | socket_inet_pton(PyObject *self, PyObject *args) | 
 | 3271 | { | 
 | 3272 | 	int af; | 
 | 3273 | 	char* ip; | 
 | 3274 | 	int retval; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3275 | #ifdef ENABLE_IPV6 | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3276 | 	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] | 3277 | #else | 
 | 3278 | 	char packed[sizeof(struct in_addr)]; | 
 | 3279 | #endif | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3280 | 	if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) { | 
 | 3281 | 		return NULL; | 
 | 3282 | 	} | 
 | 3283 |  | 
| Martin v. Löwis | 04697e8 | 2004-06-02 12:35:29 +0000 | [diff] [blame] | 3284 | #if !defined(ENABLE_IPV6) && defined(AF_INET6) | 
| Martin v. Löwis | 1064909 | 2003-08-05 06:25:06 +0000 | [diff] [blame] | 3285 | 	if(af == AF_INET6) { | 
 | 3286 | 		PyErr_SetString(socket_error, | 
 | 3287 | 				"can't use AF_INET6, IPv6 is disabled"); | 
 | 3288 | 		return NULL; | 
 | 3289 | 	} | 
 | 3290 | #endif  | 
 | 3291 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3292 | 	retval = inet_pton(af, ip, packed); | 
 | 3293 | 	if (retval < 0) { | 
 | 3294 | 		PyErr_SetFromErrno(socket_error); | 
 | 3295 | 		return NULL; | 
 | 3296 | 	} else if (retval == 0) { | 
 | 3297 | 		PyErr_SetString(socket_error, | 
 | 3298 | 			"illegal IP address string passed to inet_pton"); | 
 | 3299 | 		return NULL; | 
 | 3300 | 	} else if (af == AF_INET) { | 
 | 3301 | 		return PyString_FromStringAndSize(packed, | 
 | 3302 | 			sizeof(struct in_addr)); | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3303 | #ifdef ENABLE_IPV6 | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3304 | 	} else if (af == AF_INET6) { | 
 | 3305 | 		return PyString_FromStringAndSize(packed, | 
 | 3306 | 			sizeof(struct in6_addr)); | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3307 | #endif | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3308 | 	} else { | 
 | 3309 | 		PyErr_SetString(socket_error, "unknown address family"); | 
 | 3310 | 		return NULL; | 
 | 3311 | 	} | 
 | 3312 | } | 
 | 3313 | 	 | 
 | 3314 | PyDoc_STRVAR(inet_ntop_doc, | 
 | 3315 | "inet_ntop(af, packed_ip) -> string formatted IP address\n\ | 
 | 3316 | \n\ | 
 | 3317 | Convert a packed IP address of the given family to string format."); | 
 | 3318 |  | 
 | 3319 | static PyObject * | 
 | 3320 | socket_inet_ntop(PyObject *self, PyObject *args) | 
 | 3321 | { | 
 | 3322 | 	int af; | 
 | 3323 | 	char* packed; | 
 | 3324 | 	int len; | 
 | 3325 | 	const char* retval; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3326 | #ifdef ENABLE_IPV6 | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3327 | 	char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1]; | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3328 | #else | 
 | 3329 | 	char ip[INET_ADDRSTRLEN + 1]; | 
 | 3330 | #endif | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3331 | 	 | 
 | 3332 | 	/* Guarantee NUL-termination for PyString_FromString() below */ | 
 | 3333 | 	memset((void *) &ip[0], '\0', sizeof(ip) + 1); | 
 | 3334 |  | 
 | 3335 | 	if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) { | 
 | 3336 | 		return NULL; | 
 | 3337 | 	} | 
 | 3338 |  | 
 | 3339 | 	if (af == AF_INET) { | 
 | 3340 | 		if (len != sizeof(struct in_addr)) { | 
 | 3341 | 			PyErr_SetString(PyExc_ValueError, | 
 | 3342 | 				"invalid length of packed IP address string"); | 
 | 3343 | 			return NULL; | 
 | 3344 | 		} | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3345 | #ifdef ENABLE_IPV6 | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3346 | 	} else if (af == AF_INET6) { | 
 | 3347 | 		if (len != sizeof(struct in6_addr)) { | 
 | 3348 | 			PyErr_SetString(PyExc_ValueError, | 
 | 3349 | 				"invalid length of packed IP address string"); | 
 | 3350 | 			return NULL; | 
 | 3351 | 		} | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3352 | #endif | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3353 | 	} else { | 
 | 3354 | 		PyErr_Format(PyExc_ValueError, | 
 | 3355 | 			"unknown address family %d", af); | 
 | 3356 | 		return NULL; | 
 | 3357 | 	} | 
 | 3358 |  | 
 | 3359 | 	retval = inet_ntop(af, packed, ip, sizeof(ip)); | 
 | 3360 | 	if (!retval) { | 
 | 3361 | 		PyErr_SetFromErrno(socket_error); | 
 | 3362 | 		return NULL; | 
 | 3363 | 	} else { | 
 | 3364 | 		return PyString_FromString(retval); | 
 | 3365 | 	} | 
 | 3366 |  | 
 | 3367 | 	/* NOTREACHED */ | 
 | 3368 | 	PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop"); | 
 | 3369 | 	return NULL; | 
 | 3370 | } | 
 | 3371 |  | 
 | 3372 | #endif /* HAVE_INET_PTON */ | 
 | 3373 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3374 | /* Python interface to getaddrinfo(host, port). */ | 
 | 3375 |  | 
 | 3376 | /*ARGSUSED*/ | 
 | 3377 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3378 | socket_getaddrinfo(PyObject *self, PyObject *args) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3379 | { | 
| Martin v. Löwis | f0b11d2 | 2001-11-07 08:31:03 +0000 | [diff] [blame] | 3380 | 	struct addrinfo hints, *res; | 
 | 3381 | 	struct addrinfo *res0 = NULL; | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 3382 | 	PyObject *hobj = NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3383 | 	PyObject *pobj = (PyObject *)NULL; | 
| Martin v. Löwis | f65b1a1 | 2001-08-12 09:28:40 +0000 | [diff] [blame] | 3384 | 	char pbuf[30]; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3385 | 	char *hptr, *pptr; | 
 | 3386 | 	int family, socktype, protocol, flags; | 
 | 3387 | 	int error; | 
 | 3388 | 	PyObject *all = (PyObject *)NULL; | 
 | 3389 | 	PyObject *single = (PyObject *)NULL; | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 3390 | 	PyObject *idna = NULL; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3391 |  | 
 | 3392 | 	family = socktype = protocol = flags = 0; | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 3393 | 	family = AF_UNSPEC; | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 3394 | 	if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo", | 
 | 3395 | 			      &hobj, &pobj, &family, &socktype, | 
 | 3396 | 			      &protocol, &flags)) { | 
 | 3397 | 		return NULL; | 
 | 3398 | 	} | 
 | 3399 | 	if (hobj == Py_None) { | 
 | 3400 | 		hptr = NULL; | 
 | 3401 | 	} else if (PyUnicode_Check(hobj)) { | 
 | 3402 | 		idna = PyObject_CallMethod(hobj, "encode", "s", "idna"); | 
 | 3403 | 		if (!idna) | 
 | 3404 | 			return NULL; | 
 | 3405 | 		hptr = PyString_AsString(idna); | 
 | 3406 | 	} else if (PyString_Check(hobj)) { | 
 | 3407 | 		hptr = PyString_AsString(hobj); | 
 | 3408 | 	} else { | 
 | 3409 | 		PyErr_SetString(PyExc_TypeError,  | 
 | 3410 | 				"getaddrinfo() argument 1 must be string or None"); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3411 | 		return NULL; | 
 | 3412 | 	} | 
 | 3413 | 	if (PyInt_Check(pobj)) { | 
| Marc-André Lemburg | 03d1b18 | 2001-07-31 18:05:33 +0000 | [diff] [blame] | 3414 | 		PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj)); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3415 | 		pptr = pbuf; | 
 | 3416 | 	} else if (PyString_Check(pobj)) { | 
 | 3417 | 		pptr = PyString_AsString(pobj); | 
 | 3418 | 	} else if (pobj == Py_None) { | 
 | 3419 | 		pptr = (char *)NULL; | 
 | 3420 | 	} else { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3421 | 		PyErr_SetString(socket_error, "Int or String expected"); | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 3422 |                 goto err; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3423 | 	} | 
 | 3424 | 	memset(&hints, 0, sizeof(hints)); | 
 | 3425 | 	hints.ai_family = family; | 
 | 3426 | 	hints.ai_socktype = socktype; | 
 | 3427 | 	hints.ai_protocol = protocol; | 
 | 3428 | 	hints.ai_flags = flags; | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 3429 | 	Py_BEGIN_ALLOW_THREADS | 
 | 3430 | 	ACQUIRE_GETADDRINFO_LOCK | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3431 | 	error = getaddrinfo(hptr, pptr, &hints, &res0); | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 3432 | 	Py_END_ALLOW_THREADS | 
 | 3433 | 	RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3434 | 	if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3435 | 		set_gaierror(error); | 
| Martin v. Löwis | 5db099a | 2003-08-07 11:55:15 +0000 | [diff] [blame] | 3436 | 		goto err; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3437 | 	} | 
 | 3438 |  | 
 | 3439 | 	if ((all = PyList_New(0)) == NULL) | 
 | 3440 | 		goto err; | 
 | 3441 | 	for (res = res0; res; res = res->ai_next) { | 
| Guido van Rossum | 716aac0 | 2001-10-12 18:59:27 +0000 | [diff] [blame] | 3442 | 		PyObject *addr = | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 3443 | 			makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol); | 
| Guido van Rossum | 716aac0 | 2001-10-12 18:59:27 +0000 | [diff] [blame] | 3444 | 		if (addr == NULL) | 
 | 3445 | 			goto err; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3446 | 		single = Py_BuildValue("iiisO", res->ai_family, | 
 | 3447 | 			res->ai_socktype, res->ai_protocol, | 
 | 3448 | 			res->ai_canonname ? res->ai_canonname : "", | 
| Guido van Rossum | 716aac0 | 2001-10-12 18:59:27 +0000 | [diff] [blame] | 3449 | 			addr); | 
 | 3450 | 		Py_DECREF(addr); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3451 | 		if (single == NULL) | 
 | 3452 | 			goto err; | 
 | 3453 |  | 
 | 3454 | 		if (PyList_Append(all, single)) | 
 | 3455 | 			goto err; | 
 | 3456 | 		Py_XDECREF(single); | 
 | 3457 | 	} | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 3458 | 	Py_XDECREF(idna); | 
| Neal Norwitz | 90128ba | 2002-08-09 03:37:42 +0000 | [diff] [blame] | 3459 | 	if (res0) | 
 | 3460 | 		freeaddrinfo(res0); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3461 | 	return all; | 
 | 3462 |  err: | 
 | 3463 | 	Py_XDECREF(single); | 
 | 3464 | 	Py_XDECREF(all); | 
| Martin v. Löwis | 2548c73 | 2003-04-18 10:39:54 +0000 | [diff] [blame] | 3465 | 	Py_XDECREF(idna); | 
| Martin v. Löwis | f0b11d2 | 2001-11-07 08:31:03 +0000 | [diff] [blame] | 3466 | 	if (res0) | 
 | 3467 | 		freeaddrinfo(res0); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3468 | 	return (PyObject *)NULL; | 
 | 3469 | } | 
 | 3470 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3471 | PyDoc_STRVAR(getaddrinfo_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 3472 | "getaddrinfo(host, port [, family, socktype, proto, flags])\n\ | 
 | 3473 |     -> list of (family, socktype, proto, canonname, sockaddr)\n\ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3474 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3475 | Resolve host and port into addrinfo struct."); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3476 |  | 
 | 3477 | /* Python interface to getnameinfo(sa, flags). */ | 
 | 3478 |  | 
 | 3479 | /*ARGSUSED*/ | 
 | 3480 | static PyObject * | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3481 | socket_getnameinfo(PyObject *self, PyObject *args) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3482 | { | 
 | 3483 | 	PyObject *sa = (PyObject *)NULL; | 
 | 3484 | 	int flags; | 
 | 3485 | 	char *hostp; | 
| Martin v. Löwis | 06b1d21 | 2001-11-02 23:34:52 +0000 | [diff] [blame] | 3486 | 	int port, flowinfo, scope_id; | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3487 | 	char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV]; | 
 | 3488 | 	struct addrinfo hints, *res = NULL; | 
 | 3489 | 	int error; | 
 | 3490 | 	PyObject *ret = (PyObject *)NULL; | 
 | 3491 |  | 
 | 3492 | 	flags = flowinfo = scope_id = 0; | 
| Martin v. Löwis | 06b1d21 | 2001-11-02 23:34:52 +0000 | [diff] [blame] | 3493 | 	if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags)) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3494 | 		return NULL; | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3495 | 	if  (!PyArg_ParseTuple(sa, "si|ii", | 
 | 3496 | 			       &hostp, &port, &flowinfo, &scope_id)) | 
| Martin v. Löwis | 06b1d21 | 2001-11-02 23:34:52 +0000 | [diff] [blame] | 3497 | 		return NULL; | 
| Marc-André Lemburg | 03d1b18 | 2001-07-31 18:05:33 +0000 | [diff] [blame] | 3498 | 	PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3499 | 	memset(&hints, 0, sizeof(hints)); | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 3500 | 	hints.ai_family = AF_UNSPEC; | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 3501 | 	hints.ai_socktype = SOCK_DGRAM;	/* make numeric port happy */ | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 3502 | 	Py_BEGIN_ALLOW_THREADS | 
 | 3503 | 	ACQUIRE_GETADDRINFO_LOCK | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3504 | 	error = getaddrinfo(hostp, pbuf, &hints, &res); | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 3505 | 	Py_END_ALLOW_THREADS | 
 | 3506 | 	RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3507 | 	if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3508 | 		set_gaierror(error); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3509 | 		goto fail; | 
 | 3510 | 	} | 
 | 3511 | 	if (res->ai_next) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3512 | 		PyErr_SetString(socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3513 | 			"sockaddr resolved to multiple addresses"); | 
 | 3514 | 		goto fail; | 
 | 3515 | 	} | 
 | 3516 | 	switch (res->ai_family) { | 
 | 3517 | 	case AF_INET: | 
 | 3518 | 	    { | 
 | 3519 | 		char *t1; | 
 | 3520 | 		int t2; | 
 | 3521 | 		if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3522 | 			PyErr_SetString(socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3523 | 				"IPv4 sockaddr must be 2 tuple"); | 
 | 3524 | 			goto fail; | 
 | 3525 | 		} | 
 | 3526 | 		break; | 
 | 3527 | 	    } | 
| Martin v. Löwis | 44ddbde | 2001-12-02 10:15:37 +0000 | [diff] [blame] | 3528 | #ifdef ENABLE_IPV6 | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3529 | 	case AF_INET6: | 
 | 3530 | 	    { | 
 | 3531 | 		struct sockaddr_in6 *sin6; | 
 | 3532 | 		sin6 = (struct sockaddr_in6 *)res->ai_addr; | 
 | 3533 | 		sin6->sin6_flowinfo = flowinfo; | 
 | 3534 | 		sin6->sin6_scope_id = scope_id; | 
 | 3535 | 		break; | 
 | 3536 | 	    } | 
 | 3537 | #endif | 
 | 3538 | 	} | 
 | 3539 | 	error = getnameinfo(res->ai_addr, res->ai_addrlen, | 
 | 3540 | 			hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags); | 
 | 3541 | 	if (error) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3542 | 		set_gaierror(error); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3543 | 		goto fail; | 
 | 3544 | 	} | 
 | 3545 | 	ret = Py_BuildValue("ss", hbuf, pbuf); | 
 | 3546 |  | 
 | 3547 | fail: | 
 | 3548 | 	if (res) | 
 | 3549 | 		freeaddrinfo(res); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3550 | 	return ret; | 
 | 3551 | } | 
 | 3552 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3553 | PyDoc_STRVAR(getnameinfo_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 3554 | "getnameinfo(sockaddr, flags) --> (host, port)\n\ | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3555 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3556 | Get host and port for a sockaddr."); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3557 |  | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 3558 |  | 
 | 3559 | /* Python API to getting and setting the default timeout value. */ | 
 | 3560 |  | 
 | 3561 | static PyObject * | 
 | 3562 | socket_getdefaulttimeout(PyObject *self) | 
 | 3563 | { | 
 | 3564 | 	if (defaulttimeout < 0.0) { | 
 | 3565 | 		Py_INCREF(Py_None); | 
 | 3566 | 		return Py_None; | 
 | 3567 | 	} | 
 | 3568 | 	else | 
 | 3569 | 		return PyFloat_FromDouble(defaulttimeout); | 
 | 3570 | } | 
 | 3571 |  | 
 | 3572 | PyDoc_STRVAR(getdefaulttimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 3573 | "getdefaulttimeout() -> timeout\n\ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 3574 | \n\ | 
 | 3575 | Returns the default timeout in floating seconds for new socket objects.\n\ | 
 | 3576 | A value of None indicates that new socket objects have no timeout.\n\ | 
 | 3577 | When the socket module is first imported, the default is None."); | 
 | 3578 |  | 
 | 3579 | static PyObject * | 
 | 3580 | socket_setdefaulttimeout(PyObject *self, PyObject *arg) | 
 | 3581 | { | 
 | 3582 | 	double timeout; | 
 | 3583 |  | 
 | 3584 | 	if (arg == Py_None) | 
 | 3585 | 		timeout = -1.0; | 
 | 3586 | 	else { | 
 | 3587 | 		timeout = PyFloat_AsDouble(arg); | 
 | 3588 | 		if (timeout < 0.0) { | 
 | 3589 | 			if (!PyErr_Occurred()) | 
 | 3590 | 				PyErr_SetString(PyExc_ValueError, | 
 | 3591 | 						"Timeout value out of range"); | 
 | 3592 | 			return NULL; | 
 | 3593 | 		} | 
 | 3594 | 	} | 
 | 3595 |  | 
 | 3596 | 	defaulttimeout = timeout; | 
 | 3597 |  | 
 | 3598 | 	Py_INCREF(Py_None); | 
 | 3599 | 	return Py_None; | 
 | 3600 | } | 
 | 3601 |  | 
 | 3602 | PyDoc_STRVAR(setdefaulttimeout_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 3603 | "setdefaulttimeout(timeout)\n\ | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 3604 | \n\ | 
 | 3605 | Set the default timeout in floating seconds for new socket objects.\n\ | 
 | 3606 | A value of None indicates that new socket objects have no timeout.\n\ | 
 | 3607 | When the socket module is first imported, the default is None."); | 
 | 3608 |  | 
 | 3609 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3610 | /* List of functions exported by this module. */ | 
 | 3611 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3612 | static PyMethodDef socket_methods[] = { | 
 | 3613 | 	{"gethostbyname",	socket_gethostbyname, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3614 | 	 METH_VARARGS, gethostbyname_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3615 | 	{"gethostbyname_ex",	socket_gethostbyname_ex, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3616 | 	 METH_VARARGS, ghbn_ex_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3617 | 	{"gethostbyaddr",	socket_gethostbyaddr, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3618 | 	 METH_VARARGS, gethostbyaddr_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3619 | 	{"gethostname",		socket_gethostname, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3620 | 	 METH_VARARGS, gethostname_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3621 | 	{"getservbyname",	socket_getservbyname, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3622 | 	 METH_VARARGS, getservbyname_doc}, | 
| Barry Warsaw | 11b91a0 | 2004-06-28 00:50:43 +0000 | [diff] [blame] | 3623 | 	{"getservbyport",	socket_getservbyport, | 
 | 3624 | 	 METH_VARARGS, getservbyport_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3625 | 	{"getprotobyname",	socket_getprotobyname, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3626 | 	 METH_VARARGS,getprotobyname_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3627 | #ifndef NO_DUP | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3628 | 	{"fromfd",		socket_fromfd, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3629 | 	 METH_VARARGS, fromfd_doc}, | 
| Guido van Rossum | 6a3eb5f | 1994-08-18 15:42:46 +0000 | [diff] [blame] | 3630 | #endif | 
| Dave Cole | 331708b | 2004-08-09 04:51:41 +0000 | [diff] [blame] | 3631 | #ifdef HAVE_SOCKETPAIR | 
 | 3632 | 	{"socketpair",		socket_socketpair, | 
 | 3633 | 	 METH_VARARGS, socketpair_doc}, | 
 | 3634 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3635 | 	{"ntohs",		socket_ntohs, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3636 | 	 METH_VARARGS, ntohs_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3637 | 	{"ntohl",		socket_ntohl, | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3638 | 	 METH_O, ntohl_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3639 | 	{"htons",		socket_htons, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3640 | 	 METH_VARARGS, htons_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3641 | 	{"htonl",		socket_htonl, | 
| Jeremy Hylton | c075e19 | 2002-07-25 16:01:12 +0000 | [diff] [blame] | 3642 | 	 METH_O, htonl_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3643 | 	{"inet_aton",		socket_inet_aton, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3644 | 	 METH_VARARGS, inet_aton_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3645 | 	{"inet_ntoa",		socket_inet_ntoa, | 
| Andrew M. Kuchling | e365fb8 | 2000-08-03 02:06:16 +0000 | [diff] [blame] | 3646 | 	 METH_VARARGS, inet_ntoa_doc}, | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3647 | #ifdef HAVE_INET_PTON | 
 | 3648 | 	{"inet_pton",		socket_inet_pton, | 
 | 3649 | 	 METH_VARARGS, inet_pton_doc}, | 
 | 3650 | 	{"inet_ntop",		socket_inet_ntop, | 
 | 3651 | 	 METH_VARARGS, inet_ntop_doc}, | 
 | 3652 | #endif | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3653 | 	{"getaddrinfo",		socket_getaddrinfo, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3654 | 	 METH_VARARGS, getaddrinfo_doc}, | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3655 | 	{"getnameinfo",		socket_getnameinfo, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3656 | 	 METH_VARARGS, getnameinfo_doc}, | 
| Guido van Rossum | 1693ba8 | 2002-07-18 21:11:26 +0000 | [diff] [blame] | 3657 | 	{"getdefaulttimeout",	(PyCFunction)socket_getdefaulttimeout, | 
| Guido van Rossum | 9d0c8ce | 2002-07-18 17:08:35 +0000 | [diff] [blame] | 3658 | 	 METH_NOARGS, getdefaulttimeout_doc}, | 
 | 3659 | 	{"setdefaulttimeout",	socket_setdefaulttimeout, | 
 | 3660 | 	 METH_O, setdefaulttimeout_doc}, | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3661 | 	{NULL,			NULL}		 /* Sentinel */ | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3662 | }; | 
 | 3663 |  | 
| Guido van Rossum | 30a685f | 1991-06-27 15:51:29 +0000 | [diff] [blame] | 3664 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3665 | #ifdef RISCOS | 
 | 3666 | #define OS_INIT_DEFINED | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3667 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3668 | static int | 
 | 3669 | os_init(void) | 
 | 3670 | { | 
 | 3671 | 	_kernel_swi_regs r; | 
 | 3672 |  | 
 | 3673 | 	r.r[0] = 0; | 
 | 3674 | 	_kernel_swi(0x43380, &r, &r); | 
 | 3675 | 	taskwindow = r.r[0]; | 
 | 3676 |  | 
| Martin v. Löwis | a94568a | 2003-05-10 07:36:56 +0000 | [diff] [blame] | 3677 | 	return 1; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3678 | } | 
 | 3679 |  | 
 | 3680 | #endif /* RISCOS */ | 
 | 3681 |  | 
 | 3682 |  | 
 | 3683 | #ifdef MS_WINDOWS | 
 | 3684 | #define OS_INIT_DEFINED | 
 | 3685 |  | 
 | 3686 | /* Additional initialization and cleanup for Windows */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3687 |  | 
 | 3688 | static void | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3689 | os_cleanup(void) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3690 | { | 
 | 3691 | 	WSACleanup(); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3692 | } | 
 | 3693 |  | 
 | 3694 | static int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3695 | os_init(void) | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3696 | { | 
 | 3697 | 	WSADATA WSAData; | 
 | 3698 | 	int ret; | 
 | 3699 | 	char buf[100]; | 
 | 3700 | 	ret = WSAStartup(0x0101, &WSAData); | 
 | 3701 | 	switch (ret) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3702 | 	case 0:	/* No error */ | 
| Mark Hammond | 14350ab | 2003-07-09 04:57:46 +0000 | [diff] [blame] | 3703 | 		Py_AtExit(os_cleanup); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3704 | 		return 1; /* Success */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3705 | 	case WSASYSNOTREADY: | 
 | 3706 | 		PyErr_SetString(PyExc_ImportError, | 
 | 3707 | 				"WSAStartup failed: network not ready"); | 
 | 3708 | 		break; | 
 | 3709 | 	case WSAVERNOTSUPPORTED: | 
 | 3710 | 	case WSAEINVAL: | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3711 | 		PyErr_SetString( | 
 | 3712 | 			PyExc_ImportError, | 
 | 3713 | 			"WSAStartup failed: requested version not supported"); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3714 | 		break; | 
 | 3715 | 	default: | 
| Tim Peters | 885d457 | 2001-11-28 20:27:42 +0000 | [diff] [blame] | 3716 | 		PyOS_snprintf(buf, sizeof(buf), | 
 | 3717 | 			      "WSAStartup failed: error code %d", ret); | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3718 | 		PyErr_SetString(PyExc_ImportError, buf); | 
 | 3719 | 		break; | 
 | 3720 | 	} | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3721 | 	return 0; /* Failure */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3722 | } | 
 | 3723 |  | 
| Guido van Rossum | 8d665e6 | 1996-06-26 18:22:49 +0000 | [diff] [blame] | 3724 | #endif /* MS_WINDOWS */ | 
| Guido van Rossum | be32c89 | 1996-06-20 16:25:29 +0000 | [diff] [blame] | 3725 |  | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3726 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3727 | #ifdef PYOS_OS2 | 
 | 3728 | #define OS_INIT_DEFINED | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3729 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3730 | /* Additional initialization for OS/2 */ | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3731 |  | 
 | 3732 | static int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3733 | os_init(void) | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3734 | { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3735 | #ifndef PYCC_GCC | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3736 | 	char reason[64]; | 
 | 3737 | 	int rc = sock_init(); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3738 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3739 | 	if (rc == 0) { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3740 | 		return 1; /* Success */ | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3741 | 	} | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3742 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3743 | 	PyOS_snprintf(reason, sizeof(reason), | 
 | 3744 | 		      "OS/2 TCP/IP Error# %d", sock_errno()); | 
 | 3745 | 	PyErr_SetString(PyExc_ImportError, reason); | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3746 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3747 | 	return 0;  /* Failure */ | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 3748 | #else | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3749 | 	/* No need to initialise sockets with GCC/EMX */ | 
 | 3750 | 	return 1; /* Success */ | 
| Andrew MacIntyre | ba43e87 | 2002-03-03 03:03:52 +0000 | [diff] [blame] | 3751 | #endif | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 3752 | } | 
 | 3753 |  | 
 | 3754 | #endif /* PYOS_OS2 */ | 
 | 3755 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3756 |  | 
 | 3757 | #ifndef OS_INIT_DEFINED | 
 | 3758 | static int | 
 | 3759 | os_init(void) | 
 | 3760 | { | 
 | 3761 | 	return 1; /* Success */ | 
 | 3762 | } | 
 | 3763 | #endif | 
 | 3764 |  | 
 | 3765 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 3766 | /* C API table - always add new things to the end for binary | 
 | 3767 |    compatibility. */ | 
 | 3768 | static | 
 | 3769 | PySocketModule_APIObject PySocketModuleAPI = | 
 | 3770 | { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3771 | 	&sock_type, | 
| Brett Cannon | 06c3479 | 2004-03-23 23:16:54 +0000 | [diff] [blame] | 3772 |         NULL | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 3773 | }; | 
 | 3774 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3775 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3776 | /* Initialize the _socket module. | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3777 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3778 |    This module is actually called "_socket", and there's a wrapper | 
 | 3779 |    "socket.py" which implements some additional functionality.  On some | 
 | 3780 |    platforms (e.g. Windows and OS/2), socket.py also implements a | 
 | 3781 |    wrapper for the socket type that provides missing functionality such | 
 | 3782 |    as makefile(), dup() and fromfd().  The import of "_socket" may fail | 
 | 3783 |    with an ImportError exception if os-specific initialization fails. | 
 | 3784 |    On Windows, this does WINSOCK initialization.  When WINSOCK is | 
 | 3785 |    initialized succesfully, a call to WSACleanup() is scheduled to be | 
 | 3786 |    made at exit time. | 
 | 3787 | */ | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 3788 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3789 | PyDoc_STRVAR(socket_doc, | 
| Guido van Rossum | 22a9715 | 2002-08-08 20:37:08 +0000 | [diff] [blame] | 3790 | "Implementation module for socket operations.\n\ | 
 | 3791 | \n\ | 
 | 3792 | See the socket module for documentation."); | 
| Guido van Rossum | 82a5c66 | 1998-07-07 20:45:43 +0000 | [diff] [blame] | 3793 |  | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 3794 | PyMODINIT_FUNC | 
| Thomas Wouters | 1e0c2f4 | 2000-07-24 16:06:23 +0000 | [diff] [blame] | 3795 | init_socket(void) | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 3796 | { | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3797 | 	PyObject *m, *has_ipv6; | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3798 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3799 | 	if (!os_init()) | 
| Guido van Rossum | 0cb96de | 1997-10-01 04:29:29 +0000 | [diff] [blame] | 3800 | 		return; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3801 |  | 
 | 3802 | 	sock_type.ob_type = &PyType_Type; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3803 | 	m = Py_InitModule3(PySocket_MODULE_NAME, | 
 | 3804 | 			   socket_methods, | 
 | 3805 | 			   socket_doc); | 
 | 3806 |  | 
 | 3807 | 	socket_error = PyErr_NewException("socket.error", NULL, NULL); | 
 | 3808 | 	if (socket_error == NULL) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3809 | 		return; | 
| Brett Cannon | 06c3479 | 2004-03-23 23:16:54 +0000 | [diff] [blame] | 3810 |         PySocketModuleAPI.error = socket_error; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3811 | 	Py_INCREF(socket_error); | 
 | 3812 | 	PyModule_AddObject(m, "error", socket_error); | 
 | 3813 | 	socket_herror = PyErr_NewException("socket.herror", | 
 | 3814 | 					   socket_error, NULL); | 
 | 3815 | 	if (socket_herror == NULL) | 
 | 3816 | 		return; | 
 | 3817 | 	Py_INCREF(socket_herror); | 
 | 3818 | 	PyModule_AddObject(m, "herror", socket_herror); | 
 | 3819 | 	socket_gaierror = PyErr_NewException("socket.gaierror", socket_error, | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3820 | 	    NULL); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3821 | 	if (socket_gaierror == NULL) | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3822 | 		return; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3823 | 	Py_INCREF(socket_gaierror); | 
 | 3824 | 	PyModule_AddObject(m, "gaierror", socket_gaierror); | 
| Raymond Hettinger | ef7343c | 2003-06-29 03:08:05 +0000 | [diff] [blame] | 3825 | 	socket_timeout = PyErr_NewException("socket.timeout", | 
 | 3826 | 					    socket_error, NULL); | 
 | 3827 | 	if (socket_timeout == NULL) | 
 | 3828 | 		return; | 
 | 3829 | 	Py_INCREF(socket_timeout); | 
 | 3830 | 	PyModule_AddObject(m, "timeout", socket_timeout); | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3831 | 	Py_INCREF((PyObject *)&sock_type); | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3832 | 	if (PyModule_AddObject(m, "SocketType", | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3833 | 			       (PyObject *)&sock_type) != 0) | 
| Guido van Rossum | 0cb96de | 1997-10-01 04:29:29 +0000 | [diff] [blame] | 3834 | 		return; | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3835 | 	Py_INCREF((PyObject *)&sock_type); | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3836 | 	if (PyModule_AddObject(m, "socket", | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 3837 | 			       (PyObject *)&sock_type) != 0) | 
| Guido van Rossum | 384ca9c | 2001-10-27 22:20:47 +0000 | [diff] [blame] | 3838 | 		return; | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3839 |  | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 3840 | #ifdef ENABLE_IPV6 | 
 | 3841 | 	has_ipv6 = Py_True; | 
 | 3842 | #else | 
 | 3843 | 	has_ipv6 = Py_False; | 
 | 3844 | #endif | 
 | 3845 | 	Py_INCREF(has_ipv6); | 
 | 3846 | 	PyModule_AddObject(m, "has_ipv6", has_ipv6); | 
 | 3847 |  | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 3848 | 	/* Export C API */ | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3849 | 	if (PyModule_AddObject(m, PySocket_CAPI_NAME, | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 3850 | 	       PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL) | 
 | 3851 | 				 ) != 0) | 
 | 3852 | 		return; | 
 | 3853 |  | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3854 | 	/* Address families (we only support AF_INET and AF_UNIX) */ | 
 | 3855 | #ifdef AF_UNSPEC | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3856 | 	PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3857 | #endif | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3858 | 	PyModule_AddIntConstant(m, "AF_INET", AF_INET); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3859 | #ifdef AF_INET6 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3860 | 	PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 3861 | #endif /* AF_INET6 */ | 
| Andrew MacIntyre | d12dfbb | 2004-04-04 07:13:49 +0000 | [diff] [blame] | 3862 | #if defined(AF_UNIX) | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3863 | 	PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX); | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 3864 | #endif /* AF_UNIX */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3865 | #ifdef AF_AX25 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3866 | 	/* Amateur Radio AX.25 */ | 
 | 3867 | 	PyModule_AddIntConstant(m, "AF_AX25", AF_AX25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3868 | #endif | 
 | 3869 | #ifdef AF_IPX | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3870 | 	PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3871 | #endif | 
 | 3872 | #ifdef AF_APPLETALK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3873 | 	/* Appletalk DDP */ | 
 | 3874 | 	PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3875 | #endif | 
 | 3876 | #ifdef AF_NETROM | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3877 | 	/* Amateur radio NetROM */ | 
 | 3878 | 	PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3879 | #endif | 
 | 3880 | #ifdef AF_BRIDGE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3881 | 	/* Multiprotocol bridge */ | 
 | 3882 | 	PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3883 | #endif | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 3884 | #ifdef AF_ATMPVC | 
 | 3885 | 	/* ATM PVCs */ | 
 | 3886 | 	PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC); | 
 | 3887 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3888 | #ifdef AF_AAL5 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3889 | 	/* Reserved for Werner's ATM */ | 
 | 3890 | 	PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3891 | #endif | 
 | 3892 | #ifdef AF_X25 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3893 | 	/* Reserved for X.25 project */ | 
 | 3894 | 	PyModule_AddIntConstant(m, "AF_X25", AF_X25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3895 | #endif | 
 | 3896 | #ifdef AF_INET6 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3897 | 	PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */ | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3898 | #endif | 
 | 3899 | #ifdef AF_ROSE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3900 | 	/* Amateur Radio X.25 PLP */ | 
 | 3901 | 	PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3902 | #endif | 
| Martin v. Löwis | 81aec4b | 2004-07-19 17:01:20 +0000 | [diff] [blame] | 3903 | #ifdef AF_DECnet | 
 | 3904 | 	/* Reserved for DECnet project */ | 
 | 3905 | 	PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet); | 
 | 3906 | #endif | 
 | 3907 | #ifdef AF_NETBEUI | 
 | 3908 | 	/* Reserved for 802.2LLC project */ | 
 | 3909 | 	PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI); | 
 | 3910 | #endif | 
 | 3911 | #ifdef AF_SECURITY | 
 | 3912 | 	/* Security callback pseudo AF */ | 
 | 3913 | 	PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY); | 
 | 3914 | #endif | 
 | 3915 | #ifdef AF_KEY | 
 | 3916 | 	/* PF_KEY key management API */ | 
 | 3917 | 	PyModule_AddIntConstant(m, "AF_KEY", AF_KEY); | 
 | 3918 | #endif | 
 | 3919 | #ifdef AF_NETLINK | 
 | 3920 | 	/*  */ | 
 | 3921 | 	PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK); | 
 | 3922 | #endif | 
 | 3923 | #ifdef AF_ROUTE | 
 | 3924 | 	/* Alias to emulate 4.4BSD */ | 
 | 3925 | 	PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE); | 
 | 3926 | #endif | 
 | 3927 | #ifdef AF_ASH | 
 | 3928 | 	/* Ash */ | 
 | 3929 | 	PyModule_AddIntConstant(m, "AF_ASH", AF_ASH); | 
 | 3930 | #endif | 
 | 3931 | #ifdef AF_ECONET | 
 | 3932 | 	/* Acorn Econet */ | 
 | 3933 | 	PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET); | 
 | 3934 | #endif | 
 | 3935 | #ifdef AF_ATMSVC | 
 | 3936 | 	/* ATM SVCs */ | 
 | 3937 | 	PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC); | 
 | 3938 | #endif | 
 | 3939 | #ifdef AF_SNA | 
 | 3940 | 	/* Linux SNA Project (nutters!) */ | 
 | 3941 | 	PyModule_AddIntConstant(m, "AF_SNA", AF_SNA); | 
 | 3942 | #endif | 
 | 3943 | #ifdef AF_IRDA | 
 | 3944 | 	/* IRDA sockets */ | 
 | 3945 | 	PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA); | 
 | 3946 | #endif | 
 | 3947 | #ifdef AF_PPPOX | 
 | 3948 | 	/* PPPoX sockets */ | 
 | 3949 | 	PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX); | 
 | 3950 | #endif | 
 | 3951 | #ifdef AF_WANPIPE | 
 | 3952 | 	/* Wanpipe API Sockets */ | 
 | 3953 | 	PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE); | 
 | 3954 | #endif | 
 | 3955 | #ifdef AF_LLC | 
 | 3956 | 	/* Linux LLC */ | 
 | 3957 | 	PyModule_AddIntConstant(m, "AF_LLC", AF_LLC); | 
 | 3958 | #endif | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 3959 |  | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 3960 | #ifdef USE_BLUETOOTH | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 3961 | 	PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH); | 
 | 3962 | 	PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP); | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 3963 | #if !defined(__FreeBSD__) | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 3964 | 	PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO); | 
| Hye-Shik Chang | 8126860 | 2004-02-02 06:05:24 +0000 | [diff] [blame] | 3965 | #endif | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 3966 | 	PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM); | 
| Martin v. Löwis | 558d9bf | 2004-06-03 09:24:42 +0000 | [diff] [blame] | 3967 | 	PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00")); | 
 | 3968 | 	PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF")); | 
| Martin v. Löwis | 12af048 | 2004-01-31 12:34:17 +0000 | [diff] [blame] | 3969 | #endif | 
 | 3970 |  | 
| Martin v. Löwis | 1ba3fd5 | 2001-08-10 20:29:40 +0000 | [diff] [blame] | 3971 | #ifdef HAVE_NETPACKET_PACKET_H | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3972 | 	PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET); | 
 | 3973 | 	PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET); | 
 | 3974 | 	PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST); | 
 | 3975 | 	PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST); | 
 | 3976 | 	PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST); | 
 | 3977 | 	PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST); | 
 | 3978 | 	PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING); | 
 | 3979 | 	PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK); | 
 | 3980 | 	PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE); | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 3981 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 3982 |  | 
 | 3983 | 	/* Socket types */ | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3984 | 	PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM); | 
 | 3985 | 	PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 3986 | #ifndef __BEOS__ | 
 | 3987 | /* We have incomplete socket support. */ | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3988 | 	PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW); | 
 | 3989 | 	PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET); | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 3990 | #if defined(SOCK_RDM) | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3991 | 	PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM); | 
| Guido van Rossum | bcc2074 | 1998-08-04 22:53:56 +0000 | [diff] [blame] | 3992 | #endif | 
| Martin v. Löwis | cf8f47e | 2002-12-11 13:10:57 +0000 | [diff] [blame] | 3993 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 3994 |  | 
 | 3995 | #ifdef	SO_DEBUG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3996 | 	PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 3997 | #endif | 
 | 3998 | #ifdef	SO_ACCEPTCONN | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 3999 | 	PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4000 | #endif | 
 | 4001 | #ifdef	SO_REUSEADDR | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4002 | 	PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4003 | #endif | 
| Andrew M. Kuchling | 42851ab | 2004-07-10 14:19:21 +0000 | [diff] [blame] | 4004 | #ifdef SO_EXCLUSIVEADDRUSE | 
 | 4005 | 	PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE); | 
 | 4006 | #endif | 
 | 4007 |  | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4008 | #ifdef	SO_KEEPALIVE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4009 | 	PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4010 | #endif | 
 | 4011 | #ifdef	SO_DONTROUTE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4012 | 	PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4013 | #endif | 
 | 4014 | #ifdef	SO_BROADCAST | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4015 | 	PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4016 | #endif | 
 | 4017 | #ifdef	SO_USELOOPBACK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4018 | 	PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4019 | #endif | 
 | 4020 | #ifdef	SO_LINGER | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4021 | 	PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4022 | #endif | 
 | 4023 | #ifdef	SO_OOBINLINE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4024 | 	PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4025 | #endif | 
 | 4026 | #ifdef	SO_REUSEPORT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4027 | 	PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4028 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4029 | #ifdef	SO_SNDBUF | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4030 | 	PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4031 | #endif | 
 | 4032 | #ifdef	SO_RCVBUF | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4033 | 	PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4034 | #endif | 
 | 4035 | #ifdef	SO_SNDLOWAT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4036 | 	PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4037 | #endif | 
 | 4038 | #ifdef	SO_RCVLOWAT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4039 | 	PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4040 | #endif | 
 | 4041 | #ifdef	SO_SNDTIMEO | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4042 | 	PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4043 | #endif | 
 | 4044 | #ifdef	SO_RCVTIMEO | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4045 | 	PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4046 | #endif | 
 | 4047 | #ifdef	SO_ERROR | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4048 | 	PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4049 | #endif | 
 | 4050 | #ifdef	SO_TYPE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4051 | 	PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4052 | #endif | 
 | 4053 |  | 
 | 4054 | 	/* Maximum number of connections for "listen" */ | 
 | 4055 | #ifdef	SOMAXCONN | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4056 | 	PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4057 | #else | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 4058 | 	PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */ | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4059 | #endif | 
 | 4060 |  | 
 | 4061 | 	/* Flags for send, recv */ | 
 | 4062 | #ifdef	MSG_OOB | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4063 | 	PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4064 | #endif | 
 | 4065 | #ifdef	MSG_PEEK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4066 | 	PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4067 | #endif | 
 | 4068 | #ifdef	MSG_DONTROUTE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4069 | 	PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4070 | #endif | 
| Guido van Rossum | 2c8bcb8 | 2000-04-25 21:34:53 +0000 | [diff] [blame] | 4071 | #ifdef	MSG_DONTWAIT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4072 | 	PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT); | 
| Guido van Rossum | 2c8bcb8 | 2000-04-25 21:34:53 +0000 | [diff] [blame] | 4073 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4074 | #ifdef	MSG_EOR | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4075 | 	PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4076 | #endif | 
 | 4077 | #ifdef	MSG_TRUNC | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4078 | 	PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4079 | #endif | 
 | 4080 | #ifdef	MSG_CTRUNC | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4081 | 	PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4082 | #endif | 
 | 4083 | #ifdef	MSG_WAITALL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4084 | 	PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4085 | #endif | 
 | 4086 | #ifdef	MSG_BTAG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4087 | 	PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4088 | #endif | 
 | 4089 | #ifdef	MSG_ETAG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4090 | 	PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4091 | #endif | 
 | 4092 |  | 
 | 4093 | 	/* Protocol level and numbers, usable for [gs]etsockopt */ | 
 | 4094 | #ifdef	SOL_SOCKET | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4095 | 	PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4096 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4097 | #ifdef	SOL_IP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4098 | 	PyModule_AddIntConstant(m, "SOL_IP", SOL_IP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4099 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4100 | 	PyModule_AddIntConstant(m, "SOL_IP", 0); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4101 | #endif | 
 | 4102 | #ifdef	SOL_IPX | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4103 | 	PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4104 | #endif | 
 | 4105 | #ifdef	SOL_AX25 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4106 | 	PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4107 | #endif | 
 | 4108 | #ifdef	SOL_ATALK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4109 | 	PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4110 | #endif | 
 | 4111 | #ifdef	SOL_NETROM | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4112 | 	PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4113 | #endif | 
 | 4114 | #ifdef	SOL_ROSE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4115 | 	PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4116 | #endif | 
 | 4117 | #ifdef	SOL_TCP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4118 | 	PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4119 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4120 | 	PyModule_AddIntConstant(m, "SOL_TCP", 6); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4121 | #endif | 
 | 4122 | #ifdef	SOL_UDP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4123 | 	PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4124 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4125 | 	PyModule_AddIntConstant(m, "SOL_UDP", 17); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4126 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4127 | #ifdef	IPPROTO_IP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4128 | 	PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4129 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4130 | 	PyModule_AddIntConstant(m, "IPPROTO_IP", 0); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4131 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4132 | #ifdef	IPPROTO_HOPOPTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4133 | 	PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4134 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4135 | #ifdef	IPPROTO_ICMP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4136 | 	PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4137 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4138 | 	PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4139 | #endif | 
 | 4140 | #ifdef	IPPROTO_IGMP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4141 | 	PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4142 | #endif | 
 | 4143 | #ifdef	IPPROTO_GGP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4144 | 	PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4145 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4146 | #ifdef	IPPROTO_IPV4 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4147 | 	PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4148 | #endif | 
| Martin v. Löwis | a0f1734 | 2003-10-03 13:56:20 +0000 | [diff] [blame] | 4149 | #ifdef	IPPROTO_IPV6 | 
 | 4150 | 	PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6); | 
 | 4151 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4152 | #ifdef	IPPROTO_IPIP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4153 | 	PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4154 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4155 | #ifdef	IPPROTO_TCP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4156 | 	PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4157 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4158 | 	PyModule_AddIntConstant(m, "IPPROTO_TCP", 6); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4159 | #endif | 
 | 4160 | #ifdef	IPPROTO_EGP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4161 | 	PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4162 | #endif | 
 | 4163 | #ifdef	IPPROTO_PUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4164 | 	PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4165 | #endif | 
 | 4166 | #ifdef	IPPROTO_UDP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4167 | 	PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4168 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4169 | 	PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4170 | #endif | 
 | 4171 | #ifdef	IPPROTO_IDP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4172 | 	PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4173 | #endif | 
 | 4174 | #ifdef	IPPROTO_HELLO | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4175 | 	PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4176 | #endif | 
 | 4177 | #ifdef	IPPROTO_ND | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4178 | 	PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4179 | #endif | 
 | 4180 | #ifdef	IPPROTO_TP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4181 | 	PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4182 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4183 | #ifdef	IPPROTO_IPV6 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4184 | 	PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4185 | #endif | 
 | 4186 | #ifdef	IPPROTO_ROUTING | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4187 | 	PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4188 | #endif | 
 | 4189 | #ifdef	IPPROTO_FRAGMENT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4190 | 	PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4191 | #endif | 
 | 4192 | #ifdef	IPPROTO_RSVP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4193 | 	PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4194 | #endif | 
 | 4195 | #ifdef	IPPROTO_GRE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4196 | 	PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4197 | #endif | 
 | 4198 | #ifdef	IPPROTO_ESP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4199 | 	PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4200 | #endif | 
 | 4201 | #ifdef	IPPROTO_AH | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4202 | 	PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4203 | #endif | 
 | 4204 | #ifdef	IPPROTO_MOBILE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4205 | 	PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4206 | #endif | 
 | 4207 | #ifdef	IPPROTO_ICMPV6 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4208 | 	PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4209 | #endif | 
 | 4210 | #ifdef	IPPROTO_NONE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4211 | 	PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4212 | #endif | 
 | 4213 | #ifdef	IPPROTO_DSTOPTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4214 | 	PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4215 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4216 | #ifdef	IPPROTO_XTP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4217 | 	PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4218 | #endif | 
 | 4219 | #ifdef	IPPROTO_EON | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4220 | 	PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4221 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4222 | #ifdef	IPPROTO_PIM | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4223 | 	PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4224 | #endif | 
 | 4225 | #ifdef	IPPROTO_IPCOMP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4226 | 	PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4227 | #endif | 
 | 4228 | #ifdef	IPPROTO_VRRP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4229 | 	PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4230 | #endif | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4231 | #ifdef	IPPROTO_BIP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4232 | 	PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4233 | #endif | 
 | 4234 | /**/ | 
 | 4235 | #ifdef	IPPROTO_RAW | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4236 | 	PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW); | 
| Guido van Rossum | 578de30 | 1998-05-28 20:18:18 +0000 | [diff] [blame] | 4237 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4238 | 	PyModule_AddIntConstant(m, "IPPROTO_RAW", 255); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4239 | #endif | 
 | 4240 | #ifdef	IPPROTO_MAX | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4241 | 	PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4242 | #endif | 
 | 4243 |  | 
 | 4244 | 	/* Some port configuration */ | 
 | 4245 | #ifdef	IPPORT_RESERVED | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4246 | 	PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4247 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4248 | 	PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4249 | #endif | 
 | 4250 | #ifdef	IPPORT_USERRESERVED | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4251 | 	PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4252 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4253 | 	PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4254 | #endif | 
 | 4255 |  | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4256 | 	/* Some reserved IP v.4 addresses */ | 
 | 4257 | #ifdef	INADDR_ANY | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4258 | 	PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4259 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4260 | 	PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4261 | #endif | 
 | 4262 | #ifdef	INADDR_BROADCAST | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4263 | 	PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4264 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4265 | 	PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4266 | #endif | 
 | 4267 | #ifdef	INADDR_LOOPBACK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4268 | 	PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4269 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4270 | 	PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4271 | #endif | 
 | 4272 | #ifdef	INADDR_UNSPEC_GROUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4273 | 	PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4274 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4275 | 	PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4276 | #endif | 
 | 4277 | #ifdef	INADDR_ALLHOSTS_GROUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4278 | 	PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", | 
 | 4279 | 				INADDR_ALLHOSTS_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4280 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4281 | 	PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4282 | #endif | 
 | 4283 | #ifdef	INADDR_MAX_LOCAL_GROUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4284 | 	PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", | 
 | 4285 | 				INADDR_MAX_LOCAL_GROUP); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4286 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4287 | 	PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4288 | #endif | 
 | 4289 | #ifdef	INADDR_NONE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4290 | 	PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4291 | #else | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4292 | 	PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff); | 
| Guido van Rossum | 5f05eb4 | 1995-02-17 15:11:07 +0000 | [diff] [blame] | 4293 | #endif | 
 | 4294 |  | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4295 | 	/* IPv4 [gs]etsockopt options */ | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4296 | #ifdef	IP_OPTIONS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4297 | 	PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4298 | #endif | 
 | 4299 | #ifdef	IP_HDRINCL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4300 | 	PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4301 | #endif | 
 | 4302 | #ifdef	IP_TOS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4303 | 	PyModule_AddIntConstant(m, "IP_TOS", IP_TOS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4304 | #endif | 
 | 4305 | #ifdef	IP_TTL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4306 | 	PyModule_AddIntConstant(m, "IP_TTL", IP_TTL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4307 | #endif | 
 | 4308 | #ifdef	IP_RECVOPTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4309 | 	PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4310 | #endif | 
 | 4311 | #ifdef	IP_RECVRETOPTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4312 | 	PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4313 | #endif | 
 | 4314 | #ifdef	IP_RECVDSTADDR | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4315 | 	PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4316 | #endif | 
 | 4317 | #ifdef	IP_RETOPTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4318 | 	PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4319 | #endif | 
 | 4320 | #ifdef	IP_MULTICAST_IF | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4321 | 	PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4322 | #endif | 
 | 4323 | #ifdef	IP_MULTICAST_TTL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4324 | 	PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4325 | #endif | 
 | 4326 | #ifdef	IP_MULTICAST_LOOP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4327 | 	PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4328 | #endif | 
 | 4329 | #ifdef	IP_ADD_MEMBERSHIP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4330 | 	PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4331 | #endif | 
 | 4332 | #ifdef	IP_DROP_MEMBERSHIP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4333 | 	PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP); | 
| Guido van Rossum | 3fdf58b | 1995-02-07 15:39:52 +0000 | [diff] [blame] | 4334 | #endif | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4335 | #ifdef	IP_DEFAULT_MULTICAST_TTL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4336 | 	PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL", | 
 | 4337 | 				IP_DEFAULT_MULTICAST_TTL); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4338 | #endif | 
 | 4339 | #ifdef	IP_DEFAULT_MULTICAST_LOOP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4340 | 	PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP", | 
 | 4341 | 				IP_DEFAULT_MULTICAST_LOOP); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4342 | #endif | 
 | 4343 | #ifdef	IP_MAX_MEMBERSHIPS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4344 | 	PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4345 | #endif | 
 | 4346 |  | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4347 | 	/* IPv6 [gs]etsockopt options, defined in RFC2553 */ | 
 | 4348 | #ifdef	IPV6_JOIN_GROUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4349 | 	PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4350 | #endif | 
 | 4351 | #ifdef	IPV6_LEAVE_GROUP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4352 | 	PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4353 | #endif | 
 | 4354 | #ifdef	IPV6_MULTICAST_HOPS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4355 | 	PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4356 | #endif | 
 | 4357 | #ifdef	IPV6_MULTICAST_IF | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4358 | 	PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4359 | #endif | 
 | 4360 | #ifdef	IPV6_MULTICAST_LOOP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4361 | 	PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4362 | #endif | 
 | 4363 | #ifdef	IPV6_UNICAST_HOPS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4364 | 	PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS); | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4365 | #endif | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 4366 |         /* Additional IPV6 socket options, defined in RFC 3493 */ | 
 | 4367 | #ifdef IPV6_V6ONLY | 
 | 4368 | 	PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY); | 
 | 4369 | #endif | 
 | 4370 | 	/* Advanced IPV6 socket options, from RFC 3542 */ | 
 | 4371 | #ifdef IPV6_CHECKSUM | 
 | 4372 | 	PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM); | 
 | 4373 | #endif | 
 | 4374 | #ifdef IPV6_DONTFRAG | 
 | 4375 | 	PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG); | 
 | 4376 | #endif | 
 | 4377 | #ifdef IPV6_DSTOPTS | 
 | 4378 | 	PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS); | 
 | 4379 | #endif | 
 | 4380 | #ifdef IPV6_HOPLIMIT | 
 | 4381 | 	PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT); | 
 | 4382 | #endif | 
 | 4383 | #ifdef IPV6_HOPOPTS | 
 | 4384 | 	PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS); | 
 | 4385 | #endif | 
 | 4386 | #ifdef IPV6_NEXTHOP | 
 | 4387 | 	PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP); | 
 | 4388 | #endif | 
 | 4389 | #ifdef IPV6_PATHMTU | 
 | 4390 | 	PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU); | 
 | 4391 | #endif | 
 | 4392 | #ifdef IPV6_PKTINFO | 
 | 4393 | 	PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO); | 
 | 4394 | #endif | 
 | 4395 | #ifdef IPV6_RECVDSTOPTS | 
 | 4396 | 	PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS); | 
 | 4397 | #endif | 
 | 4398 | #ifdef IPV6_RECVHOPLIMIT | 
 | 4399 | 	PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT); | 
 | 4400 | #endif | 
 | 4401 | #ifdef IPV6_RECVHOPOPTS | 
 | 4402 | 	PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS); | 
 | 4403 | #endif | 
 | 4404 | #ifdef IPV6_RECVPKTINFO | 
 | 4405 | 	PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO); | 
 | 4406 | #endif | 
 | 4407 | #ifdef IPV6_RECVRTHDR | 
 | 4408 | 	PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR); | 
 | 4409 | #endif | 
 | 4410 | #ifdef IPV6_RECVTCLASS | 
 | 4411 | 	PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS); | 
 | 4412 | #endif | 
 | 4413 | #ifdef IPV6_RTHDR | 
 | 4414 | 	PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR); | 
 | 4415 | #endif | 
 | 4416 | #ifdef IPV6_RTHDRDSTOPTS | 
 | 4417 | 	PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS); | 
 | 4418 | #endif | 
 | 4419 | #ifdef IPV6_RTHDR_TYPE_0 | 
 | 4420 | 	PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0); | 
 | 4421 | #endif | 
 | 4422 | #ifdef IPV6_RECVPATHMTU | 
 | 4423 | 	PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU); | 
 | 4424 | #endif | 
 | 4425 | #ifdef IPV6_TCLASS | 
 | 4426 | 	PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS); | 
 | 4427 | #endif | 
 | 4428 | #ifdef IPV6_USE_MIN_MTU | 
 | 4429 | 	PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU); | 
 | 4430 | #endif | 
| Martin v. Löwis | bcf4b35 | 2001-08-04 22:37:23 +0000 | [diff] [blame] | 4431 |  | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4432 | 	/* TCP options */ | 
 | 4433 | #ifdef	TCP_NODELAY | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4434 | 	PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4435 | #endif | 
 | 4436 | #ifdef	TCP_MAXSEG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4437 | 	PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4438 | #endif | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4439 | #ifdef	TCP_CORK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4440 | 	PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4441 | #endif | 
 | 4442 | #ifdef	TCP_KEEPIDLE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4443 | 	PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4444 | #endif | 
 | 4445 | #ifdef	TCP_KEEPINTVL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4446 | 	PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4447 | #endif | 
 | 4448 | #ifdef	TCP_KEEPCNT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4449 | 	PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4450 | #endif | 
 | 4451 | #ifdef	TCP_SYNCNT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4452 | 	PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4453 | #endif | 
 | 4454 | #ifdef	TCP_LINGER2 | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4455 | 	PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4456 | #endif | 
 | 4457 | #ifdef	TCP_DEFER_ACCEPT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4458 | 	PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4459 | #endif | 
 | 4460 | #ifdef	TCP_WINDOW_CLAMP | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4461 | 	PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4462 | #endif | 
 | 4463 | #ifdef	TCP_INFO | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4464 | 	PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4465 | #endif | 
 | 4466 | #ifdef	TCP_QUICKACK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4467 | 	PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK); | 
| Martin v. Löwis | 3cde2cb | 2001-12-22 15:05:32 +0000 | [diff] [blame] | 4468 | #endif | 
 | 4469 |  | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4470 |  | 
 | 4471 | 	/* IPX options */ | 
 | 4472 | #ifdef	IPX_TYPE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4473 | 	PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE); | 
| Guido van Rossum | 09be409 | 1999-08-09 14:40:40 +0000 | [diff] [blame] | 4474 | #endif | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 4475 |  | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4476 | 	/* get{addr,name}info parameters */ | 
 | 4477 | #ifdef EAI_ADDRFAMILY | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4478 | 	PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4479 | #endif | 
 | 4480 | #ifdef EAI_AGAIN | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4481 | 	PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4482 | #endif | 
 | 4483 | #ifdef EAI_BADFLAGS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4484 | 	PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4485 | #endif | 
 | 4486 | #ifdef EAI_FAIL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4487 | 	PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4488 | #endif | 
 | 4489 | #ifdef EAI_FAMILY | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4490 | 	PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4491 | #endif | 
 | 4492 | #ifdef EAI_MEMORY | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4493 | 	PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4494 | #endif | 
 | 4495 | #ifdef EAI_NODATA | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4496 | 	PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4497 | #endif | 
 | 4498 | #ifdef EAI_NONAME | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4499 | 	PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4500 | #endif | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 4501 | #ifdef EAI_OVERFLOW | 
 | 4502 | 	PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW); | 
 | 4503 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4504 | #ifdef EAI_SERVICE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4505 | 	PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4506 | #endif | 
 | 4507 | #ifdef EAI_SOCKTYPE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4508 | 	PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4509 | #endif | 
 | 4510 | #ifdef EAI_SYSTEM | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4511 | 	PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4512 | #endif | 
 | 4513 | #ifdef EAI_BADHINTS | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4514 | 	PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4515 | #endif | 
 | 4516 | #ifdef EAI_PROTOCOL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4517 | 	PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4518 | #endif | 
 | 4519 | #ifdef EAI_MAX | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4520 | 	PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4521 | #endif | 
 | 4522 | #ifdef AI_PASSIVE | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4523 | 	PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4524 | #endif | 
 | 4525 | #ifdef AI_CANONNAME | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4526 | 	PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4527 | #endif | 
 | 4528 | #ifdef AI_NUMERICHOST | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4529 | 	PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4530 | #endif | 
| Martin v. Löwis | da91d02 | 2003-12-30 11:14:01 +0000 | [diff] [blame] | 4531 | #ifdef AI_NUMERICSERV | 
 | 4532 | 	PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV); | 
 | 4533 | #endif | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4534 | #ifdef AI_MASK | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4535 | 	PyModule_AddIntConstant(m, "AI_MASK", AI_MASK); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4536 | #endif | 
 | 4537 | #ifdef AI_ALL | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4538 | 	PyModule_AddIntConstant(m, "AI_ALL", AI_ALL); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4539 | #endif | 
 | 4540 | #ifdef AI_V4MAPPED_CFG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4541 | 	PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4542 | #endif | 
 | 4543 | #ifdef AI_ADDRCONFIG | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4544 | 	PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4545 | #endif | 
 | 4546 | #ifdef AI_V4MAPPED | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4547 | 	PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4548 | #endif | 
 | 4549 | #ifdef AI_DEFAULT | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4550 | 	PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4551 | #endif | 
 | 4552 | #ifdef NI_MAXHOST | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4553 | 	PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4554 | #endif | 
 | 4555 | #ifdef NI_MAXSERV | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4556 | 	PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4557 | #endif | 
 | 4558 | #ifdef NI_NOFQDN | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4559 | 	PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4560 | #endif | 
 | 4561 | #ifdef NI_NUMERICHOST | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4562 | 	PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4563 | #endif | 
 | 4564 | #ifdef NI_NAMEREQD | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4565 | 	PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4566 | #endif | 
 | 4567 | #ifdef NI_NUMERICSERV | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4568 | 	PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4569 | #endif | 
 | 4570 | #ifdef NI_DGRAM | 
| Fred Drake | 4baedc1 | 2002-04-01 14:53:37 +0000 | [diff] [blame] | 4571 | 	PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM); | 
| Martin v. Löwis | 2d8d427 | 2001-07-21 18:05:31 +0000 | [diff] [blame] | 4572 | #endif | 
 | 4573 |  | 
| Martin v. Löwis | 94681fc | 2003-11-27 19:40:22 +0000 | [diff] [blame] | 4574 | 	/* shutdown() parameters */ | 
 | 4575 | #ifdef SHUT_RD | 
 | 4576 | 	PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD); | 
 | 4577 | #elif defined(SD_RECEIVE) | 
 | 4578 | 	PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE); | 
 | 4579 | #else | 
 | 4580 | 	PyModule_AddIntConstant(m, "SHUT_RD", 0); | 
 | 4581 | #endif | 
 | 4582 | #ifdef SHUT_WR | 
 | 4583 | 	PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR); | 
 | 4584 | #elif defined(SD_SEND) | 
 | 4585 | 	PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND); | 
 | 4586 | #else | 
 | 4587 | 	PyModule_AddIntConstant(m, "SHUT_WR", 1); | 
 | 4588 | #endif | 
 | 4589 | #ifdef SHUT_RDWR | 
 | 4590 | 	PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR); | 
 | 4591 | #elif defined(SD_BOTH) | 
 | 4592 | 	PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH); | 
 | 4593 | #else | 
 | 4594 | 	PyModule_AddIntConstant(m, "SHUT_RDWR", 2); | 
 | 4595 | #endif | 
 | 4596 |  | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 4597 | 	/* Initialize gethostbyname lock */ | 
| Just van Rossum | 1040d2c | 2003-05-09 07:53:18 +0000 | [diff] [blame] | 4598 | #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) | 
 | 4599 | 	netdb_lock = PyThread_allocate_lock(); | 
| Guido van Rossum | 4f199ea | 1998-04-09 20:56:35 +0000 | [diff] [blame] | 4600 | #endif | 
| Guido van Rossum | 6574b3e | 1991-06-25 21:36:08 +0000 | [diff] [blame] | 4601 | } | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4602 |  | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4603 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4604 | #ifndef HAVE_INET_PTON | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4605 |  | 
 | 4606 | /* Simplistic emulation code for inet_pton that only works for IPv4 */ | 
| Guido van Rossum | 47dfa4a | 2003-04-25 05:48:32 +0000 | [diff] [blame] | 4607 | /* These are not exposed because they do not set errno properly */ | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4608 |  | 
| Guido van Rossum | 3eede5a | 2002-06-07 02:08:35 +0000 | [diff] [blame] | 4609 | int | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4610 | inet_pton(int af, const char *src, void *dst) | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4611 | { | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4612 | 	if (af == AF_INET) { | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4613 | 		long packed_addr; | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4614 | 		packed_addr = inet_addr(src); | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4615 | 		if (packed_addr == INADDR_NONE) | 
 | 4616 | 			return 0; | 
 | 4617 | 		memcpy(dst, &packed_addr, 4); | 
 | 4618 | 		return 1; | 
 | 4619 | 	} | 
 | 4620 | 	/* Should set errno to EAFNOSUPPORT */ | 
 | 4621 | 	return -1; | 
 | 4622 | } | 
 | 4623 |  | 
| Martin v. Löwis | c925b153 | 2001-07-21 09:42:15 +0000 | [diff] [blame] | 4624 | const char * | 
 | 4625 | 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] | 4626 | { | 
 | 4627 | 	if (af == AF_INET) { | 
 | 4628 | 		struct in_addr packed_addr; | 
 | 4629 | 		if (size < 16) | 
 | 4630 | 			/* Should set errno to ENOSPC. */ | 
 | 4631 | 			return NULL; | 
 | 4632 | 		memcpy(&packed_addr, src, sizeof(packed_addr)); | 
 | 4633 | 		return strncpy(dst, inet_ntoa(packed_addr), size); | 
 | 4634 | 	} | 
 | 4635 | 	/* Should set errno to EAFNOSUPPORT */ | 
 | 4636 | 	return NULL; | 
 | 4637 | } | 
| Guido van Rossum | c4fcfa3 | 2002-06-07 03:19:37 +0000 | [diff] [blame] | 4638 |  | 
| Martin v. Löwis | b9ab159 | 2001-06-24 21:18:26 +0000 | [diff] [blame] | 4639 | #endif |