blob: e4f6e636f796ad663409b10b8edee9ae3233d683 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimesfb2d25a2008-01-07 16:12:44 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Guido van Rossum27e177d1995-03-16 15:43:47 +000018- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000022 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000023- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
Antoine Pitrouc83ea132010-05-09 14:46:46 +000024 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000025- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000026- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000027- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000028- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000029- socket.getservbyname(servicename[, protocolname]) --> port number
30- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000031- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000032- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000037- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouc83ea132010-05-09 14:46:46 +000038 --> List of (family, socktype, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000039- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000041- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000042- socket.inet_aton(IP address) -> 32-bit packed IP representation
43- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000044- socket.getdefaulttimeout() -> None | float
45- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000051- an AF_PACKET socket address is a tuple containing a string
52 specifying the ethernet interface and an integer specifying
53 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000054 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000055 specify packet-type and ha-type/addr.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000056- an AF_TIPC socket address is expressed as
57 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000058 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimesfb2d25a2008-01-07 16:12:44 +000059 and scope can be one of:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimesfb2d25a2008-01-07 16:12:44 +000061 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 if addr_type is TIPC_ADDR_NAME:
63 v1 is the server type
64 v2 is the port identifier
65 v3 is ignored
66 if addr_type is TIPC_ADDR_NAMESEQ:
67 v1 is the server type
68 v2 is the lower port number
69 v3 is the upper port number
70 if addr_type is TIPC_ADDR_ID:
71 v1 is the node
72 v2 is the ref
73 v3 is ignored
Christian Heimesfb2d25a2008-01-07 16:12:44 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000076Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078- names starting with sock_ are socket object methods
79- names starting with socket_ are module-level functions
80- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000081
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082*/
83
Ronald Oussorend06b6f22006-04-23 11:59:25 +000084#ifdef __APPLE__
85 /*
86 * inet_aton is not available on OSX 10.3, yet we want to use a binary
87 * that was build on 10.4 or later to work on that release, weak linking
88 * comes to the rescue.
89 */
90# pragma weak inet_aton
91#endif
92
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000093#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000094#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000096#undef MAX
97#define MAX(x, y) ((x) < (y) ? (y) : (x))
98
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000099/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101"socket([family[, type[, proto]]]) -> socket object\n\
102\n\
103Open a socket of the given type. The family argument specifies the\n\
104address family; it defaults to AF_INET. The type argument specifies\n\
105whether this is a stream (SOCK_STREAM, this is the default)\n\
106or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
107specifying the default protocol. Keyword arguments are accepted.\n\
108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
113accept() -- accept a connection, returning new socket and client address\n\
114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
118dup() -- return a new socket object identical to the current one [*]\n\
119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
124listen(n) -- start listening for incoming connections\n\
125makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
126recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000127recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000128recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000129recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000130 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000131sendall(data[, flags]) -- send all data\n\
132send(data[, flags]) -- send data, may not send all of it\n\
133sendto(data[, flags], addr) -- send data to a given address\n\
134setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
135setsockopt(level, optname, value) -- set socket options\n\
136settimeout(None | float) -- set or clear the timeout\n\
137shutdown(how) -- shut down traffic in one or both directions\n\
138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000140
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000141/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000142 I hope some day someone can clean this up please... */
143
Guido van Rossum9376b741999-09-15 22:01:40 +0000144/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
145 script doesn't get this right, so we hardcode some platform checks below.
146 On the other hand, not all Linux versions agree, so there the settings
147 computed by the configure script are needed! */
148
149#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150# undef HAVE_GETHOSTBYNAME_R_3_ARG
151# undef HAVE_GETHOSTBYNAME_R_5_ARG
152# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000153#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000154
Guido van Rossum7a122991999-04-13 04:07:32 +0000155#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000157#endif
158
Guido van Rossume7de2061999-03-24 17:24:33 +0000159#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# if defined(_AIX) || defined(__osf__)
161# define HAVE_GETHOSTBYNAME_R_3_ARG
162# elif defined(__sun) || defined(__sgi)
163# define HAVE_GETHOSTBYNAME_R_5_ARG
164# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000165/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# else
167# undef HAVE_GETHOSTBYNAME_R
168# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000169#endif
170
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000171#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
172 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000174#endif
175
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000176/* To use __FreeBSD_version */
177#ifdef HAVE_SYS_PARAM_H
178#include <sys/param.h>
179#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000180/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000181 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182#if defined(WITH_THREAD) && (defined(__APPLE__) || \
183 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000184 defined(__OpenBSD__) || defined(__NetBSD__) || \
185 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186#define USE_GETADDRINFO_LOCK
187#endif
188
189#ifdef USE_GETADDRINFO_LOCK
190#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
191#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
192#else
193#define ACQUIRE_GETADDRINFO_LOCK
194#define RELEASE_GETADDRINFO_LOCK
195#endif
196
197#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000198# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000199#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000200
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000201#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202# include <types.h>
203# include <io.h>
204# include <sys/ioctl.h>
205# include <utils.h>
206# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#endif
208
Martin v. Löwis9e437302002-12-06 12:57:26 +0000209#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000210# include <ioctl.h>
211#endif
212
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000214# define INCL_DOS
215# define INCL_DOSERRORS
216# define INCL_NOPMAPI
217# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000218#endif
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Martin Blais2856e5f2006-05-26 12:03:27 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Martin Blais2856e5f2006-05-26 12:03:27 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000255/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000257#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258
259/* Addressing includes */
260
Guido van Rossum6f489d91996-06-28 20:15:15 +0000261#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
263/* Non-MS WINDOWS includes */
264# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000265
Guido van Rossum9376b741999-09-15 22:01:40 +0000266/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267# ifdef __BEOS__
268# include <net/netdb.h>
269# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
270# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000271typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# ifndef RISCOS
277# include <fcntl.h>
278# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000279# include <sys/ioctl.h>
280# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000281# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000282int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000283# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284# endif
285
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000286#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000287
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000289# ifdef HAVE_FCNTL_H
290# include <fcntl.h>
291# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000292
Jeremy Hylton22308652001-02-02 03:23:09 +0000293#endif
294
Skip Montanaro7befb992004-02-10 16:50:21 +0000295#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000296
297#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000298# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000299#endif
300
Neal Norwitz39d22e52002-11-02 19:55:21 +0000301#ifndef O_NONBLOCK
302# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303#endif
304
Trent Micka708d6e2004-09-07 17:48:26 +0000305/* include Python's addrinfo.h unless it causes trouble */
306#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
307 /* Do not include addinfo.h on some newer IRIX versions.
308 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
309 * for example, but not by 6.5.10.
310 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000311#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000312 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
313 * EAI_* constants are defined in (the already included) ws2tcpip.h.
314 */
315#else
316# include "addrinfo.h"
317#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000318
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000319#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000320#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000321int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000322const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000323#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000324#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000325
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000326#ifdef __APPLE__
327/* On OS X, getaddrinfo returns no error indication of lookup
328 failure, so we must use the emulation instead of the libinfo
329 implementation. Unfortunately, performing an autoconf test
330 for this bug would require DNS access for the machine performing
331 the configuration, which is not acceptable. Therefore, we
332 determine the bug just by checking for __APPLE__. If this bug
333 gets ever fixed, perhaps checking for sys/version.h would be
334 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000335#ifndef HAVE_GETNAMEINFO
336/* This bug seems to be fixed in Jaguar. Ths easiest way I could
337 Find to check for Jaguar is that it has getnameinfo(), which
338 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000341
342#ifdef HAVE_INET_ATON
343#define USE_INET_ATON_WEAKLINK
344#endif
345
Jack Jansen84262fb2002-07-02 14:40:42 +0000346#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000350/* avoid clashes with the C library definition of the symbol. */
351#define getaddrinfo fake_getaddrinfo
352#define gai_strerror fake_gai_strerror
353#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000354#include "getaddrinfo.c"
355#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000357#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000358#include "getnameinfo.c"
359#endif
360
Guido van Rossumbcc20741998-08-04 22:53:56 +0000361#if defined(MS_WINDOWS) || defined(__BEOS__)
362/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000363/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000364#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000365#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000366#endif
367
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000368#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000369#define EAFNOSUPPORT WSAEAFNOSUPPORT
370#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000371#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000372
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000373#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000374#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000375#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000376#endif
377
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000378#ifndef SOCKETCLOSE
379#define SOCKETCLOSE close
380#endif
381
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000382#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000383#define USE_BLUETOOTH 1
384#if defined(__FreeBSD__)
385#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
386#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000387#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000388#define SOL_HCI SOL_HCI_RAW
389#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#define sockaddr_l2 sockaddr_l2cap
391#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000392#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000393#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
394#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000395#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000396#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000397#define sockaddr_l2 sockaddr_bt
398#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000399#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000400#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000401#define SOL_HCI BTPROTO_HCI
402#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000403#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
404#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000405#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000406#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000407#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
409#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000410#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000411#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
412#endif
413#endif
414
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000415#ifdef __VMS
416/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
417#define SEGMENT_SIZE (32 * 1024 -1)
418#endif
419
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000420#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000421
Martin v. Löwise9416172003-05-03 10:12:45 +0000422/*
423 * Constants for getnameinfo()
424 */
425#if !defined(NI_MAXHOST)
426#define NI_MAXHOST 1025
427#endif
428#if !defined(NI_MAXSERV)
429#define NI_MAXSERV 32
430#endif
431
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000432/* XXX There's a problem here: *static* functions are not supposed to have
433 a Py prefix (or use CapitalizedWords). Later... */
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435/* Global variable holding the exception type for errors detected
436 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000437static PyObject *socket_error;
438static PyObject *socket_herror;
439static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000440static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441
Guido van Rossum48a680c2001-03-02 06:34:14 +0000442#ifdef RISCOS
443/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
444static int taskwindow;
445#endif
446
Tim Peters643a7fc2002-02-17 04:13:21 +0000447/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000448 The sock_type variable contains pointers to various functions,
449 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000450 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000451static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000452
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000453#if defined(HAVE_POLL_H)
454#include <poll.h>
455#elif defined(HAVE_SYS_POLL_H)
456#include <sys/poll.h>
457#endif
458
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000459#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
460/* Platform can select file descriptors beyond FD_SETSIZE */
461#define IS_SELECTABLE(s) 1
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000462#elif defined(HAVE_POLL)
463/* Instead of select(), we'll use poll() since poll() works on any fd. */
464#define IS_SELECTABLE(s) 1
465/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000466#else
467/* POSIX says selecting file descriptors beyond FD_SETSIZE
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000468 has undefined behaviour. If there's no timeout left, we don't have to
469 call select, so it's a safe, little white lie. */
470#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000471#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000472
473static PyObject*
474select_error(void)
475{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000476 PyErr_SetString(socket_error, "unable to select on socket");
477 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000478}
479
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480/* Convenience function to raise an error according to errno
481 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000482
Guido van Rossum73624e91994-10-10 17:59:00 +0000483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000484set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000486#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000487 int err_no = WSAGetLastError();
488 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
489 recognizes the error codes used by both GetLastError() and
490 WSAGetLastError */
491 if (err_no)
492 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000493#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000494
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000495#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000496 if (sock_errno() != NO_ERROR) {
497 APIRET rc;
498 ULONG msglen;
499 char outbuf[100];
500 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000501
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000502 /* Retrieve socket-related error message from MPTN.MSG file */
503 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
504 myerrorcode - SOCBASEERR + 26,
505 "mptn.msg",
506 &msglen);
507 if (rc == NO_ERROR) {
508 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000509
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000510 /* OS/2 doesn't guarantee a terminator */
511 outbuf[msglen] = '\0';
512 if (strlen(outbuf) > 0) {
513 /* If non-empty msg, trim CRLF */
514 char *lastc = &outbuf[ strlen(outbuf)-1 ];
515 while (lastc > outbuf &&
516 isspace(Py_CHARMASK(*lastc))) {
517 /* Trim trailing whitespace (CRLF) */
518 *lastc-- = '\0';
519 }
520 }
521 v = Py_BuildValue("(is)", myerrorcode, outbuf);
522 if (v != NULL) {
523 PyErr_SetObject(socket_error, v);
524 Py_DECREF(v);
525 }
526 return NULL;
527 }
528 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000529#endif
530
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000531#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 if (_inet_error.errnum != NULL) {
533 PyObject *v;
534 v = Py_BuildValue("(is)", errno, _inet_err());
535 if (v != NULL) {
536 PyErr_SetObject(socket_error, v);
537 Py_DECREF(v);
538 }
539 return NULL;
540 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000541#endif
542
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544}
545
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000548set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000550 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
552#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000555 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000557 if (v != NULL) {
558 PyErr_SetObject(socket_herror, v);
559 Py_DECREF(v);
560 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563}
564
565
566static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000567set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570
Martin v. Löwis272cb402002-03-01 08:31:07 +0000571#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000572 /* EAI_SYSTEM is not available on Windows XP. */
573 if (error == EAI_SYSTEM)
574 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000575#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000578 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000579#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000581#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000582 if (v != NULL) {
583 PyErr_SetObject(socket_gaierror, v);
584 Py_DECREF(v);
585 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588}
589
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000590#ifdef __VMS
591/* Function to send in segments */
592static int
593sendsegmented(int sock_fd, char *buf, int len, int flags)
594{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 int n = 0;
596 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000597
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000598 while (remaining > 0) {
599 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000600
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000601 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
602 n = send(sock_fd, buf, segment, flags);
603 if (n < 0) {
604 return n;
605 }
606 remaining -= segment;
607 buf += segment;
608 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000609
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000610 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000611}
612#endif
613
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000614/* Function to perform the setting of socket blocking mode
615 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616static int
617internal_setblocking(PySocketSockObject *s, int block)
618{
619#ifndef RISCOS
620#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000621 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622#endif
623#endif
624
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000625 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 block = !block;
628 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
629 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630#else
631#ifndef RISCOS
632#ifndef MS_WINDOWS
633#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 block = !block;
635 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000636#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 block = !block;
638 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000639#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000640 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
641 if (block)
642 delay_flag &= (~O_NONBLOCK);
643 else
644 delay_flag |= O_NONBLOCK;
645 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000646#endif /* !PYOS_OS2 */
647#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000648 block = !block;
649 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000651#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000652 block = !block;
653 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000655#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000658 /* Since these don't return anything */
659 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660}
661
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000662/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000663 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000664 This does not raise an exception; we'll let our caller do that
665 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000666 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000667static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000668internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000670 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000671
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000672 /* Nothing to do unless we're in timeout mode (not non-blocking) */
673 if (s->sock_timeout <= 0.0)
674 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000676 /* Guard against closed socket */
677 if (s->sock_fd < 0)
678 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000679
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 /* Prefer poll, if available, since you can poll() any fd
681 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000682#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 {
684 struct pollfd pollfd;
685 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000687 pollfd.fd = s->sock_fd;
688 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000689
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000690 /* s->sock_timeout is in seconds, timeout in ms */
691 timeout = (int)(s->sock_timeout * 1000 + 0.5);
692 n = poll(&pollfd, 1, timeout);
693 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000694#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000695 {
696 /* Construct the arguments to select */
697 fd_set fds;
698 struct timeval tv;
699 tv.tv_sec = (int)s->sock_timeout;
700 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
701 FD_ZERO(&fds);
702 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000703
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 /* See if the socket is ready */
705 if (writing)
706 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
707 else
708 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
709 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000710#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000711
712 if (n < 0)
713 return -1;
714 if (n == 0)
715 return 1;
716 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000717}
718
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000719/* Initialize a new socket object. */
720
Tim Petersa12b4cf2002-07-18 22:38:44 +0000721static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000722
Mark Hammond62b1ab12002-07-23 06:31:15 +0000723PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000724init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000725 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000726{
727#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000729#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000730 s->sock_fd = fd;
731 s->sock_family = family;
732 s->sock_type = type;
733 s->sock_proto = proto;
734 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000735
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000736 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000737
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 if (defaulttimeout >= 0.0)
739 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000740
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000741#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000742 if (taskwindow)
743 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000744#endif
745}
746
747
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748/* Create a new socket object.
749 This just creates the object and initializes it.
750 If the creation fails, return NULL and set an exception (implicit
751 in NEWOBJ()). */
752
Guido van Rossum73624e91994-10-10 17:59:00 +0000753static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000754new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000755{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000756 PySocketSockObject *s;
757 s = (PySocketSockObject *)
758 PyType_GenericNew(&sock_type, NULL, NULL);
759 if (s != NULL)
760 init_sockobject(s, fd, family, type, proto);
761 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762}
763
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764
Guido van Rossum48a680c2001-03-02 06:34:14 +0000765/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000766 thread to be in gethostbyname or getaddrinfo */
767#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
768PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000769#endif
770
771
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772/* Convert a string specifying a host name or one of a few symbolic
773 names to a numeric IP address. This usually calls gethostbyname()
774 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000775 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 an error occurred; then an exception is raised. */
777
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000779setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000781 struct addrinfo hints, *res;
782 int error;
783 int d1, d2, d3, d4;
784 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000786 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
787 if (name[0] == '\0') {
788 int siz;
789 memset(&hints, 0, sizeof(hints));
790 hints.ai_family = af;
791 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
792 hints.ai_flags = AI_PASSIVE;
793 Py_BEGIN_ALLOW_THREADS
794 ACQUIRE_GETADDRINFO_LOCK
795 error = getaddrinfo(NULL, "0", &hints, &res);
796 Py_END_ALLOW_THREADS
797 /* We assume that those thread-unsafe getaddrinfo() versions
798 *are* safe regarding their return value, ie. that a
799 subsequent call to getaddrinfo() does not destroy the
800 outcome of the first call. */
801 RELEASE_GETADDRINFO_LOCK
802 if (error) {
803 set_gaierror(error);
804 return -1;
805 }
806 switch (res->ai_family) {
807 case AF_INET:
808 siz = 4;
809 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000810#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 case AF_INET6:
812 siz = 16;
813 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000814#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000815 default:
816 freeaddrinfo(res);
817 PyErr_SetString(socket_error,
818 "unsupported address family");
819 return -1;
820 }
821 if (res->ai_next) {
822 freeaddrinfo(res);
823 PyErr_SetString(socket_error,
824 "wildcard resolved to multiple address");
825 return -1;
826 }
827 if (res->ai_addrlen < addr_ret_size)
828 addr_ret_size = res->ai_addrlen;
829 memcpy(addr_ret, res->ai_addr, addr_ret_size);
830 freeaddrinfo(res);
831 return siz;
832 }
833 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
834 struct sockaddr_in *sin;
835 if (af != AF_INET && af != AF_UNSPEC) {
836 PyErr_SetString(socket_error,
837 "address family mismatched");
838 return -1;
839 }
840 sin = (struct sockaddr_in *)addr_ret;
841 memset((void *) sin, '\0', sizeof(*sin));
842 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000845#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000846 sin->sin_addr.s_addr = INADDR_BROADCAST;
847 return sizeof(sin->sin_addr);
848 }
849 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
850 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
851 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
852 struct sockaddr_in *sin;
853 sin = (struct sockaddr_in *)addr_ret;
854 sin->sin_addr.s_addr = htonl(
855 ((long) d1 << 24) | ((long) d2 << 16) |
856 ((long) d3 << 8) | ((long) d4 << 0));
857 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000858#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000859 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000860#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000861 return 4;
862 }
863 memset(&hints, 0, sizeof(hints));
864 hints.ai_family = af;
865 Py_BEGIN_ALLOW_THREADS
866 ACQUIRE_GETADDRINFO_LOCK
867 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000868#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000869 if (error == EAI_NONAME && af == AF_UNSPEC) {
870 /* On Tru64 V5.1, numeric-to-addr conversion fails
871 if no address family is given. Assume IPv4 for now.*/
872 hints.ai_family = AF_INET;
873 error = getaddrinfo(name, NULL, &hints, &res);
874 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000875#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000876 Py_END_ALLOW_THREADS
877 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
878 if (error) {
879 set_gaierror(error);
880 return -1;
881 }
882 if (res->ai_addrlen < addr_ret_size)
883 addr_ret_size = res->ai_addrlen;
884 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
885 freeaddrinfo(res);
886 switch (addr_ret->sa_family) {
887 case AF_INET:
888 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000889#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000890 case AF_INET6:
891 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000892#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000893 default:
894 PyErr_SetString(socket_error, "unknown address family");
895 return -1;
896 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897}
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Create a string object representing an IP address.
901 This is always a string of the form 'dd.dd.dd.dd' (with variable
902 size numbers). */
903
Guido van Rossum73624e91994-10-10 17:59:00 +0000904static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000905makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000907 char buf[NI_MAXHOST];
908 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000909
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000910 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
911 NI_NUMERICHOST);
912 if (error) {
913 set_gaierror(error);
914 return NULL;
915 }
916 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917}
918
919
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000920#ifdef USE_BLUETOOTH
921/* Convert a string representation of a Bluetooth address into a numeric
922 address. Returns the length (6), or raises an exception and returns -1 if
923 an error occurred. */
924
925static int
926setbdaddr(char *name, bdaddr_t *bdaddr)
927{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 unsigned int b0, b1, b2, b3, b4, b5;
929 char ch;
930 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000931
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000932 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
933 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
934 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
935 bdaddr->b[0] = b0;
936 bdaddr->b[1] = b1;
937 bdaddr->b[2] = b2;
938 bdaddr->b[3] = b3;
939 bdaddr->b[4] = b4;
940 bdaddr->b[5] = b5;
941 return 6;
942 } else {
943 PyErr_SetString(socket_error, "bad bluetooth address");
944 return -1;
945 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000946}
947
948/* Create a string representation of the Bluetooth address. This is always a
949 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
950 value (zero padded if necessary). */
951
952static PyObject *
953makebdaddr(bdaddr_t *bdaddr)
954{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000955 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000956
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000957 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
958 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
959 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
960 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000961}
962#endif
963
964
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965/* Create an object representing the given socket address,
966 suitable for passing it back to bind(), connect() etc.
967 The family field of the sockaddr structure is inspected
968 to determine what kind of address it really is. */
969
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000971static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000972makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000974 if (addrlen == 0) {
975 /* No address -- may be recvfrom() from known socket */
976 Py_INCREF(Py_None);
977 return Py_None;
978 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000979
Guido van Rossumbcc20741998-08-04 22:53:56 +0000980#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000981 /* XXX: BeOS version of accept() doesn't set family correctly */
982 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000983#endif
984
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000985 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 case AF_INET:
988 {
989 struct sockaddr_in *a;
990 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
991 PyObject *ret = NULL;
992 if (addrobj) {
993 a = (struct sockaddr_in *)addr;
994 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
995 Py_DECREF(addrobj);
996 }
997 return ret;
998 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001000#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001001 case AF_UNIX:
1002 {
1003 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001004#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001005 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1006 addrlen -= offsetof(struct sockaddr_un, sun_path);
1007 return PyString_FromStringAndSize(a->sun_path,
1008 addrlen);
1009 }
1010 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001011#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001012 {
1013 /* regular NULL-terminated string */
1014 return PyString_FromString(a->sun_path);
1015 }
1016 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001017#endif /* AF_UNIX */
1018
Martin v. Löwis11017b12006-01-14 18:12:57 +00001019#if defined(AF_NETLINK)
1020 case AF_NETLINK:
1021 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001022 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1023 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001024 }
1025#endif /* AF_NETLINK */
1026
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001027#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001028 case AF_INET6:
1029 {
1030 struct sockaddr_in6 *a;
1031 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1032 PyObject *ret = NULL;
1033 if (addrobj) {
1034 a = (struct sockaddr_in6 *)addr;
1035 ret = Py_BuildValue("Oiii",
1036 addrobj,
1037 ntohs(a->sin6_port),
1038 a->sin6_flowinfo,
1039 a->sin6_scope_id);
1040 Py_DECREF(addrobj);
1041 }
1042 return ret;
1043 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001044#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001045
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001046#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 case AF_BLUETOOTH:
1048 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001049
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 case BTPROTO_L2CAP:
1051 {
1052 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1053 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1054 PyObject *ret = NULL;
1055 if (addrobj) {
1056 ret = Py_BuildValue("Oi",
1057 addrobj,
1058 _BT_L2_MEMB(a, psm));
1059 Py_DECREF(addrobj);
1060 }
1061 return ret;
1062 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001063
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001064 case BTPROTO_RFCOMM:
1065 {
1066 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1067 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1068 PyObject *ret = NULL;
1069 if (addrobj) {
1070 ret = Py_BuildValue("Oi",
1071 addrobj,
1072 _BT_RC_MEMB(a, channel));
1073 Py_DECREF(addrobj);
1074 }
1075 return ret;
1076 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001078 case BTPROTO_HCI:
1079 {
1080 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001081#if defined(__NetBSD__) || defined(__DragonFly__)
1082 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1083#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001084 PyObject *ret = NULL;
1085 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1086 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001088 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001089
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001090#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001091 case BTPROTO_SCO:
1092 {
1093 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1094 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1095 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001096#endif
1097
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001098 default:
1099 PyErr_SetString(PyExc_ValueError,
1100 "Unknown Bluetooth protocol");
1101 return NULL;
1102 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103#endif
1104
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001105#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001106 case AF_PACKET:
1107 {
1108 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1109 char *ifname = "";
1110 struct ifreq ifr;
1111 /* need to look up interface name give index */
1112 if (a->sll_ifindex) {
1113 ifr.ifr_ifindex = a->sll_ifindex;
1114 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1115 ifname = ifr.ifr_name;
1116 }
1117 return Py_BuildValue("shbhs#",
1118 ifname,
1119 ntohs(a->sll_protocol),
1120 a->sll_pkttype,
1121 a->sll_hatype,
1122 a->sll_addr,
1123 a->sll_halen);
1124 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001125#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001126
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001127#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001128 case AF_TIPC:
1129 {
1130 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1131 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1132 return Py_BuildValue("IIIII",
1133 a->addrtype,
1134 a->addr.nameseq.type,
1135 a->addr.nameseq.lower,
1136 a->addr.nameseq.upper,
1137 a->scope);
1138 } else if (a->addrtype == TIPC_ADDR_NAME) {
1139 return Py_BuildValue("IIIII",
1140 a->addrtype,
1141 a->addr.name.name.type,
1142 a->addr.name.name.instance,
1143 a->addr.name.name.instance,
1144 a->scope);
1145 } else if (a->addrtype == TIPC_ADDR_ID) {
1146 return Py_BuildValue("IIIII",
1147 a->addrtype,
1148 a->addr.id.node,
1149 a->addr.id.ref,
1150 0,
1151 a->scope);
1152 } else {
1153 PyErr_SetString(PyExc_ValueError,
1154 "Invalid address type");
1155 return NULL;
1156 }
1157 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001158#endif
1159
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001160 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001162 default:
1163 /* If we don't know the address family, don't raise an
1164 exception -- return it as a tuple. */
1165 return Py_BuildValue("is#",
1166 addr->sa_family,
1167 addr->sa_data,
1168 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001169
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001170 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171}
1172
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173
1174/* Parse a socket address argument according to the socket object's
1175 address family. Return 1 if the address was in the proper format,
1176 0 of not. The address is returned through addr_ret, its length
1177 through len_ret. */
1178
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001180getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001181 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001183 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001185#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001186 case AF_UNIX:
1187 {
1188 struct sockaddr_un* addr;
1189 char *path;
1190 int len;
1191 if (!PyArg_Parse(args, "t#", &path, &len))
1192 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001193
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001194 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001195#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001196 if (len > 0 && path[0] == 0) {
1197 /* Linux abstract namespace extension */
1198 if (len > sizeof addr->sun_path) {
1199 PyErr_SetString(socket_error,
1200 "AF_UNIX path too long");
1201 return 0;
1202 }
1203 }
1204 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001205#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001206 {
1207 /* regular NULL-terminated string */
1208 if (len >= sizeof addr->sun_path) {
1209 PyErr_SetString(socket_error,
1210 "AF_UNIX path too long");
1211 return 0;
1212 }
1213 addr->sun_path[len] = 0;
1214 }
1215 addr->sun_family = s->sock_family;
1216 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001217#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001218 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001219#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001220 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001221#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001222 return 1;
1223 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225
Martin v. Löwis11017b12006-01-14 18:12:57 +00001226#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001227 case AF_NETLINK:
1228 {
1229 struct sockaddr_nl* addr;
1230 int pid, groups;
1231 addr = (struct sockaddr_nl *)addr_ret;
1232 if (!PyTuple_Check(args)) {
1233 PyErr_Format(
1234 PyExc_TypeError,
1235 "getsockaddrarg: "
1236 "AF_NETLINK address must be tuple, not %.500s",
1237 Py_TYPE(args)->tp_name);
1238 return 0;
1239 }
1240 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1241 return 0;
1242 addr->nl_family = AF_NETLINK;
1243 addr->nl_pid = pid;
1244 addr->nl_groups = groups;
1245 *len_ret = sizeof(*addr);
1246 return 1;
1247 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001248#endif
1249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 case AF_INET:
1251 {
1252 struct sockaddr_in* addr;
1253 char *host;
1254 int port, result;
1255 if (!PyTuple_Check(args)) {
1256 PyErr_Format(
1257 PyExc_TypeError,
1258 "getsockaddrarg: "
1259 "AF_INET address must be tuple, not %.500s",
1260 Py_TYPE(args)->tp_name);
1261 return 0;
1262 }
1263 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1264 "idna", &host, &port))
1265 return 0;
1266 addr=(struct sockaddr_in*)addr_ret;
1267 result = setipaddr(host, (struct sockaddr *)addr,
1268 sizeof(*addr), AF_INET);
1269 PyMem_Free(host);
1270 if (result < 0)
1271 return 0;
1272 if (port < 0 || port > 0xffff) {
1273 PyErr_SetString(
1274 PyExc_OverflowError,
1275 "getsockaddrarg: port must be 0-65535.");
1276 return 0;
1277 }
1278 addr->sin_family = AF_INET;
1279 addr->sin_port = htons((short)port);
1280 *len_ret = sizeof *addr;
1281 return 1;
1282 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001284#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001285 case AF_INET6:
1286 {
1287 struct sockaddr_in6* addr;
1288 char *host;
1289 int port, flowinfo, scope_id, result;
1290 flowinfo = scope_id = 0;
1291 if (!PyTuple_Check(args)) {
1292 PyErr_Format(
1293 PyExc_TypeError,
1294 "getsockaddrarg: "
1295 "AF_INET6 address must be tuple, not %.500s",
1296 Py_TYPE(args)->tp_name);
1297 return 0;
1298 }
1299 if (!PyArg_ParseTuple(args, "eti|ii",
1300 "idna", &host, &port, &flowinfo,
1301 &scope_id)) {
1302 return 0;
1303 }
1304 addr = (struct sockaddr_in6*)addr_ret;
1305 result = setipaddr(host, (struct sockaddr *)addr,
1306 sizeof(*addr), AF_INET6);
1307 PyMem_Free(host);
1308 if (result < 0)
1309 return 0;
1310 if (port < 0 || port > 0xffff) {
1311 PyErr_SetString(
1312 PyExc_OverflowError,
1313 "getsockaddrarg: port must be 0-65535.");
1314 return 0;
1315 }
1316 addr->sin6_family = s->sock_family;
1317 addr->sin6_port = htons((short)port);
1318 addr->sin6_flowinfo = flowinfo;
1319 addr->sin6_scope_id = scope_id;
1320 *len_ret = sizeof *addr;
1321 return 1;
1322 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001323#endif
1324
Hye-Shik Chang81268602004-02-02 06:05:24 +00001325#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001326 case AF_BLUETOOTH:
1327 {
1328 switch (s->sock_proto) {
1329 case BTPROTO_L2CAP:
1330 {
1331 struct sockaddr_l2 *addr;
1332 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001333
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001334 addr = (struct sockaddr_l2 *)addr_ret;
1335 memset(addr, 0, sizeof(struct sockaddr_l2));
1336 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1337 if (!PyArg_ParseTuple(args, "si", &straddr,
1338 &_BT_L2_MEMB(addr, psm))) {
1339 PyErr_SetString(socket_error, "getsockaddrarg: "
1340 "wrong format");
1341 return 0;
1342 }
1343 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1344 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001346 *len_ret = sizeof *addr;
1347 return 1;
1348 }
1349 case BTPROTO_RFCOMM:
1350 {
1351 struct sockaddr_rc *addr;
1352 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 addr = (struct sockaddr_rc *)addr_ret;
1355 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1356 if (!PyArg_ParseTuple(args, "si", &straddr,
1357 &_BT_RC_MEMB(addr, channel))) {
1358 PyErr_SetString(socket_error, "getsockaddrarg: "
1359 "wrong format");
1360 return 0;
1361 }
1362 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1363 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001365 *len_ret = sizeof *addr;
1366 return 1;
1367 }
1368 case BTPROTO_HCI:
1369 {
1370 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001371#if defined(__NetBSD__) || defined(__DragonFly__)
1372 char *straddr = PyBytes_AS_STRING(args);
1373
1374 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1375 if (straddr == NULL) {
1376 PyErr_SetString(socket_error, "getsockaddrarg: "
1377 "wrong format");
1378 return 0;
1379 }
1380 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1381 return 0;
1382#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001383 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1384 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1385 PyErr_SetString(socket_error, "getsockaddrarg: "
1386 "wrong format");
1387 return 0;
1388 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001389#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001390 *len_ret = sizeof *addr;
1391 return 1;
1392 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001393#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001394 case BTPROTO_SCO:
1395 {
1396 struct sockaddr_sco *addr;
1397 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001398
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001399 addr = (struct sockaddr_sco *)addr_ret;
1400 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1401 straddr = PyString_AsString(args);
1402 if (straddr == NULL) {
1403 PyErr_SetString(socket_error, "getsockaddrarg: "
1404 "wrong format");
1405 return 0;
1406 }
1407 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1408 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001410 *len_ret = sizeof *addr;
1411 return 1;
1412 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001413#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001414 default:
1415 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1416 return 0;
1417 }
1418 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001419#endif
1420
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001421#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001422 case AF_PACKET:
1423 {
1424 struct sockaddr_ll* addr;
1425 struct ifreq ifr;
1426 char *interfaceName;
1427 int protoNumber;
1428 int hatype = 0;
1429 int pkttype = 0;
1430 char *haddr = NULL;
1431 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001433 if (!PyTuple_Check(args)) {
1434 PyErr_Format(
1435 PyExc_TypeError,
1436 "getsockaddrarg: "
1437 "AF_PACKET address must be tuple, not %.500s",
1438 Py_TYPE(args)->tp_name);
1439 return 0;
1440 }
1441 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1442 &protoNumber, &pkttype, &hatype,
1443 &haddr, &halen))
1444 return 0;
1445 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1446 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1447 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1448 s->errorhandler();
1449 return 0;
1450 }
1451 if (halen > 8) {
1452 PyErr_SetString(PyExc_ValueError,
1453 "Hardware address must be 8 bytes or less");
1454 return 0;
1455 }
1456 if (protoNumber < 0 || protoNumber > 0xffff) {
1457 PyErr_SetString(
1458 PyExc_OverflowError,
1459 "getsockaddrarg: protoNumber must be 0-65535.");
1460 return 0;
1461 }
1462 addr = (struct sockaddr_ll*)addr_ret;
1463 addr->sll_family = AF_PACKET;
1464 addr->sll_protocol = htons((short)protoNumber);
1465 addr->sll_ifindex = ifr.ifr_ifindex;
1466 addr->sll_pkttype = pkttype;
1467 addr->sll_hatype = hatype;
1468 if (halen != 0) {
1469 memcpy(&addr->sll_addr, haddr, halen);
1470 }
1471 addr->sll_halen = halen;
1472 *len_ret = sizeof *addr;
1473 return 1;
1474 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001475#endif
1476
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001477#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001478 case AF_TIPC:
1479 {
1480 unsigned int atype, v1, v2, v3;
1481 unsigned int scope = TIPC_CLUSTER_SCOPE;
1482 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001483
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001484 if (!PyTuple_Check(args)) {
1485 PyErr_Format(
1486 PyExc_TypeError,
1487 "getsockaddrarg: "
1488 "AF_TIPC address must be tuple, not %.500s",
1489 Py_TYPE(args)->tp_name);
1490 return 0;
1491 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001492
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001493 if (!PyArg_ParseTuple(args,
1494 "IIII|I;Invalid TIPC address format",
1495 &atype, &v1, &v2, &v3, &scope))
1496 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001498 addr = (struct sockaddr_tipc *) addr_ret;
1499 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001500
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001501 addr->family = AF_TIPC;
1502 addr->scope = scope;
1503 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001504
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001505 if (atype == TIPC_ADDR_NAMESEQ) {
1506 addr->addr.nameseq.type = v1;
1507 addr->addr.nameseq.lower = v2;
1508 addr->addr.nameseq.upper = v3;
1509 } else if (atype == TIPC_ADDR_NAME) {
1510 addr->addr.name.name.type = v1;
1511 addr->addr.name.name.instance = v2;
1512 } else if (atype == TIPC_ADDR_ID) {
1513 addr->addr.id.node = v1;
1514 addr->addr.id.ref = v2;
1515 } else {
1516 /* Shouldn't happen */
1517 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1518 return 0;
1519 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001520
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001521 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001522
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001523 return 1;
1524 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001525#endif
1526
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001527 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001529 default:
1530 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1531 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001533 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001534}
1535
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536
Guido van Rossum48a680c2001-03-02 06:34:14 +00001537/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001538 Return 1 if the family is known, 0 otherwise. The length is returned
1539 through len_ret. */
1540
1541static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001542getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001543{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001544 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001545
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001546#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001547 case AF_UNIX:
1548 {
1549 *len_ret = sizeof (struct sockaddr_un);
1550 return 1;
1551 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001552#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001553#if defined(AF_NETLINK)
1554 case AF_NETLINK:
1555 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001556 *len_ret = sizeof (struct sockaddr_nl);
1557 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001558 }
1559#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001560
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001561 case AF_INET:
1562 {
1563 *len_ret = sizeof (struct sockaddr_in);
1564 return 1;
1565 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001566
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001567#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001568 case AF_INET6:
1569 {
1570 *len_ret = sizeof (struct sockaddr_in6);
1571 return 1;
1572 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001573#endif
1574
Hye-Shik Chang81268602004-02-02 06:05:24 +00001575#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001576 case AF_BLUETOOTH:
1577 {
1578 switch(s->sock_proto)
1579 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001580
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001581 case BTPROTO_L2CAP:
1582 *len_ret = sizeof (struct sockaddr_l2);
1583 return 1;
1584 case BTPROTO_RFCOMM:
1585 *len_ret = sizeof (struct sockaddr_rc);
1586 return 1;
1587 case BTPROTO_HCI:
1588 *len_ret = sizeof (struct sockaddr_hci);
1589 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001590#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001591 case BTPROTO_SCO:
1592 *len_ret = sizeof (struct sockaddr_sco);
1593 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001594#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001595 default:
1596 PyErr_SetString(socket_error, "getsockaddrlen: "
1597 "unknown BT protocol");
1598 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001599
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001600 }
1601 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001602#endif
1603
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001604#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001605 case AF_PACKET:
1606 {
1607 *len_ret = sizeof (struct sockaddr_ll);
1608 return 1;
1609 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001610#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001611
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001612#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001613 case AF_TIPC:
1614 {
1615 *len_ret = sizeof (struct sockaddr_tipc);
1616 return 1;
1617 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001618#endif
1619
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001620 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001622 default:
1623 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1624 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001625
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001626 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001627}
1628
1629
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630/* s.accept() method */
1631
Guido van Rossum73624e91994-10-10 17:59:00 +00001632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001633sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001634{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001635 sock_addr_t addrbuf;
1636 SOCKET_T newfd;
1637 socklen_t addrlen;
1638 PyObject *sock = NULL;
1639 PyObject *addr = NULL;
1640 PyObject *res = NULL;
1641 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001642
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001643 if (!getsockaddrlen(s, &addrlen))
1644 return NULL;
1645 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001646
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001647#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001648 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001649#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001650 newfd = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001651#endif
1652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001653 if (!IS_SELECTABLE(s))
1654 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 Py_BEGIN_ALLOW_THREADS
1657 timeout = internal_select(s, 0);
1658 if (!timeout)
1659 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1660 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001662 if (timeout == 1) {
1663 PyErr_SetString(socket_timeout, "timed out");
1664 return NULL;
1665 }
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001666
Fred Drakea04eaad2000-06-30 02:46:07 +00001667#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001668 if (newfd == INVALID_SOCKET)
Fred Drakea04eaad2000-06-30 02:46:07 +00001669#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001671#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001672 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001674 /* Create the new object with unspecified family,
1675 to avoid calls to bind() etc. on it. */
1676 sock = (PyObject *) new_sockobject(newfd,
1677 s->sock_family,
1678 s->sock_type,
1679 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 if (sock == NULL) {
1682 SOCKETCLOSE(newfd);
1683 goto finally;
1684 }
1685 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1686 addrlen, s->sock_proto);
1687 if (addr == NULL)
1688 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001690 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001691
Guido van Rossum67f7a382002-06-06 21:08:16 +00001692finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001693 Py_XDECREF(sock);
1694 Py_XDECREF(addr);
1695 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001696}
1697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001698PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001699"accept() -> (socket object, address info)\n\
1700\n\
1701Wait for an incoming connection. Return a new socket representing the\n\
1702connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001703info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001704
Guido van Rossum11ba0942002-06-13 15:07:44 +00001705/* s.setblocking(flag) method. Argument:
1706 False -- non-blocking mode; same as settimeout(0)
1707 True -- blocking mode; same as settimeout(None)
1708*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001709
Guido van Rossum73624e91994-10-10 17:59:00 +00001710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001711sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001712{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001715 block = PyInt_AsLong(arg);
1716 if (block == -1 && PyErr_Occurred())
1717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001719 s->sock_timeout = block ? -1.0 : 0.0;
1720 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001721
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001722 Py_INCREF(Py_None);
1723 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001724}
Guido van Rossume4485b01994-09-07 14:32:49 +00001725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001726PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001727"setblocking(flag)\n\
1728\n\
1729Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001730setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001731setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001732
Guido van Rossum11ba0942002-06-13 15:07:44 +00001733/* s.settimeout(timeout) method. Argument:
1734 None -- no timeout, blocking mode; same as setblocking(True)
1735 0.0 -- non-blocking mode; same as setblocking(False)
1736 > 0 -- timeout mode; operations time out after timeout seconds
1737 < 0 -- illegal; raises an exception
1738*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001739static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001740sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001741{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001742 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744 if (arg == Py_None)
1745 timeout = -1.0;
1746 else {
1747 timeout = PyFloat_AsDouble(arg);
1748 if (timeout < 0.0) {
1749 if (!PyErr_Occurred())
1750 PyErr_SetString(PyExc_ValueError,
1751 "Timeout value out of range");
1752 return NULL;
1753 }
1754 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 s->sock_timeout = timeout;
1757 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001759 Py_INCREF(Py_None);
1760 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761}
1762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001763PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001764"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001766Set a timeout on socket operations. 'timeout' can be a float,\n\
1767giving in seconds, or None. Setting a timeout of None disables\n\
1768the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001769Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001770
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001771/* s.gettimeout() method.
1772 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001774sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001775{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001776 if (s->sock_timeout < 0.0) {
1777 Py_INCREF(Py_None);
1778 return Py_None;
1779 }
1780 else
1781 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782}
1783
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001784PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001785"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001786\n\
1787Returns the timeout in floating seconds associated with socket \n\
1788operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001789operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001790
Guido van Rossum48a680c2001-03-02 06:34:14 +00001791#ifdef RISCOS
1792/* s.sleeptaskw(1 | 0) method */
1793
1794static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001795sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001796{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797 int block;
1798 block = PyInt_AsLong(arg);
1799 if (block == -1 && PyErr_Occurred())
1800 return NULL;
1801 Py_BEGIN_ALLOW_THREADS
1802 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1803 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001805 Py_INCREF(Py_None);
1806 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001807}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001809"sleeptaskw(flag)\n\
1810\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001811Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001812#endif
1813
1814
Guido van Rossumaee08791992-09-08 09:05:33 +00001815/* s.setsockopt() method.
1816 With an integer third argument, sets an integer option.
1817 With a string third argument, sets an option from a buffer;
1818 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001819
Guido van Rossum73624e91994-10-10 17:59:00 +00001820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001821sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001823 int level;
1824 int optname;
1825 int res;
1826 char *buf;
1827 int buflen;
1828 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001830 if (PyArg_ParseTuple(args, "iii:setsockopt",
1831 &level, &optname, &flag)) {
1832 buf = (char *) &flag;
1833 buflen = sizeof flag;
1834 }
1835 else {
1836 PyErr_Clear();
1837 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1838 &level, &optname, &buf, &buflen))
1839 return NULL;
1840 }
1841 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1842 if (res < 0)
1843 return s->errorhandler();
1844 Py_INCREF(Py_None);
1845 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001846}
1847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001848PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001849"setsockopt(level, option, value)\n\
1850\n\
1851Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001852The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001853
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001854
Guido van Rossumaee08791992-09-08 09:05:33 +00001855/* s.getsockopt() method.
1856 With two arguments, retrieves an integer option.
1857 With a third integer argument, retrieves a string buffer of that size;
1858 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001859
Guido van Rossum73624e91994-10-10 17:59:00 +00001860static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001861sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001862{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001863 int level;
1864 int optname;
1865 int res;
1866 PyObject *buf;
1867 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001868
Guido van Rossumbcc20741998-08-04 22:53:56 +00001869#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001870 /* We have incomplete socket support. */
1871 PyErr_SetString(socket_error, "getsockopt not supported");
1872 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001873#else
1874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001875 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1876 &level, &optname, &buflen))
1877 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001879 if (buflen == 0) {
1880 int flag = 0;
1881 socklen_t flagsize = sizeof flag;
1882 res = getsockopt(s->sock_fd, level, optname,
1883 (void *)&flag, &flagsize);
1884 if (res < 0)
1885 return s->errorhandler();
1886 return PyInt_FromLong(flag);
1887 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001888#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001889 /* socklen_t is unsigned so no negative test is needed,
1890 test buflen == 0 is previously done */
1891 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001892#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001893 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001894#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001895 PyErr_SetString(socket_error,
1896 "getsockopt buflen out of range");
1897 return NULL;
1898 }
1899 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1900 if (buf == NULL)
1901 return NULL;
1902 res = getsockopt(s->sock_fd, level, optname,
1903 (void *)PyString_AS_STRING(buf), &buflen);
1904 if (res < 0) {
1905 Py_DECREF(buf);
1906 return s->errorhandler();
1907 }
1908 _PyString_Resize(&buf, buflen);
1909 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001910#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001911}
1912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914"getsockopt(level, option[, buffersize]) -> value\n\
1915\n\
1916Get a socket option. See the Unix manual for level and option.\n\
1917If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001918string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001919
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001920
Fred Drake728819a2000-07-01 03:40:12 +00001921/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922
Guido van Rossum73624e91994-10-10 17:59:00 +00001923static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001924sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 sock_addr_t addrbuf;
1927 int addrlen;
1928 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001930 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1931 return NULL;
1932 Py_BEGIN_ALLOW_THREADS
1933 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1934 Py_END_ALLOW_THREADS
1935 if (res < 0)
1936 return s->errorhandler();
1937 Py_INCREF(Py_None);
1938 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001939}
1940
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001941PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001942"bind(address)\n\
1943\n\
1944Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001945pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001946sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947
Guido van Rossum30a685f1991-06-27 15:51:29 +00001948
1949/* s.close() method.
1950 Set the file descriptor to -1 so operations tried subsequently
1951 will surely fail. */
1952
Guido van Rossum73624e91994-10-10 17:59:00 +00001953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001957
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001958 if ((fd = s->sock_fd) != -1) {
1959 s->sock_fd = -1;
1960 Py_BEGIN_ALLOW_THREADS
1961 (void) SOCKETCLOSE(fd);
1962 Py_END_ALLOW_THREADS
1963 }
1964 Py_INCREF(Py_None);
1965 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001966}
1967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001969"close()\n\
1970\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001973static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001974internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001975 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001976{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001977 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001979 timeout = 0;
1980 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001981
1982#ifdef MS_WINDOWS
1983
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001984 if (s->sock_timeout > 0.0) {
1985 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1986 IS_SELECTABLE(s)) {
1987 /* This is a mess. Best solution: trust select */
1988 fd_set fds;
1989 fd_set fds_exc;
1990 struct timeval tv;
1991 tv.tv_sec = (int)s->sock_timeout;
1992 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1993 FD_ZERO(&fds);
1994 FD_SET(s->sock_fd, &fds);
1995 FD_ZERO(&fds_exc);
1996 FD_SET(s->sock_fd, &fds_exc);
1997 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
1998 if (res == 0) {
1999 res = WSAEWOULDBLOCK;
2000 timeout = 1;
2001 } else if (res > 0) {
2002 if (FD_ISSET(s->sock_fd, &fds))
2003 /* The socket is in the writeable set - this
2004 means connected */
2005 res = 0;
2006 else {
2007 /* As per MS docs, we need to call getsockopt()
2008 to get the underlying error */
2009 int res_size = sizeof res;
2010 /* It must be in the exception set */
2011 assert(FD_ISSET(s->sock_fd, &fds_exc));
2012 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2013 (char *)&res, &res_size))
2014 /* getsockopt also clears WSAGetLastError,
2015 so reset it back. */
2016 WSASetLastError(res);
2017 else
2018 res = WSAGetLastError();
2019 }
2020 }
2021 /* else if (res < 0) an error occurred */
2022 }
2023 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002024
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002025 if (res < 0)
2026 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002027
2028#else
2029
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002030 if (s->sock_timeout > 0.0) {
2031 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2032 timeout = internal_select(s, 1);
2033 if (timeout == 0) {
2034 /* Bug #1019808: in case of an EINPROGRESS,
2035 use getsockopt(SO_ERROR) to get the real
2036 error. */
2037 socklen_t res_size = sizeof res;
2038 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2039 SO_ERROR, &res, &res_size);
2040 if (res == EISCONN)
2041 res = 0;
2042 errno = res;
2043 }
2044 else if (timeout == -1) {
2045 res = errno; /* had error */
2046 }
2047 else
2048 res = EWOULDBLOCK; /* timed out */
2049 }
2050 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002051
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002052 if (res < 0)
2053 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002054
2055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002056 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002057
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002058 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002059}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060
Fred Drake728819a2000-07-01 03:40:12 +00002061/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062
Guido van Rossum73624e91994-10-10 17:59:00 +00002063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002064sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002065{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002066 sock_addr_t addrbuf;
2067 int addrlen;
2068 int res;
2069 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002070
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002071 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2072 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002074 Py_BEGIN_ALLOW_THREADS
2075 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2076 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002077
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002078 if (timeout == 1) {
2079 PyErr_SetString(socket_timeout, "timed out");
2080 return NULL;
2081 }
2082 if (res != 0)
2083 return s->errorhandler();
2084 Py_INCREF(Py_None);
2085 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002086}
2087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002088PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089"connect(address)\n\
2090\n\
2091Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002092is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002093
Guido van Rossum30a685f1991-06-27 15:51:29 +00002094
Fred Drake728819a2000-07-01 03:40:12 +00002095/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002096
2097static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002098sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002099{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002100 sock_addr_t addrbuf;
2101 int addrlen;
2102 int res;
2103 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002104
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002105 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2106 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002108 Py_BEGIN_ALLOW_THREADS
2109 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2110 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002112 /* Signals are not errors (though they may raise exceptions). Adapted
2113 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002114#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002115 if (res == EINTR && PyErr_CheckSignals())
2116 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002117#endif
2118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002119 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002120}
2121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002123"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002124\n\
2125This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002126instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002127
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002128
Guido van Rossumed233a51992-06-23 09:07:03 +00002129/* s.fileno() method */
2130
Guido van Rossum73624e91994-10-10 17:59:00 +00002131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002132sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002133{
Fred Drakea04eaad2000-06-30 02:46:07 +00002134#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002135 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002136#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002138#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002139}
2140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002142"fileno() -> integer\n\
2143\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002144Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145
Guido van Rossumed233a51992-06-23 09:07:03 +00002146
Guido van Rossumbe32c891996-06-20 16:25:29 +00002147#ifndef NO_DUP
2148/* s.dup() method */
2149
2150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002152{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002153 SOCKET_T newfd;
2154 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002156 newfd = dup(s->sock_fd);
2157 if (newfd < 0)
2158 return s->errorhandler();
2159 sock = (PyObject *) new_sockobject(newfd,
2160 s->sock_family,
2161 s->sock_type,
2162 s->sock_proto);
2163 if (sock == NULL)
2164 SOCKETCLOSE(newfd);
2165 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002166}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002168PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002169"dup() -> socket object\n\
2170\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002171Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002172
Guido van Rossumbe32c891996-06-20 16:25:29 +00002173#endif
2174
2175
Guido van Rossumc89705d1992-11-26 08:54:07 +00002176/* s.getsockname() method */
2177
Guido van Rossum73624e91994-10-10 17:59:00 +00002178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002179sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002180{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002181 sock_addr_t addrbuf;
2182 int res;
2183 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002184
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002185 if (!getsockaddrlen(s, &addrlen))
2186 return NULL;
2187 memset(&addrbuf, 0, addrlen);
2188 Py_BEGIN_ALLOW_THREADS
2189 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2190 Py_END_ALLOW_THREADS
2191 if (res < 0)
2192 return s->errorhandler();
2193 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2194 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002195}
2196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002197PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002198"getsockname() -> address info\n\
2199\n\
2200Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002201info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202
Guido van Rossumc89705d1992-11-26 08:54:07 +00002203
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002204#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002205/* s.getpeername() method */
2206
Guido van Rossum73624e91994-10-10 17:59:00 +00002207static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002208sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002209{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002210 sock_addr_t addrbuf;
2211 int res;
2212 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002214 if (!getsockaddrlen(s, &addrlen))
2215 return NULL;
2216 memset(&addrbuf, 0, addrlen);
2217 Py_BEGIN_ALLOW_THREADS
2218 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2219 Py_END_ALLOW_THREADS
2220 if (res < 0)
2221 return s->errorhandler();
2222 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2223 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002224}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227"getpeername() -> address info\n\
2228\n\
2229Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002230info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231
Guido van Rossumb6775db1994-08-01 11:34:53 +00002232#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002233
2234
Guido van Rossum30a685f1991-06-27 15:51:29 +00002235/* s.listen(n) method */
2236
Guido van Rossum73624e91994-10-10 17:59:00 +00002237static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002239{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002240 int backlog;
2241 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002242
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002243 backlog = PyInt_AsLong(arg);
2244 if (backlog == -1 && PyErr_Occurred())
2245 return NULL;
2246 Py_BEGIN_ALLOW_THREADS
2247 if (backlog < 1)
2248 backlog = 1;
2249 res = listen(s->sock_fd, backlog);
2250 Py_END_ALLOW_THREADS
2251 if (res < 0)
2252 return s->errorhandler();
2253 Py_INCREF(Py_None);
2254 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002255}
2256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258"listen(backlog)\n\
2259\n\
2260Enable a server to accept connections. The backlog argument must be at\n\
2261least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002263
2264
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002265#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002266/* s.makefile(mode) method.
2267 Create a new open file object referring to a dupped version of
2268 the socket's file descriptor. (The dup() call is necessary so
2269 that the open file and socket objects may be closed independent
2270 of each other.)
2271 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2272
Guido van Rossum73624e91994-10-10 17:59:00 +00002273static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002274sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002275{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002276 extern int fclose(FILE *);
2277 char *mode = "r";
2278 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002279#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002280 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002281#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002282 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002283#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002284 FILE *fp;
2285 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002286#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002287 char *mode_r = "r";
2288 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002289#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002290
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002291 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2292 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002293#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002294 if (strcmp(mode,"rb") == 0) {
2295 mode = mode_r;
2296 }
2297 else {
2298 if (strcmp(mode,"wb") == 0) {
2299 mode = mode_w;
2300 }
2301 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002302#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002303#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002304 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2305 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002306#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002307 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002308#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002309 {
2310 if (fd >= 0)
2311 SOCKETCLOSE(fd);
2312 return s->errorhandler();
2313 }
2314 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2315 if (f != NULL)
2316 PyFile_SetBufSize(f, bufsize);
2317 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002318}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002320PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002321"makefile([mode[, buffersize]]) -> file object\n\
2322\n\
2323Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002324The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002325
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002326#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002327
Martin Blais2856e5f2006-05-26 12:03:27 +00002328/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002329 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002330 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002331 * the buffer, do it in the caller. This function returns the number of bytes
2332 * succesfully read. If there was an error, it returns -1. Note that it is
2333 * also possible that we return a number of bytes smaller than the request
2334 * bytes.
2335 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002336static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002337sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002339 ssize_t outlen = -1;
2340 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002341#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002342 int remaining;
2343 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002344#endif
2345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002346 if (!IS_SELECTABLE(s)) {
2347 select_error();
2348 return -1;
2349 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002350
2351#ifndef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002352 Py_BEGIN_ALLOW_THREADS
2353 timeout = internal_select(s, 0);
2354 if (!timeout)
2355 outlen = recv(s->sock_fd, cbuf, len, flags);
2356 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002357
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002358 if (timeout == 1) {
2359 PyErr_SetString(socket_timeout, "timed out");
2360 return -1;
2361 }
2362 if (outlen < 0) {
2363 /* Note: the call to errorhandler() ALWAYS indirectly returned
2364 NULL, so ignore its return value */
2365 s->errorhandler();
2366 return -1;
2367 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002368#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 read_buf = cbuf;
2370 remaining = len;
2371 while (remaining != 0) {
2372 unsigned int segment;
2373 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 segment = remaining /SEGMENT_SIZE;
2376 if (segment != 0) {
2377 segment = SEGMENT_SIZE;
2378 }
2379 else {
2380 segment = remaining;
2381 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002382
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002383 Py_BEGIN_ALLOW_THREADS
2384 timeout = internal_select(s, 0);
2385 if (!timeout)
2386 nread = recv(s->sock_fd, read_buf, segment, flags);
2387 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002389 if (timeout == 1) {
2390 PyErr_SetString(socket_timeout, "timed out");
2391 return -1;
2392 }
2393 if (nread < 0) {
2394 s->errorhandler();
2395 return -1;
2396 }
2397 if (nread != remaining) {
2398 read_buf += nread;
2399 break;
2400 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002402 remaining -= segment;
2403 read_buf += segment;
2404 }
2405 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002406#endif /* !__VMS */
2407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002408 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002409}
2410
Guido van Rossum48a680c2001-03-02 06:34:14 +00002411
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002412/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002413
Guido van Rossum73624e91994-10-10 17:59:00 +00002414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002416{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002417 int recvlen, flags = 0;
2418 ssize_t outlen;
2419 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2422 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002423
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 if (recvlen < 0) {
2425 PyErr_SetString(PyExc_ValueError,
2426 "negative buffersize in recv");
2427 return NULL;
2428 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 /* Allocate a new string. */
2431 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2432 if (buf == NULL)
2433 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002435 /* Call the guts */
2436 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2437 if (outlen < 0) {
2438 /* An error occurred, release the string and return an
2439 error. */
2440 Py_DECREF(buf);
2441 return NULL;
2442 }
2443 if (outlen != recvlen) {
2444 /* We did not read as many bytes as we anticipated, resize the
2445 string if possible and be succesful. */
2446 if (_PyString_Resize(&buf, outlen) < 0)
2447 /* Oopsy, not so succesful after all. */
2448 return NULL;
2449 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002450
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002451 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002452}
2453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002455"recv(buffersize[, flags]) -> data\n\
2456\n\
2457Receive up to buffersize bytes from the socket. For the optional flags\n\
2458argument, see the Unix manual. When no data is available, block until\n\
2459at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461
Guido van Rossum30a685f1991-06-27 15:51:29 +00002462
Martin Blaisaf2ae722006-06-04 13:49:49 +00002463/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002464
Martin Blais2856e5f2006-05-26 12:03:27 +00002465static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002466sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002467{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002468 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002469
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002470 int recvlen = 0, flags = 0;
2471 ssize_t readlen;
2472 Py_buffer buf;
2473 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002474
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002475 /* Get the buffer's memory */
2476 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2477 &buf, &recvlen, &flags))
2478 return NULL;
2479 buflen = buf.len;
2480 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002482 if (recvlen < 0) {
2483 PyErr_SetString(PyExc_ValueError,
2484 "negative buffersize in recv_into");
2485 goto error;
2486 }
2487 if (recvlen == 0) {
2488 /* If nbytes was not specified, use the buffer's length */
2489 recvlen = buflen;
2490 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002492 /* Check if the buffer is large enough */
2493 if (buflen < recvlen) {
2494 PyErr_SetString(PyExc_ValueError,
2495 "buffer too small for requested bytes");
2496 goto error;
2497 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002499 /* Call the guts */
2500 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2501 if (readlen < 0) {
2502 /* Return an error. */
2503 goto error;
2504 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 PyBuffer_Release(&buf);
2507 /* Return the number of bytes read. Note that we do not do anything
2508 special here in the case that readlen < recvlen. */
2509 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002510
2511error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002512 PyBuffer_Release(&buf);
2513 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002514}
2515
Martin Blaisaf2ae722006-06-04 13:49:49 +00002516PyDoc_STRVAR(recv_into_doc,
2517"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002518\n\
2519A version of recv() that stores its data into a buffer rather than creating \n\
2520a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2521is not specified (or 0), receive up to the size available in the given buffer.\n\
2522\n\
2523See recv() for documentation about the flags.");
2524
2525
2526/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002527 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2528 * into a char buffer. If you have any inc/def ref to do to the objects that
2529 * contain the buffer, do it in the caller. This function returns the number
2530 * of bytes succesfully read. If there was an error, it returns -1. Note
2531 * that it is also possible that we return a number of bytes smaller than the
2532 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002533 *
2534 * 'addr' is a return value for the address object. Note that you must decref
2535 * it yourself.
2536 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002537static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002538sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002539 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 sock_addr_t addrbuf;
2542 int timeout;
2543 ssize_t n = -1;
2544 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002545
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002546 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002547
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002548 if (!getsockaddrlen(s, &addrlen))
2549 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002550
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002551 if (!IS_SELECTABLE(s)) {
2552 select_error();
2553 return -1;
2554 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002555
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002556 Py_BEGIN_ALLOW_THREADS
2557 memset(&addrbuf, 0, addrlen);
2558 timeout = internal_select(s, 0);
2559 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002560#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002561#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 n = recvfrom(s->sock_fd, cbuf, len, flags,
2563 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002564#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002565 n = recvfrom(s->sock_fd, cbuf, len, flags,
2566 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002567#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002568#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002569 n = recvfrom(s->sock_fd, cbuf, len, flags,
2570 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002571#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002572 }
2573 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002574
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002575 if (timeout == 1) {
2576 PyErr_SetString(socket_timeout, "timed out");
2577 return -1;
2578 }
2579 if (n < 0) {
2580 s->errorhandler();
2581 return -1;
2582 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002584 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2585 addrlen, s->sock_proto)))
2586 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002588 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002589}
2590
2591/* s.recvfrom(nbytes [,flags]) method */
2592
2593static PyObject *
2594sock_recvfrom(PySocketSockObject *s, PyObject *args)
2595{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002596 PyObject *buf = NULL;
2597 PyObject *addr = NULL;
2598 PyObject *ret = NULL;
2599 int recvlen, flags = 0;
2600 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2603 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002604
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002605 if (recvlen < 0) {
2606 PyErr_SetString(PyExc_ValueError,
2607 "negative buffersize in recvfrom");
2608 return NULL;
2609 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002610
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002611 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2612 if (buf == NULL)
2613 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002614
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002615 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2616 recvlen, flags, &addr);
2617 if (outlen < 0) {
2618 goto finally;
2619 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002620
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002621 if (outlen != recvlen) {
2622 /* We did not read as many bytes as we anticipated, resize the
2623 string if possible and be succesful. */
2624 if (_PyString_Resize(&buf, outlen) < 0)
2625 /* Oopsy, not so succesful after all. */
2626 goto finally;
2627 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002628
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002630
2631finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002632 Py_XDECREF(buf);
2633 Py_XDECREF(addr);
2634 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002635}
2636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002637PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002638"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2639\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002641
Martin Blais2856e5f2006-05-26 12:03:27 +00002642
Martin Blaisaf2ae722006-06-04 13:49:49 +00002643/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002644
2645static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002646sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002647{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002648 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002649
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002650 int recvlen = 0, flags = 0;
2651 ssize_t readlen;
2652 Py_buffer buf;
2653 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002654
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002655 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2658 kwlist, &buf,
2659 &recvlen, &flags))
2660 return NULL;
2661 buflen = buf.len;
2662 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002663
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002664 if (recvlen < 0) {
2665 PyErr_SetString(PyExc_ValueError,
2666 "negative buffersize in recvfrom_into");
2667 goto error;
2668 }
2669 if (recvlen == 0) {
2670 /* If nbytes was not specified, use the buffer's length */
2671 recvlen = buflen;
2672 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002673
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002674 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2675 if (readlen < 0) {
2676 /* Return an error */
2677 goto error;
2678 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002679
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002680 PyBuffer_Release(&buf);
2681 /* Return the number of bytes read and the address. Note that we do
2682 not do anything special here in the case that readlen < recvlen. */
2683 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002684
2685error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002686 Py_XDECREF(addr);
2687 PyBuffer_Release(&buf);
2688 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002689}
2690
Martin Blaisaf2ae722006-06-04 13:49:49 +00002691PyDoc_STRVAR(recvfrom_into_doc,
2692"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002693\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002694Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002695
2696
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002697/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002698
Guido van Rossum73624e91994-10-10 17:59:00 +00002699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002700sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002701{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002702 char *buf;
2703 int len, n = -1, flags = 0, timeout;
2704 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2707 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002709 if (!IS_SELECTABLE(s)) {
2710 PyBuffer_Release(&pbuf);
2711 return select_error();
2712 }
2713 buf = pbuf.buf;
2714 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002715
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002716 Py_BEGIN_ALLOW_THREADS
2717 timeout = internal_select(s, 1);
2718 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002719#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002720 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002721#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002722 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002723#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002724 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002725
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002726 PyBuffer_Release(&pbuf);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +00002727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002728 if (timeout == 1) {
2729 PyErr_SetString(socket_timeout, "timed out");
2730 return NULL;
2731 }
2732 if (n < 0)
2733 return s->errorhandler();
2734 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002735}
2736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002738"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739\n\
2740Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002741argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002742sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002743
2744
2745/* s.sendall(data [,flags]) method */
2746
2747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002748sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002749{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002750 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002751 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002752 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002754 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2755 return NULL;
2756 buf = pbuf.buf;
2757 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002758
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002759 if (!IS_SELECTABLE(s)) {
2760 PyBuffer_Release(&pbuf);
2761 return select_error();
2762 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002763
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002764 do {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002765 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002766 timeout = internal_select(s, 1);
2767 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002768 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002769#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002770 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002771#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002772 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002773#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002774 }
2775 Py_END_ALLOW_THREADS
2776 if (timeout == 1) {
2777 PyBuffer_Release(&pbuf);
2778 PyErr_SetString(socket_timeout, "timed out");
2779 return NULL;
2780 }
2781 /* PyErr_CheckSignals() might change errno */
2782 saved_errno = errno;
2783 /* We must run our signal handlers before looping again.
2784 send() can return a successful partial write when it is
2785 interrupted, so we can't restrict ourselves to EINTR. */
2786 if (PyErr_CheckSignals()) {
2787 PyBuffer_Release(&pbuf);
2788 return NULL;
2789 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002790 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002791 /* If interrupted, try again */
2792 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002794 else
2795 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 }
2797 buf += n;
2798 len -= n;
2799 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002801
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 if (n < 0)
2803 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002804
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002805 Py_INCREF(Py_None);
2806 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002807}
2808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002809PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002810"sendall(data[, flags])\n\
2811\n\
2812Send a data string to the socket. For the optional flags\n\
2813argument, see the Unix manual. This calls send() repeatedly\n\
2814until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002816
Guido van Rossum30a685f1991-06-27 15:51:29 +00002817
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002818/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002819
Guido van Rossum73624e91994-10-10 17:59:00 +00002820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002823 Py_buffer pbuf;
2824 PyObject *addro;
2825 char *buf;
2826 Py_ssize_t len;
2827 sock_addr_t addrbuf;
2828 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002830 flags = 0;
2831 if (!PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro)) {
2832 PyErr_Clear();
2833 if (!PyArg_ParseTuple(args, "s*iO:sendto",
2834 &pbuf, &flags, &addro))
2835 return NULL;
2836 }
2837 buf = pbuf.buf;
2838 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002840 if (!IS_SELECTABLE(s)) {
2841 PyBuffer_Release(&pbuf);
2842 return select_error();
2843 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002844
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002845 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2846 PyBuffer_Release(&pbuf);
2847 return NULL;
2848 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002850 Py_BEGIN_ALLOW_THREADS
2851 timeout = internal_select(s, 1);
2852 if (!timeout)
2853 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2854 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002855
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002856 PyBuffer_Release(&pbuf);
2857 if (timeout == 1) {
2858 PyErr_SetString(socket_timeout, "timed out");
2859 return NULL;
2860 }
2861 if (n < 0)
2862 return s->errorhandler();
2863 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002864}
2865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002866PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002867"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002868\n\
2869Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002870For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002871
Guido van Rossum30a685f1991-06-27 15:51:29 +00002872
2873/* s.shutdown(how) method */
2874
Guido van Rossum73624e91994-10-10 17:59:00 +00002875static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002876sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002877{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002878 int how;
2879 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002880
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002881 how = PyInt_AsLong(arg);
2882 if (how == -1 && PyErr_Occurred())
2883 return NULL;
2884 Py_BEGIN_ALLOW_THREADS
2885 res = shutdown(s->sock_fd, how);
2886 Py_END_ALLOW_THREADS
2887 if (res < 0)
2888 return s->errorhandler();
2889 Py_INCREF(Py_None);
2890 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002891}
2892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002893PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002894"shutdown(flag)\n\
2895\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002896Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2897of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002898
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002899#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00002900static PyObject*
2901sock_ioctl(PySocketSockObject *s, PyObject *arg)
2902{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002903 unsigned long cmd = SIO_RCVALL;
2904 PyObject *argO;
2905 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00002906
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002907 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2908 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00002909
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002910 switch (cmd) {
2911 case SIO_RCVALL: {
2912 unsigned int option = RCVALL_ON;
2913 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2914 return NULL;
2915 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2916 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2917 return set_error();
2918 }
2919 return PyLong_FromUnsignedLong(recv); }
2920 case SIO_KEEPALIVE_VALS: {
2921 struct tcp_keepalive ka;
2922 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2923 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2924 return NULL;
2925 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2926 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2927 return set_error();
2928 }
2929 return PyLong_FromUnsignedLong(recv); }
2930 default:
2931 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2932 return NULL;
2933 }
Christian Heimes04ae9162008-01-04 15:23:30 +00002934}
2935PyDoc_STRVAR(sock_ioctl_doc,
2936"ioctl(cmd, option) -> long\n\
2937\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00002938Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2939SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2940SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00002941
2942#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002943
2944/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002945
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002947 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2948 accept_doc},
2949 {"bind", (PyCFunction)sock_bind, METH_O,
2950 bind_doc},
2951 {"close", (PyCFunction)sock_close, METH_NOARGS,
2952 close_doc},
2953 {"connect", (PyCFunction)sock_connect, METH_O,
2954 connect_doc},
2955 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2956 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002957#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002958 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2959 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002960#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002961 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2962 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002963#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002964 {"getpeername", (PyCFunction)sock_getpeername,
2965 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002966#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 {"getsockname", (PyCFunction)sock_getsockname,
2968 METH_NOARGS, getsockname_doc},
2969 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2970 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00002971#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002972 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2973 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00002974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002975 {"listen", (PyCFunction)sock_listen, METH_O,
2976 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002977#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002978 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2979 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002981 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2982 recv_doc},
2983 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2984 recv_into_doc},
2985 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2986 recvfrom_doc},
2987 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2988 recvfrom_into_doc},
2989 {"send", (PyCFunction)sock_send, METH_VARARGS,
2990 send_doc},
2991 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2992 sendall_doc},
2993 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2994 sendto_doc},
2995 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2996 setblocking_doc},
2997 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2998 settimeout_doc},
2999 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3000 gettimeout_doc},
3001 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3002 setsockopt_doc},
3003 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3004 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003005#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003006 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3007 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003008#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003009 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003010};
3011
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003012/* SockObject members */
3013static PyMemberDef sock_memberlist[] = {
3014 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3015 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3016 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3017 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3018 {0},
3019};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003020
Guido van Rossum73624e91994-10-10 17:59:00 +00003021/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003022 First close the file description. */
3023
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003024static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003025sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003026{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003027 if (s->sock_fd != -1)
3028 (void) SOCKETCLOSE(s->sock_fd);
3029 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003030}
3031
Guido van Rossum30a685f1991-06-27 15:51:29 +00003032
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003033static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003035{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003036 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00003037#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003038 if (s->sock_fd > LONG_MAX) {
3039 /* this can occur on Win64, and actually there is a special
3040 ugly printf formatter for decimal pointer length integer
3041 printing, only bother if necessary*/
3042 PyErr_SetString(PyExc_OverflowError,
3043 "no printf formatter to display "
3044 "the socket descriptor in decimal");
3045 return NULL;
3046 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003047#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003048 PyOS_snprintf(
3049 buf, sizeof(buf),
3050 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3051 (long)s->sock_fd, s->sock_family,
3052 s->sock_type,
3053 s->sock_proto);
3054 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003055}
3056
3057
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003058/* Create a new, uninitialized socket object. */
3059
3060static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003061sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003062{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003063 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003065 new = type->tp_alloc(type, 0);
3066 if (new != NULL) {
3067 ((PySocketSockObject *)new)->sock_fd = -1;
3068 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3069 ((PySocketSockObject *)new)->errorhandler = &set_error;
3070 }
3071 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003072}
3073
3074
3075/* Initialize a new socket object. */
3076
3077/*ARGSUSED*/
3078static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003079sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003080{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003081 PySocketSockObject *s = (PySocketSockObject *)self;
3082 SOCKET_T fd;
3083 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3084 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003085
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003086 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3087 "|iii:socket", keywords,
3088 &family, &type, &proto))
3089 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003090
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003091 Py_BEGIN_ALLOW_THREADS
3092 fd = socket(family, type, proto);
3093 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003094
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003095#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003096 if (fd == INVALID_SOCKET)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003097#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003098 if (fd < 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003100 {
3101 set_error();
3102 return -1;
3103 }
3104 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003105
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003106 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003107
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003108}
3109
3110
Guido van Rossumb6775db1994-08-01 11:34:53 +00003111/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003112
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003113static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003114 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3115 "_socket.socket", /* tp_name */
3116 sizeof(PySocketSockObject), /* tp_basicsize */
3117 0, /* tp_itemsize */
3118 (destructor)sock_dealloc, /* tp_dealloc */
3119 0, /* tp_print */
3120 0, /* tp_getattr */
3121 0, /* tp_setattr */
3122 0, /* tp_compare */
3123 (reprfunc)sock_repr, /* tp_repr */
3124 0, /* tp_as_number */
3125 0, /* tp_as_sequence */
3126 0, /* tp_as_mapping */
3127 0, /* tp_hash */
3128 0, /* tp_call */
3129 0, /* tp_str */
3130 PyObject_GenericGetAttr, /* tp_getattro */
3131 0, /* tp_setattro */
3132 0, /* tp_as_buffer */
3133 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3134 sock_doc, /* tp_doc */
3135 0, /* tp_traverse */
3136 0, /* tp_clear */
3137 0, /* tp_richcompare */
3138 0, /* tp_weaklistoffset */
3139 0, /* tp_iter */
3140 0, /* tp_iternext */
3141 sock_methods, /* tp_methods */
3142 sock_memberlist, /* tp_members */
3143 0, /* tp_getset */
3144 0, /* tp_base */
3145 0, /* tp_dict */
3146 0, /* tp_descr_get */
3147 0, /* tp_descr_set */
3148 0, /* tp_dictoffset */
3149 sock_initobj, /* tp_init */
3150 PyType_GenericAlloc, /* tp_alloc */
3151 sock_new, /* tp_new */
3152 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003153};
3154
Guido van Rossum30a685f1991-06-27 15:51:29 +00003155
Guido van Rossum81194471991-07-27 21:42:02 +00003156/* Python interface to gethostname(). */
3157
3158/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003159static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003160socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003161{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003162 char buf[1024];
3163 int res;
3164 Py_BEGIN_ALLOW_THREADS
3165 res = gethostname(buf, (int) sizeof buf - 1);
3166 Py_END_ALLOW_THREADS
3167 if (res < 0)
3168 return set_error();
3169 buf[sizeof buf - 1] = '\0';
3170 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003171}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003173PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003174"gethostname() -> string\n\
3175\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003176Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003177
Guido van Rossumff4949e1992-08-05 19:58:53 +00003178
Guido van Rossum30a685f1991-06-27 15:51:29 +00003179/* Python interface to gethostbyname(name). */
3180
3181/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003182static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003183socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003184{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003185 char *name;
3186 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003187
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003188 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3189 return NULL;
3190 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3191 return NULL;
3192 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003193}
3194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003195PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003196"gethostbyname(host) -> address\n\
3197\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003198Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003199
3200
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003201/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3202
3203static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003204gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003205{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003206 char **pch;
3207 PyObject *rtn_tuple = (PyObject *)NULL;
3208 PyObject *name_list = (PyObject *)NULL;
3209 PyObject *addr_list = (PyObject *)NULL;
3210 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003211
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003212 if (h == NULL) {
3213 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003214#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003215 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003216#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003217 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003218#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003219 return NULL;
3220 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003221
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003222 if (h->h_addrtype != af) {
3223 /* Let's get real error message to return */
3224 PyErr_SetString(socket_error,
3225 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003226
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003227 return NULL;
3228 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003229
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003230 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003231
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003232 case AF_INET:
3233 if (alen < sizeof(struct sockaddr_in))
3234 return NULL;
3235 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003236
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003237#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003238 case AF_INET6:
3239 if (alen < sizeof(struct sockaddr_in6))
3240 return NULL;
3241 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003242#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003244 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003246 if ((name_list = PyList_New(0)) == NULL)
3247 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003248
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003249 if ((addr_list = PyList_New(0)) == NULL)
3250 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003251
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003252 /* SF #1511317: h_aliases can be NULL */
3253 if (h->h_aliases) {
3254 for (pch = h->h_aliases; *pch != NULL; pch++) {
3255 int status;
3256 tmp = PyString_FromString(*pch);
3257 if (tmp == NULL)
3258 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003260 status = PyList_Append(name_list, tmp);
3261 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003262
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003263 if (status)
3264 goto err;
3265 }
3266 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003268 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3269 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003270
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003271 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003272
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003273 case AF_INET:
3274 {
3275 struct sockaddr_in sin;
3276 memset(&sin, 0, sizeof(sin));
3277 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003278#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003279 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003280#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003281 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3282 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003283
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003284 if (pch == h->h_addr_list && alen >= sizeof(sin))
3285 memcpy((char *) addr, &sin, sizeof(sin));
3286 break;
3287 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003288
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003289#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003290 case AF_INET6:
3291 {
3292 struct sockaddr_in6 sin6;
3293 memset(&sin6, 0, sizeof(sin6));
3294 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003295#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003296 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003298 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3299 tmp = makeipaddr((struct sockaddr *)&sin6,
3300 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003301
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003302 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3303 memcpy((char *) addr, &sin6, sizeof(sin6));
3304 break;
3305 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003306#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003307
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003308 default: /* can't happen */
3309 PyErr_SetString(socket_error,
3310 "unsupported address family");
3311 return NULL;
3312 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003313
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003314 if (tmp == NULL)
3315 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003316
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003317 status = PyList_Append(addr_list, tmp);
3318 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003319
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003320 if (status)
3321 goto err;
3322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003325
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003326 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003327 Py_XDECREF(name_list);
3328 Py_XDECREF(addr_list);
3329 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003330}
3331
3332
3333/* Python interface to gethostbyname_ex(name). */
3334
3335/*ARGSUSED*/
3336static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003337socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 char *name;
3340 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003341#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003342 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003343#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003344 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003346 struct sockaddr *sa;
3347 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003348#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003349 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003350#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003351 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003352#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003353 char buf[16384];
3354 int buf_len = (sizeof buf) - 1;
3355 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003356#endif
3357#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003358 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003359#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003360#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3363 return NULL;
3364 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3365 return NULL;
3366 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003367#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003368#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003369 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3370 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003371#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003372 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003373#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003374 memset((void *) &data, '\0', sizeof(data));
3375 result = gethostbyname_r(name, &hp_allocated, &data);
3376 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003377#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003378#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003379#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003380 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003381#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003382 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003383#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003384 Py_END_ALLOW_THREADS
3385 /* Some C libraries would require addr.__ss_family instead of
3386 addr.ss_family.
3387 Therefore, we cast the sockaddr_storage into sockaddr to
3388 access sa_family. */
3389 sa = (struct sockaddr*)&addr;
3390 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3391 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003392#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003393 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003394#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003395 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003396}
3397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003398PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003399"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3400\n\
3401Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003402for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003403
3404
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003405/* Python interface to gethostbyaddr(IP). */
3406
3407/*ARGSUSED*/
3408static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003409socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003410{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003411#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003412 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003413#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003414 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003415#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003416 struct sockaddr *sa = (struct sockaddr *)&addr;
3417 char *ip_num;
3418 struct hostent *h;
3419 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003420#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003421 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003422#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003423 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003424#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003425 /* glibcs up to 2.10 assume that the buf argument to
3426 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3427 does not ensure. The attribute below instructs the compiler
3428 to maintain this alignment. */
3429 char buf[16384] Py_ALIGNED(8);
3430 int buf_len = (sizeof buf) - 1;
3431 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003432#endif
3433#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003435#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003436#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 char *ap;
3438 int al;
3439 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003440
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003441 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3442 return NULL;
3443 af = AF_UNSPEC;
3444 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3445 return NULL;
3446 af = sa->sa_family;
3447 ap = NULL;
3448 switch (af) {
3449 case AF_INET:
3450 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3451 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3452 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003453#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003454 case AF_INET6:
3455 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3456 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3457 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003458#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003459 default:
3460 PyErr_SetString(socket_error, "unsupported address family");
3461 return NULL;
3462 }
3463 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003464#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003465#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 result = gethostbyaddr_r(ap, al, af,
3467 &hp_allocated, buf, buf_len,
3468 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003469#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003470 h = gethostbyaddr_r(ap, al, af,
3471 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003472#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003473 memset((void *) &data, '\0', sizeof(data));
3474 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3475 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003476#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003477#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003478#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003479 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003480#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003481 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003482#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003483 Py_END_ALLOW_THREADS
3484 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003485#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003486 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003487#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003488 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003489}
3490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003491PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003492"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3493\n\
3494Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003495for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003496
Guido van Rossum30a685f1991-06-27 15:51:29 +00003497
3498/* Python interface to getservbyname(name).
3499 This only returns the port number, since the other info is already
3500 known or not useful (like the list of aliases). */
3501
3502/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003504socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003505{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003506 char *name, *proto=NULL;
3507 struct servent *sp;
3508 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3509 return NULL;
3510 Py_BEGIN_ALLOW_THREADS
3511 sp = getservbyname(name, proto);
3512 Py_END_ALLOW_THREADS
3513 if (sp == NULL) {
3514 PyErr_SetString(socket_error, "service/proto not found");
3515 return NULL;
3516 }
3517 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003518}
3519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003521"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003522\n\
3523Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003524The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3525otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003526
Guido van Rossum30a685f1991-06-27 15:51:29 +00003527
Barry Warsaw11b91a02004-06-28 00:50:43 +00003528/* Python interface to getservbyport(port).
3529 This only returns the service name, since the other info is already
3530 known or not useful (like the list of aliases). */
3531
3532/*ARGSUSED*/
3533static PyObject *
3534socket_getservbyport(PyObject *self, PyObject *args)
3535{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003536 int port;
3537 char *proto=NULL;
3538 struct servent *sp;
3539 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3540 return NULL;
3541 if (port < 0 || port > 0xffff) {
3542 PyErr_SetString(
3543 PyExc_OverflowError,
3544 "getservbyport: port must be 0-65535.");
3545 return NULL;
3546 }
3547 Py_BEGIN_ALLOW_THREADS
3548 sp = getservbyport(htons((short)port), proto);
3549 Py_END_ALLOW_THREADS
3550 if (sp == NULL) {
3551 PyErr_SetString(socket_error, "port/proto not found");
3552 return NULL;
3553 }
3554 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003555}
3556
3557PyDoc_STRVAR(getservbyport_doc,
3558"getservbyport(port[, protocolname]) -> string\n\
3559\n\
3560Return the service name from a port number and protocol name.\n\
3561The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3562otherwise any protocol will match.");
3563
Guido van Rossum3901d851996-12-19 16:35:04 +00003564/* Python interface to getprotobyname(name).
3565 This only returns the protocol number, since the other info is
3566 already known or not useful (like the list of aliases). */
3567
3568/*ARGSUSED*/
3569static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003570socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003571{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003572 char *name;
3573 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003574#ifdef __BEOS__
3575/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003576 PyErr_SetString(socket_error, "getprotobyname not supported");
3577 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003578#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003579 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3580 return NULL;
3581 Py_BEGIN_ALLOW_THREADS
3582 sp = getprotobyname(name);
3583 Py_END_ALLOW_THREADS
3584 if (sp == NULL) {
3585 PyErr_SetString(socket_error, "protocol not found");
3586 return NULL;
3587 }
3588 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003589#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003590}
3591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003592PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003593"getprotobyname(name) -> integer\n\
3594\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003595Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003596
Guido van Rossum3901d851996-12-19 16:35:04 +00003597
Dave Cole331708b2004-08-09 04:51:41 +00003598#ifdef HAVE_SOCKETPAIR
3599/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003600 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003601 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003602
3603/*ARGSUSED*/
3604static PyObject *
3605socket_socketpair(PyObject *self, PyObject *args)
3606{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003607 PySocketSockObject *s0 = NULL, *s1 = NULL;
3608 SOCKET_T sv[2];
3609 int family, type = SOCK_STREAM, proto = 0;
3610 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003611
3612#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003613 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003614#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003615 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003616#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003617 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3618 &family, &type, &proto))
3619 return NULL;
3620 /* Create a pair of socket fds */
3621 if (socketpair(family, type, proto, sv) < 0)
3622 return set_error();
3623 s0 = new_sockobject(sv[0], family, type, proto);
3624 if (s0 == NULL)
3625 goto finally;
3626 s1 = new_sockobject(sv[1], family, type, proto);
3627 if (s1 == NULL)
3628 goto finally;
3629 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003630
3631finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003632 if (res == NULL) {
3633 if (s0 == NULL)
3634 SOCKETCLOSE(sv[0]);
3635 if (s1 == NULL)
3636 SOCKETCLOSE(sv[1]);
3637 }
3638 Py_XDECREF(s0);
3639 Py_XDECREF(s1);
3640 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003641}
3642
3643PyDoc_STRVAR(socketpair_doc,
3644"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3645\n\
3646Create a pair of socket objects from the sockets returned by the platform\n\
3647socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003648The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003649AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003650
3651#endif /* HAVE_SOCKETPAIR */
3652
3653
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003654#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003655/* Create a socket object from a numeric file description.
3656 Useful e.g. if stdin is a socket.
3657 Additional arguments as for socket(). */
3658
3659/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003660static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003661socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003662{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003663 PySocketSockObject *s;
3664 SOCKET_T fd;
3665 int family, type, proto = 0;
3666 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3667 &fd, &family, &type, &proto))
3668 return NULL;
3669 /* Dup the fd so it and the socket can be closed independently */
3670 fd = dup(fd);
3671 if (fd < 0)
3672 return set_error();
3673 s = new_sockobject(fd, family, type, proto);
3674 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003675}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003676
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003677PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003678"fromfd(fd, family, type[, proto]) -> socket object\n\
3679\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003680Create a socket object from a duplicate of the given\n\
3681file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003682The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003683
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003684#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003685
Guido van Rossum82a5c661998-07-07 20:45:43 +00003686
Guido van Rossum006bf911996-06-12 04:04:55 +00003687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003688socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003689{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003690 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003691
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003692 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3693 return NULL;
3694 }
3695 if (x1 < 0) {
3696 PyErr_SetString(PyExc_OverflowError,
3697 "can't convert negative number to unsigned long");
3698 return NULL;
3699 }
3700 x2 = (unsigned int)ntohs((unsigned short)x1);
3701 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003702}
3703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003704PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003705"ntohs(integer) -> integer\n\
3706\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003707Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003708
3709
Guido van Rossum006bf911996-06-12 04:04:55 +00003710static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003711socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003712{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003713 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003715 if (PyInt_Check(arg)) {
3716 x = PyInt_AS_LONG(arg);
3717 if (x == (unsigned long) -1 && PyErr_Occurred())
3718 return NULL;
3719 if ((long)x < 0) {
3720 PyErr_SetString(PyExc_OverflowError,
3721 "can't convert negative number to unsigned long");
3722 return NULL;
3723 }
3724 }
3725 else if (PyLong_Check(arg)) {
3726 x = PyLong_AsUnsignedLong(arg);
3727 if (x == (unsigned long) -1 && PyErr_Occurred())
3728 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003729#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003730 {
3731 unsigned long y;
3732 /* only want the trailing 32 bits */
3733 y = x & 0xFFFFFFFFUL;
3734 if (y ^ x)
3735 return PyErr_Format(PyExc_OverflowError,
3736 "long int larger than 32 bits");
3737 x = y;
3738 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003739#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003740 }
3741 else
3742 return PyErr_Format(PyExc_TypeError,
3743 "expected int/long, %s found",
3744 Py_TYPE(arg)->tp_name);
3745 if (x == (unsigned long) -1 && PyErr_Occurred())
3746 return NULL;
3747 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003748}
3749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003750PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003751"ntohl(integer) -> integer\n\
3752\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003753Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003754
3755
Guido van Rossum006bf911996-06-12 04:04:55 +00003756static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003757socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003758{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003759 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003760
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003761 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3762 return NULL;
3763 }
3764 if (x1 < 0) {
3765 PyErr_SetString(PyExc_OverflowError,
3766 "can't convert negative number to unsigned long");
3767 return NULL;
3768 }
3769 x2 = (unsigned int)htons((unsigned short)x1);
3770 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003771}
3772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003773PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003774"htons(integer) -> integer\n\
3775\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003776Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003777
3778
Guido van Rossum006bf911996-06-12 04:04:55 +00003779static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003780socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003781{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003782 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003783
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003784 if (PyInt_Check(arg)) {
3785 x = PyInt_AS_LONG(arg);
3786 if (x == (unsigned long) -1 && PyErr_Occurred())
3787 return NULL;
3788 if ((long)x < 0) {
3789 PyErr_SetString(PyExc_OverflowError,
3790 "can't convert negative number to unsigned long");
3791 return NULL;
3792 }
3793 }
3794 else if (PyLong_Check(arg)) {
3795 x = PyLong_AsUnsignedLong(arg);
3796 if (x == (unsigned long) -1 && PyErr_Occurred())
3797 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003798#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003799 {
3800 unsigned long y;
3801 /* only want the trailing 32 bits */
3802 y = x & 0xFFFFFFFFUL;
3803 if (y ^ x)
3804 return PyErr_Format(PyExc_OverflowError,
3805 "long int larger than 32 bits");
3806 x = y;
3807 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003808#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 }
3810 else
3811 return PyErr_Format(PyExc_TypeError,
3812 "expected int/long, %s found",
3813 Py_TYPE(arg)->tp_name);
3814 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003815}
3816
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003817PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003818"htonl(integer) -> integer\n\
3819\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003820Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003821
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003822/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003823
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003824PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003825"inet_aton(string) -> packed 32-bit IP representation\n\
3826\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003827Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003828binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003829
3830static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003831socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003832{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003833#ifndef INADDR_NONE
3834#define INADDR_NONE (-1)
3835#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003836#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003837 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003838#endif
3839
3840#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003841#if (SIZEOF_INT != 4)
3842#error "Not sure if in_addr_t exists and int is not 32-bits."
3843#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003844 /* Have to use inet_addr() instead */
3845 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003846#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003847 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003849 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3850 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003851
Tim Peters1df9fdd2003-02-13 03:13:40 +00003852
3853#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003854
3855#ifdef USE_INET_ATON_WEAKLINK
3856 if (inet_aton != NULL) {
3857#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003858 if (inet_aton(ip_addr, &buf))
3859 return PyString_FromStringAndSize((char *)(&buf),
3860 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003861
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003862 PyErr_SetString(socket_error,
3863 "illegal IP address string passed to inet_aton");
3864 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003865
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003866#ifdef USE_INET_ATON_WEAKLINK
3867 } else {
3868#endif
3869
3870#endif
3871
3872#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3873
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003874 /* special-case this address as inet_addr might return INADDR_NONE
3875 * for this */
3876 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3877 packed_addr = 0xFFFFFFFF;
3878 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003879
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003880 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003881
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003882 if (packed_addr == INADDR_NONE) { /* invalid address */
3883 PyErr_SetString(socket_error,
3884 "illegal IP address string passed to inet_aton");
3885 return NULL;
3886 }
3887 }
3888 return PyString_FromStringAndSize((char *) &packed_addr,
3889 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003890
3891#ifdef USE_INET_ATON_WEAKLINK
3892 }
3893#endif
3894
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003895#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003896}
3897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003898PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003899"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003901Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003902
3903static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003904socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003905{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003906 char *packed_str;
3907 int addr_len;
3908 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003909
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003910 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3911 return NULL;
3912 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003913
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003914 if (addr_len != sizeof(packed_addr)) {
3915 PyErr_SetString(socket_error,
3916 "packed IP wrong length for inet_ntoa");
3917 return NULL;
3918 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003919
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003920 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003922 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003923}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003924
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003925#ifdef HAVE_INET_PTON
3926
3927PyDoc_STRVAR(inet_pton_doc,
3928"inet_pton(af, ip) -> packed IP address string\n\
3929\n\
3930Convert an IP address from string format to a packed string suitable\n\
3931for use with low-level network functions.");
3932
3933static PyObject *
3934socket_inet_pton(PyObject *self, PyObject *args)
3935{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003936 int af;
3937 char* ip;
3938 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003939#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003940 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003941#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003942 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003943#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003944 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3945 return NULL;
3946 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003947
Martin v. Löwis04697e82004-06-02 12:35:29 +00003948#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003949 if(af == AF_INET6) {
3950 PyErr_SetString(socket_error,
3951 "can't use AF_INET6, IPv6 is disabled");
3952 return NULL;
3953 }
Martin Blais2856e5f2006-05-26 12:03:27 +00003954#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003955
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003956 retval = inet_pton(af, ip, packed);
3957 if (retval < 0) {
3958 PyErr_SetFromErrno(socket_error);
3959 return NULL;
3960 } else if (retval == 0) {
3961 PyErr_SetString(socket_error,
3962 "illegal IP address string passed to inet_pton");
3963 return NULL;
3964 } else if (af == AF_INET) {
3965 return PyString_FromStringAndSize(packed,
3966 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003967#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003968 } else if (af == AF_INET6) {
3969 return PyString_FromStringAndSize(packed,
3970 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003971#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003972 } else {
3973 PyErr_SetString(socket_error, "unknown address family");
3974 return NULL;
3975 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003976}
Martin Blais2856e5f2006-05-26 12:03:27 +00003977
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003978PyDoc_STRVAR(inet_ntop_doc,
3979"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3980\n\
3981Convert a packed IP address of the given family to string format.");
3982
3983static PyObject *
3984socket_inet_ntop(PyObject *self, PyObject *args)
3985{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003986 int af;
3987 char* packed;
3988 int len;
3989 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003990#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003991 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003992#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003993 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003994#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00003995
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003996 /* Guarantee NUL-termination for PyString_FromString() below */
3997 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003998
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003999 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4000 return NULL;
4001 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004002
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004003 if (af == AF_INET) {
4004 if (len != sizeof(struct in_addr)) {
4005 PyErr_SetString(PyExc_ValueError,
4006 "invalid length of packed IP address string");
4007 return NULL;
4008 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004009#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004010 } else if (af == AF_INET6) {
4011 if (len != sizeof(struct in6_addr)) {
4012 PyErr_SetString(PyExc_ValueError,
4013 "invalid length of packed IP address string");
4014 return NULL;
4015 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004016#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004017 } else {
4018 PyErr_Format(PyExc_ValueError,
4019 "unknown address family %d", af);
4020 return NULL;
4021 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004023 retval = inet_ntop(af, packed, ip, sizeof(ip));
4024 if (!retval) {
4025 PyErr_SetFromErrno(socket_error);
4026 return NULL;
4027 } else {
4028 return PyString_FromString(retval);
4029 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004030
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004031 /* NOTREACHED */
4032 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4033 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004034}
4035
4036#endif /* HAVE_INET_PTON */
4037
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004038/* Python interface to getaddrinfo(host, port). */
4039
4040/*ARGSUSED*/
4041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004042socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004043{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004044 struct addrinfo hints, *res;
4045 struct addrinfo *res0 = NULL;
4046 PyObject *hobj = NULL;
4047 PyObject *pobj = (PyObject *)NULL;
4048 char pbuf[30];
4049 char *hptr, *pptr;
4050 int family, socktype, protocol, flags;
4051 int error;
4052 PyObject *all = (PyObject *)NULL;
4053 PyObject *single = (PyObject *)NULL;
4054 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004055
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004056 family = socktype = protocol = flags = 0;
4057 family = AF_UNSPEC;
4058 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4059 &hobj, &pobj, &family, &socktype,
4060 &protocol, &flags)) {
4061 return NULL;
4062 }
4063 if (hobj == Py_None) {
4064 hptr = NULL;
4065 } else if (PyUnicode_Check(hobj)) {
4066 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4067 if (!idna)
4068 return NULL;
4069 hptr = PyString_AsString(idna);
4070 } else if (PyString_Check(hobj)) {
4071 hptr = PyString_AsString(hobj);
4072 } else {
4073 PyErr_SetString(PyExc_TypeError,
4074 "getaddrinfo() argument 1 must be string or None");
4075 return NULL;
4076 }
4077 if (PyInt_Check(pobj)) {
4078 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4079 pptr = pbuf;
4080 } else if (PyString_Check(pobj)) {
4081 pptr = PyString_AsString(pobj);
4082 } else if (pobj == Py_None) {
4083 pptr = (char *)NULL;
4084 } else {
4085 PyErr_SetString(socket_error, "Int or String expected");
4086 goto err;
4087 }
4088 memset(&hints, 0, sizeof(hints));
4089 hints.ai_family = family;
4090 hints.ai_socktype = socktype;
4091 hints.ai_protocol = protocol;
4092 hints.ai_flags = flags;
4093 Py_BEGIN_ALLOW_THREADS
4094 ACQUIRE_GETADDRINFO_LOCK
4095 error = getaddrinfo(hptr, pptr, &hints, &res0);
4096 Py_END_ALLOW_THREADS
4097 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4098 if (error) {
4099 set_gaierror(error);
4100 goto err;
4101 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004102
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004103 if ((all = PyList_New(0)) == NULL)
4104 goto err;
4105 for (res = res0; res; res = res->ai_next) {
4106 PyObject *addr =
4107 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4108 if (addr == NULL)
4109 goto err;
4110 single = Py_BuildValue("iiisO", res->ai_family,
4111 res->ai_socktype, res->ai_protocol,
4112 res->ai_canonname ? res->ai_canonname : "",
4113 addr);
4114 Py_DECREF(addr);
4115 if (single == NULL)
4116 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004117
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004118 if (PyList_Append(all, single))
4119 goto err;
4120 Py_XDECREF(single);
4121 }
4122 Py_XDECREF(idna);
4123 if (res0)
4124 freeaddrinfo(res0);
4125 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004126 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004127 Py_XDECREF(single);
4128 Py_XDECREF(all);
4129 Py_XDECREF(idna);
4130 if (res0)
4131 freeaddrinfo(res0);
4132 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004133}
4134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004135PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004136"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4137 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004139Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004140
4141/* Python interface to getnameinfo(sa, flags). */
4142
4143/*ARGSUSED*/
4144static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004145socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004146{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004147 PyObject *sa = (PyObject *)NULL;
4148 int flags;
4149 char *hostp;
4150 int port, flowinfo, scope_id;
4151 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4152 struct addrinfo hints, *res = NULL;
4153 int error;
4154 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004156 flags = flowinfo = scope_id = 0;
4157 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4158 return NULL;
4159 if (!PyTuple_Check(sa)) {
4160 PyErr_SetString(PyExc_TypeError,
4161 "getnameinfo() argument 1 must be a tuple");
4162 return NULL;
4163 }
4164 if (!PyArg_ParseTuple(sa, "si|ii",
4165 &hostp, &port, &flowinfo, &scope_id))
4166 return NULL;
4167 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4168 memset(&hints, 0, sizeof(hints));
4169 hints.ai_family = AF_UNSPEC;
4170 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4171 Py_BEGIN_ALLOW_THREADS
4172 ACQUIRE_GETADDRINFO_LOCK
4173 error = getaddrinfo(hostp, pbuf, &hints, &res);
4174 Py_END_ALLOW_THREADS
4175 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4176 if (error) {
4177 set_gaierror(error);
4178 goto fail;
4179 }
4180 if (res->ai_next) {
4181 PyErr_SetString(socket_error,
4182 "sockaddr resolved to multiple addresses");
4183 goto fail;
4184 }
4185 switch (res->ai_family) {
4186 case AF_INET:
4187 {
4188 if (PyTuple_GET_SIZE(sa) != 2) {
4189 PyErr_SetString(socket_error,
4190 "IPv4 sockaddr must be 2 tuple");
4191 goto fail;
4192 }
4193 break;
4194 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004195#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004196 case AF_INET6:
4197 {
4198 struct sockaddr_in6 *sin6;
4199 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4200 sin6->sin6_flowinfo = flowinfo;
4201 sin6->sin6_scope_id = scope_id;
4202 break;
4203 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004204#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004205 }
4206 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4207 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4208 if (error) {
4209 set_gaierror(error);
4210 goto fail;
4211 }
4212 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004213
4214fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004215 if (res)
4216 freeaddrinfo(res);
4217 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004218}
4219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004220PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004221"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004222\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004223Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004224
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004225
4226/* Python API to getting and setting the default timeout value. */
4227
4228static PyObject *
4229socket_getdefaulttimeout(PyObject *self)
4230{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004231 if (defaulttimeout < 0.0) {
4232 Py_INCREF(Py_None);
4233 return Py_None;
4234 }
4235 else
4236 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004237}
4238
4239PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004240"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004241\n\
4242Returns the default timeout in floating seconds for new socket objects.\n\
4243A value of None indicates that new socket objects have no timeout.\n\
4244When the socket module is first imported, the default is None.");
4245
4246static PyObject *
4247socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4248{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004249 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004251 if (arg == Py_None)
4252 timeout = -1.0;
4253 else {
4254 timeout = PyFloat_AsDouble(arg);
4255 if (timeout < 0.0) {
4256 if (!PyErr_Occurred())
4257 PyErr_SetString(PyExc_ValueError,
4258 "Timeout value out of range");
4259 return NULL;
4260 }
4261 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004262
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004263 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004264
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004265 Py_INCREF(Py_None);
4266 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004267}
4268
4269PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004270"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004271\n\
4272Set the default timeout in floating seconds for new socket objects.\n\
4273A value of None indicates that new socket objects have no timeout.\n\
4274When the socket module is first imported, the default is None.");
4275
4276
Guido van Rossum30a685f1991-06-27 15:51:29 +00004277/* List of functions exported by this module. */
4278
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004279static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004280 {"gethostbyname", socket_gethostbyname,
4281 METH_VARARGS, gethostbyname_doc},
4282 {"gethostbyname_ex", socket_gethostbyname_ex,
4283 METH_VARARGS, ghbn_ex_doc},
4284 {"gethostbyaddr", socket_gethostbyaddr,
4285 METH_VARARGS, gethostbyaddr_doc},
4286 {"gethostname", socket_gethostname,
4287 METH_NOARGS, gethostname_doc},
4288 {"getservbyname", socket_getservbyname,
4289 METH_VARARGS, getservbyname_doc},
4290 {"getservbyport", socket_getservbyport,
4291 METH_VARARGS, getservbyport_doc},
4292 {"getprotobyname", socket_getprotobyname,
4293 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004294#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004295 {"fromfd", socket_fromfd,
4296 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004297#endif
Dave Cole331708b2004-08-09 04:51:41 +00004298#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004299 {"socketpair", socket_socketpair,
4300 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004301#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004302 {"ntohs", socket_ntohs,
4303 METH_VARARGS, ntohs_doc},
4304 {"ntohl", socket_ntohl,
4305 METH_O, ntohl_doc},
4306 {"htons", socket_htons,
4307 METH_VARARGS, htons_doc},
4308 {"htonl", socket_htonl,
4309 METH_O, htonl_doc},
4310 {"inet_aton", socket_inet_aton,
4311 METH_VARARGS, inet_aton_doc},
4312 {"inet_ntoa", socket_inet_ntoa,
4313 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004314#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004315 {"inet_pton", socket_inet_pton,
4316 METH_VARARGS, inet_pton_doc},
4317 {"inet_ntop", socket_inet_ntop,
4318 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004319#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004320 {"getaddrinfo", socket_getaddrinfo,
4321 METH_VARARGS, getaddrinfo_doc},
4322 {"getnameinfo", socket_getnameinfo,
4323 METH_VARARGS, getnameinfo_doc},
4324 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4325 METH_NOARGS, getdefaulttimeout_doc},
4326 {"setdefaulttimeout", socket_setdefaulttimeout,
4327 METH_O, setdefaulttimeout_doc},
4328 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004329};
4330
Guido van Rossum30a685f1991-06-27 15:51:29 +00004331
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004332#ifdef RISCOS
4333#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004334
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004335static int
4336os_init(void)
4337{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004338 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004339
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004340 r.r[0] = 0;
4341 _kernel_swi(0x43380, &r, &r);
4342 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004344 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004345}
4346
4347#endif /* RISCOS */
4348
4349
4350#ifdef MS_WINDOWS
4351#define OS_INIT_DEFINED
4352
4353/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004354
4355static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004356os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004357{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004358 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004359}
4360
4361static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004362os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004363{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004364 WSADATA WSAData;
4365 int ret;
4366 char buf[100];
4367 ret = WSAStartup(0x0101, &WSAData);
4368 switch (ret) {
4369 case 0: /* No error */
4370 Py_AtExit(os_cleanup);
4371 return 1; /* Success */
4372 case WSASYSNOTREADY:
4373 PyErr_SetString(PyExc_ImportError,
4374 "WSAStartup failed: network not ready");
4375 break;
4376 case WSAVERNOTSUPPORTED:
4377 case WSAEINVAL:
4378 PyErr_SetString(
4379 PyExc_ImportError,
4380 "WSAStartup failed: requested version not supported");
4381 break;
4382 default:
4383 PyOS_snprintf(buf, sizeof(buf),
4384 "WSAStartup failed: error code %d", ret);
4385 PyErr_SetString(PyExc_ImportError, buf);
4386 break;
4387 }
4388 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004389}
4390
Guido van Rossum8d665e61996-06-26 18:22:49 +00004391#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004392
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004393
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004394#ifdef PYOS_OS2
4395#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004396
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004397/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004398
4399static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004400os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004401{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004402#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004403 char reason[64];
4404 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004405
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004406 if (rc == 0) {
4407 return 1; /* Success */
4408 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004409
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004410 PyOS_snprintf(reason, sizeof(reason),
4411 "OS/2 TCP/IP Error# %d", sock_errno());
4412 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004414 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004415#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004416 /* No need to initialise sockets with GCC/EMX */
4417 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004418#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004419}
4420
4421#endif /* PYOS_OS2 */
4422
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004423
4424#ifndef OS_INIT_DEFINED
4425static int
4426os_init(void)
4427{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004428 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004429}
4430#endif
4431
4432
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004433/* C API table - always add new things to the end for binary
4434 compatibility. */
4435static
4436PySocketModule_APIObject PySocketModuleAPI =
4437{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004438 &sock_type,
4439 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004440};
4441
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004442
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004443/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004444
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004445 This module is actually called "_socket", and there's a wrapper
4446 "socket.py" which implements some additional functionality. On some
4447 platforms (e.g. Windows and OS/2), socket.py also implements a
4448 wrapper for the socket type that provides missing functionality such
4449 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4450 with an ImportError exception if os-specific initialization fails.
4451 On Windows, this does WINSOCK initialization. When WINSOCK is
4452 initialized succesfully, a call to WSACleanup() is scheduled to be
4453 made at exit time.
4454*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004456PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004457"Implementation module for socket operations.\n\
4458\n\
4459See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004460
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004461PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004462init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004463{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004464 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004465
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004466 if (!os_init())
4467 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004469 Py_TYPE(&sock_type) = &PyType_Type;
4470 m = Py_InitModule3(PySocket_MODULE_NAME,
4471 socket_methods,
4472 socket_doc);
4473 if (m == NULL)
4474 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004475
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004476 socket_error = PyErr_NewException("socket.error",
4477 PyExc_IOError, NULL);
4478 if (socket_error == NULL)
4479 return;
4480 PySocketModuleAPI.error = socket_error;
4481 Py_INCREF(socket_error);
4482 PyModule_AddObject(m, "error", socket_error);
4483 socket_herror = PyErr_NewException("socket.herror",
4484 socket_error, NULL);
4485 if (socket_herror == NULL)
4486 return;
4487 Py_INCREF(socket_herror);
4488 PyModule_AddObject(m, "herror", socket_herror);
4489 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4490 NULL);
4491 if (socket_gaierror == NULL)
4492 return;
4493 Py_INCREF(socket_gaierror);
4494 PyModule_AddObject(m, "gaierror", socket_gaierror);
4495 socket_timeout = PyErr_NewException("socket.timeout",
4496 socket_error, NULL);
4497 if (socket_timeout == NULL)
4498 return;
4499 Py_INCREF(socket_timeout);
4500 PyModule_AddObject(m, "timeout", socket_timeout);
4501 Py_INCREF((PyObject *)&sock_type);
4502 if (PyModule_AddObject(m, "SocketType",
4503 (PyObject *)&sock_type) != 0)
4504 return;
4505 Py_INCREF((PyObject *)&sock_type);
4506 if (PyModule_AddObject(m, "socket",
4507 (PyObject *)&sock_type) != 0)
4508 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004509
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004510#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004511 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004512#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004513 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004514#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004515 Py_INCREF(has_ipv6);
4516 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004517
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004518 /* Export C API */
4519 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4520 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4521 ) != 0)
4522 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004523
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004524 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004525#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004526 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004527#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004528 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004529#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004530 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004531#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004532#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004533 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004534#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004535#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004536 /* Amateur Radio AX.25 */
4537 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004538#endif
4539#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004540 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004541#endif
4542#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004543 /* Appletalk DDP */
4544 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004545#endif
4546#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004547 /* Amateur radio NetROM */
4548 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004549#endif
4550#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004551 /* Multiprotocol bridge */
4552 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004553#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004554#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004555 /* ATM PVCs */
4556 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004557#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004558#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004559 /* Reserved for Werner's ATM */
4560 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004561#endif
4562#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004563 /* Reserved for X.25 project */
4564 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004565#endif
4566#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004567 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004568#endif
4569#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004570 /* Amateur Radio X.25 PLP */
4571 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004572#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004573#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004574 /* Reserved for DECnet project */
4575 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004576#endif
4577#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004578 /* Reserved for 802.2LLC project */
4579 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004580#endif
4581#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004582 /* Security callback pseudo AF */
4583 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004584#endif
4585#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004586 /* PF_KEY key management API */
4587 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004588#endif
4589#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004590 /* */
4591 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4592 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004593#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004594 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004595#endif
4596#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004597 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004598#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004599 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4600 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004601#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004602 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004603#endif
4604#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004605 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004606#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004607#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004608 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004609#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004610#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004611 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004612#endif
4613#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004614 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004615#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004616 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004617#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004618 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4619#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004620#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004621 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004622#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004623#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004624#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004625 /* Alias to emulate 4.4BSD */
4626 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004627#endif
4628#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004629 /* Ash */
4630 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004631#endif
4632#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004633 /* Acorn Econet */
4634 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004635#endif
4636#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004637 /* ATM SVCs */
4638 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004639#endif
4640#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004641 /* Linux SNA Project (nutters!) */
4642 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004643#endif
4644#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004645 /* IRDA sockets */
4646 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004647#endif
4648#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004649 /* PPPoX sockets */
4650 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004651#endif
4652#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004653 /* Wanpipe API Sockets */
4654 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004655#endif
4656#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004657 /* Linux LLC */
4658 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004659#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004660
Hye-Shik Chang81268602004-02-02 06:05:24 +00004661#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004662 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4663 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4664 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4665 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004666#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004668#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004669#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004670#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004672#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004673 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4674 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004675#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004676 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4677 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4678 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004679#endif
4680
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004681#ifdef AF_PACKET
4682 PyModule_AddIntMacro(m, AF_PACKET);
4683#endif
4684#ifdef PF_PACKET
4685 PyModule_AddIntMacro(m, PF_PACKET);
4686#endif
4687#ifdef PACKET_HOST
4688 PyModule_AddIntMacro(m, PACKET_HOST);
4689#endif
4690#ifdef PACKET_BROADCAST
4691 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4692#endif
4693#ifdef PACKET_MULTICAST
4694 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4695#endif
4696#ifdef PACKET_OTHERHOST
4697 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4698#endif
4699#ifdef PACKET_OUTGOING
4700 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4701#endif
4702#ifdef PACKET_LOOPBACK
4703 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4704#endif
4705#ifdef PACKET_FASTROUTE
4706 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004707#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004708
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004709#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004710 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004712 /* for addresses */
4713 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4714 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4715 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004716
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004717 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4718 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4719 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004720
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004721 /* for setsockopt() */
4722 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4723 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4724 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4725 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4726 TIPC_DEST_DROPPABLE);
4727 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004728
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004729 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4730 TIPC_LOW_IMPORTANCE);
4731 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4732 TIPC_MEDIUM_IMPORTANCE);
4733 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4734 TIPC_HIGH_IMPORTANCE);
4735 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4736 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004737
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004738 /* for subscriptions */
4739 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4740 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004741#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 /* doesn't seem to be available everywhere */
4743 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004744#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4746 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4747 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4748 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4749 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4750 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004751#endif
4752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004753 /* Socket types */
4754 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4755 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004756#ifndef __BEOS__
4757/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4759 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004760#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004761 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004762#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004763#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004764
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004765#ifdef SO_DEBUG
4766 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004767#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004768#ifdef SO_ACCEPTCONN
4769 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004770#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771#ifdef SO_REUSEADDR
4772 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004773#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004774#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004776#endif
4777
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004778#ifdef SO_KEEPALIVE
4779 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004780#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004781#ifdef SO_DONTROUTE
4782 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004783#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004784#ifdef SO_BROADCAST
4785 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004786#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004787#ifdef SO_USELOOPBACK
4788 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004789#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004790#ifdef SO_LINGER
4791 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004792#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004793#ifdef SO_OOBINLINE
4794 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004795#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004796#ifdef SO_REUSEPORT
4797 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004798#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004799#ifdef SO_SNDBUF
4800 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004801#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004802#ifdef SO_RCVBUF
4803 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004804#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004805#ifdef SO_SNDLOWAT
4806 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004807#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004808#ifdef SO_RCVLOWAT
4809 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004810#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004811#ifdef SO_SNDTIMEO
4812 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004813#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004814#ifdef SO_RCVTIMEO
4815 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004816#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004817#ifdef SO_ERROR
4818 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004819#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004820#ifdef SO_TYPE
4821 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004822#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004823#ifdef SO_SETFIB
4824 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4825#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004826
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004827 /* Maximum number of connections for "listen" */
4828#ifdef SOMAXCONN
4829 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004830#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004831 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004832#endif
4833
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004834 /* Flags for send, recv */
4835#ifdef MSG_OOB
4836 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004837#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004838#ifdef MSG_PEEK
4839 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004840#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004841#ifdef MSG_DONTROUTE
4842 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004843#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004844#ifdef MSG_DONTWAIT
4845 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004846#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004847#ifdef MSG_EOR
4848 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004849#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004850#ifdef MSG_TRUNC
4851 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004852#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004853#ifdef MSG_CTRUNC
4854 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004855#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004856#ifdef MSG_WAITALL
4857 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004858#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004859#ifdef MSG_BTAG
4860 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004861#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004862#ifdef MSG_ETAG
4863 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004864#endif
4865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866 /* Protocol level and numbers, usable for [gs]etsockopt */
4867#ifdef SOL_SOCKET
4868 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004869#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004870#ifdef SOL_IP
4871 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004872#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004873 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004874#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875#ifdef SOL_IPX
4876 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004877#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004878#ifdef SOL_AX25
4879 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004880#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004881#ifdef SOL_ATALK
4882 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004883#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004884#ifdef SOL_NETROM
4885 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004886#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004887#ifdef SOL_ROSE
4888 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004889#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004890#ifdef SOL_TCP
4891 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004892#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004893 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004894#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004895#ifdef SOL_UDP
4896 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004897#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004898 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004899#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004900#ifdef IPPROTO_IP
4901 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004902#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef IPPROTO_HOPOPTS
4906 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef IPPROTO_ICMP
4909 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004910#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004911 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004912#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004913#ifdef IPPROTO_IGMP
4914 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004915#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004916#ifdef IPPROTO_GGP
4917 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004918#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004919#ifdef IPPROTO_IPV4
4920 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004921#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004922#ifdef IPPROTO_IPV6
4923 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004924#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004925#ifdef IPPROTO_IPIP
4926 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004927#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004928#ifdef IPPROTO_TCP
4929 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004930#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004931 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef IPPROTO_EGP
4934 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004936#ifdef IPPROTO_PUP
4937 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004938#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004939#ifdef IPPROTO_UDP
4940 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004941#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004942 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004943#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004944#ifdef IPPROTO_IDP
4945 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004946#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004947#ifdef IPPROTO_HELLO
4948 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004949#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004950#ifdef IPPROTO_ND
4951 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004952#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004953#ifdef IPPROTO_TP
4954 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004955#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004956#ifdef IPPROTO_IPV6
4957 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004958#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004959#ifdef IPPROTO_ROUTING
4960 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004962#ifdef IPPROTO_FRAGMENT
4963 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004964#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004965#ifdef IPPROTO_RSVP
4966 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004967#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004968#ifdef IPPROTO_GRE
4969 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004970#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004971#ifdef IPPROTO_ESP
4972 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004973#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004974#ifdef IPPROTO_AH
4975 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004976#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004977#ifdef IPPROTO_MOBILE
4978 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004979#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004980#ifdef IPPROTO_ICMPV6
4981 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004982#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004983#ifdef IPPROTO_NONE
4984 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004985#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004986#ifdef IPPROTO_DSTOPTS
4987 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004988#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004989#ifdef IPPROTO_XTP
4990 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004991#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004992#ifdef IPPROTO_EON
4993 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004994#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004995#ifdef IPPROTO_PIM
4996 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004997#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004998#ifdef IPPROTO_IPCOMP
4999 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005000#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005001#ifdef IPPROTO_VRRP
5002 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005003#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005004#ifdef IPPROTO_BIP
5005 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005006#endif
5007/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef IPPROTO_RAW
5009 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005010#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef IPPROTO_MAX
5014 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005015#endif
5016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005017 /* Some port configuration */
5018#ifdef IPPORT_RESERVED
5019 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005020#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005022#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005023#ifdef IPPORT_USERRESERVED
5024 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005025#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005026 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005027#endif
5028
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005029 /* Some reserved IP v.4 addresses */
5030#ifdef INADDR_ANY
5031 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005032#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005034#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035#ifdef INADDR_BROADCAST
5036 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005037#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005039#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005040#ifdef INADDR_LOOPBACK
5041 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005042#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef INADDR_UNSPEC_GROUP
5046 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005047#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005050#ifdef INADDR_ALLHOSTS_GROUP
5051 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5052 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005053#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005054 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef INADDR_MAX_LOCAL_GROUP
5057 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5058 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005059#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef INADDR_NONE
5063 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005064#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005066#endif
5067
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005068 /* IPv4 [gs]etsockopt options */
5069#ifdef IP_OPTIONS
5070 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005072#ifdef IP_HDRINCL
5073 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005074#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005075#ifdef IP_TOS
5076 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005077#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005078#ifdef IP_TTL
5079 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IP_RECVOPTS
5082 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IP_RECVRETOPTS
5085 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IP_RECVDSTADDR
5088 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IP_RETOPTS
5091 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IP_MULTICAST_IF
5094 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IP_MULTICAST_TTL
5097 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IP_MULTICAST_LOOP
5100 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IP_ADD_MEMBERSHIP
5103 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IP_DROP_MEMBERSHIP
5106 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IP_DEFAULT_MULTICAST_TTL
5109 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5110 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005112#ifdef IP_DEFAULT_MULTICAST_LOOP
5113 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5114 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005115#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005116#ifdef IP_MAX_MEMBERSHIPS
5117 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005118#endif
5119
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005120 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5121#ifdef IPV6_JOIN_GROUP
5122 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005123#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005124#ifdef IPV6_LEAVE_GROUP
5125 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005126#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005127#ifdef IPV6_MULTICAST_HOPS
5128 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005129#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130#ifdef IPV6_MULTICAST_IF
5131 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005132#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133#ifdef IPV6_MULTICAST_LOOP
5134 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005136#ifdef IPV6_UNICAST_HOPS
5137 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005138#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005140#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005141 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005142#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005143 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005144#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005145 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005146#endif
5147#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005149#endif
5150#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005152#endif
5153#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005155#endif
5156#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005157 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005158#endif
5159#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005161#endif
5162#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005164#endif
5165#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005167#endif
5168#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005169 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005170#endif
5171#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005172 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005173#endif
5174#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005176#endif
5177#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005179#endif
5180#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005182#endif
5183#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005184 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005185#endif
5186#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005188#endif
5189#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005190 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005191#endif
5192#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005194#endif
5195#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005196 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005197#endif
5198#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005200#endif
5201#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005203#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005204
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205 /* TCP options */
5206#ifdef TCP_NODELAY
5207 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005208#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209#ifdef TCP_MAXSEG
5210 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef TCP_CORK
5213 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef TCP_KEEPIDLE
5216 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef TCP_KEEPINTVL
5219 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef TCP_KEEPCNT
5222 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef TCP_SYNCNT
5225 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef TCP_LINGER2
5228 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef TCP_DEFER_ACCEPT
5231 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef TCP_WINDOW_CLAMP
5234 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef TCP_INFO
5237 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef TCP_QUICKACK
5240 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005241#endif
5242
Guido van Rossum09be4091999-08-09 14:40:40 +00005243
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005244 /* IPX options */
5245#ifdef IPX_TYPE
5246 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005247#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005248
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005250#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005251 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005252#endif
5253#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005255#endif
5256#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005257 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005258#endif
5259#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005260 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005261#endif
5262#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005263 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005264#endif
5265#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005266 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005267#endif
5268#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005269 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005270#endif
5271#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005272 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005273#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005274#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005275 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005276#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005277#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005278 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005279#endif
5280#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005282#endif
5283#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005284 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005285#endif
5286#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005287 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005288#endif
5289#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005290 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005291#endif
5292#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005293 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005294#endif
5295#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005296 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005297#endif
5298#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005299 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005300#endif
5301#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005302 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005303#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005305 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005306#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005307#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005308 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005309#endif
5310#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005311 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005312#endif
5313#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005314 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005315#endif
5316#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005317 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005318#endif
5319#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005320 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005321#endif
5322#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005323 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005324#endif
5325#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005326 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005327#endif
5328#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005329 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005330#endif
5331#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005332 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005333#endif
5334#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005335 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005336#endif
5337#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005338 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005339#endif
5340#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005341 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005342#endif
5343#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005344 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005345#endif
5346
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005347 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005348#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005350#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005351 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005352#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005353 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005354#endif
5355#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005356 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005357#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005358 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005359#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005360 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005361#endif
5362#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005363 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005364#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005365 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005366#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005368#endif
5369
Christian Heimes04ae9162008-01-04 15:23:30 +00005370#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005371 {
5372 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5373 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5374 int i;
5375 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5376 PyObject *tmp;
5377 tmp = PyLong_FromUnsignedLong(codes[i]);
5378 if (tmp == NULL)
5379 return;
5380 PyModule_AddObject(m, names[i], tmp);
5381 }
5382 }
5383 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5384 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5385 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005386#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005387 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005388#endif
5389#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005390 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005391#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005392#endif /* _MSTCPIP_ */
5393
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005395#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005396 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005397#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005398}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005399
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005400
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005401#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005402#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005403
5404/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005405/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005406
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005407int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005408inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005409{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005410 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005411#if (SIZEOF_INT != 4)
5412#error "Not sure if in_addr_t exists and int is not 32-bits."
5413#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005414 unsigned int packed_addr;
5415 packed_addr = inet_addr(src);
5416 if (packed_addr == INADDR_NONE)
5417 return 0;
5418 memcpy(dst, &packed_addr, 4);
5419 return 1;
5420 }
5421 /* Should set errno to EAFNOSUPPORT */
5422 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005423}
5424
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005425const char *
5426inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005427{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005428 if (af == AF_INET) {
5429 struct in_addr packed_addr;
5430 if (size < 16)
5431 /* Should set errno to ENOSPC. */
5432 return NULL;
5433 memcpy(&packed_addr, src, sizeof(packed_addr));
5434 return strncpy(dst, inet_ntoa(packed_addr), size);
5435 }
5436 /* Should set errno to EAFNOSUPPORT */
5437 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005438}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005439
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005440#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005441#endif