blob: 9c5fa54b89ae0dae18a6f6df539adc80a1573eaa [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__
Ned Deily1c2a7b52016-02-15 16:51:24 +110085#include <AvailabilityMacros.h>
86/* for getaddrinfo thread safety test on old versions of OS X */
87#ifndef MAC_OS_X_VERSION_10_5
88#define MAC_OS_X_VERSION_10_5 1050
89#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +000090 /*
91 * inet_aton is not available on OSX 10.3, yet we want to use a binary
92 * that was build on 10.4 or later to work on that release, weak linking
93 * comes to the rescue.
94 */
95# pragma weak inet_aton
96#endif
97
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098#include "Python.h"
Georg Brandlbc45a3f2006-03-17 19:17:34 +000099#include "structmember.h"
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700100#include "timefuncs.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101
Victor Stinner465db3c2014-07-26 14:47:56 +0200102#ifndef INVALID_SOCKET /* MS defines this */
103#define INVALID_SOCKET (-1)
104#endif
105
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000106#undef MAX
107#define MAX(x, y) ((x) < (y) ? (y) : (x))
108
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000110PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111"socket([family[, type[, proto]]]) -> socket object\n\
112\n\
113Open a socket of the given type. The family argument specifies the\n\
114address family; it defaults to AF_INET. The type argument specifies\n\
115whether this is a stream (SOCK_STREAM, this is the default)\n\
116or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
117specifying the default protocol. Keyword arguments are accepted.\n\
118\n\
119A socket object represents one endpoint of a network connection.\n\
120\n\
121Methods of socket objects (keyword arguments not allowed):\n\
122\n\
123accept() -- accept a connection, returning new socket and client address\n\
124bind(addr) -- bind the socket to a local address\n\
125close() -- close the socket\n\
126connect(addr) -- connect the socket to a remote address\n\
127connect_ex(addr) -- connect, return an error code instead of an exception\n\
128dup() -- return a new socket object identical to the current one [*]\n\
129fileno() -- return underlying file descriptor\n\
130getpeername() -- return remote address [*]\n\
131getsockname() -- return local address\n\
132getsockopt(level, optname[, buflen]) -- get socket options\n\
133gettimeout() -- return timeout or None\n\
134listen(n) -- start listening for incoming connections\n\
135makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
136recv(buflen[, flags]) -- receive data\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000137recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000138recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +0000139recvfrom_into(buffer[, nbytes, [, flags])\n\
Martin Blais2856e5f2006-05-26 12:03:27 +0000140 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141sendall(data[, flags]) -- send all data\n\
142send(data[, flags]) -- send data, may not send all of it\n\
143sendto(data[, flags], addr) -- send data to a given address\n\
144setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
145setsockopt(level, optname, value) -- set socket options\n\
146settimeout(None | float) -- set or clear the timeout\n\
147shutdown(how) -- shut down traffic in one or both directions\n\
148\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000149 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000150
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000151/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000152 I hope some day someone can clean this up please... */
153
Guido van Rossum9376b741999-09-15 22:01:40 +0000154/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
155 script doesn't get this right, so we hardcode some platform checks below.
156 On the other hand, not all Linux versions agree, so there the settings
157 computed by the configure script are needed! */
158
159#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160# undef HAVE_GETHOSTBYNAME_R_3_ARG
161# undef HAVE_GETHOSTBYNAME_R_5_ARG
162# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000163#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000164
Guido van Rossum7a122991999-04-13 04:07:32 +0000165#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000167#endif
168
Guido van Rossume7de2061999-03-24 17:24:33 +0000169#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000170# if defined(_AIX) || defined(__osf__)
171# define HAVE_GETHOSTBYNAME_R_3_ARG
172# elif defined(__sun) || defined(__sgi)
173# define HAVE_GETHOSTBYNAME_R_5_ARG
174# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000175/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# else
177# undef HAVE_GETHOSTBYNAME_R
178# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000179#endif
180
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000181#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
182 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000184#endif
185
Ned Deily3058eb42016-02-23 22:03:39 +1100186/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000187#ifdef HAVE_SYS_PARAM_H
188#include <sys/param.h>
189#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000190/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily1c2a7b52016-02-15 16:51:24 +1100191 (this includes the getaddrinfo emulation) protect access with a lock.
192
193 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
194 a mix of code including an unsafe implementation from an old BSD's
195 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
196 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deily3058eb42016-02-23 22:03:39 +1100197 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily1c2a7b52016-02-15 16:51:24 +1100198
Ned Deily3058eb42016-02-23 22:03:39 +1100199 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
200 http://www.openbsd.org/plus54.html
201
202 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
203
204http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
205*/
Ned Deily1c2a7b52016-02-15 16:51:24 +1100206#if defined(WITH_THREAD) && ( \
207 (defined(__APPLE__) && \
208 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000209 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deily3058eb42016-02-23 22:03:39 +1100210 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
211 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000212 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000213#define USE_GETADDRINFO_LOCK
214#endif
215
216#ifdef USE_GETADDRINFO_LOCK
217#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
218#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
219#else
220#define ACQUIRE_GETADDRINFO_LOCK
221#define RELEASE_GETADDRINFO_LOCK
222#endif
223
224#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000225# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000226#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000227
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000228#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229# include <types.h>
230# include <io.h>
231# include <sys/ioctl.h>
232# include <utils.h>
233# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000234#endif
235
Martin v. Löwis9e437302002-12-06 12:57:26 +0000236#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000237# include <ioctl.h>
238#endif
239
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000240#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241# define INCL_DOS
242# define INCL_DOSERRORS
243# define INCL_NOPMAPI
244# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000245#endif
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248/* make sure that the reentrant (gethostbyaddr_r etc)
249 functions are declared correctly if compiling with
250 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Martin Blais2856e5f2006-05-26 12:03:27 +0000252/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000255#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000256
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000257#undef _XOPEN_SOURCE
258#include <sys/socket.h>
259#include <sys/types.h>
260#include <netinet/in.h>
261#ifdef _SS_ALIGNSIZE
262#define HAVE_GETADDRINFO 1
263#define HAVE_GETNAMEINFO 1
264#endif
265
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000266#define HAVE_INET_PTON
267#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000268#endif
269
Martin Blais2856e5f2006-05-26 12:03:27 +0000270/* Irix 6.5 fails to define this variable at all. This is needed
271 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000272 are just busted. Same thing for Solaris. */
273#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000274#define INET_ADDRSTRLEN 16
275#endif
276
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277/* Generic includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000278#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000279#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000280#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000281
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000282/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000284#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285
286/* Addressing includes */
287
Guido van Rossum6f489d91996-06-28 20:15:15 +0000288#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289
290/* Non-MS WINDOWS includes */
291# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000292
Guido van Rossum9376b741999-09-15 22:01:40 +0000293/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# ifdef __BEOS__
295# include <net/netdb.h>
296# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
297# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000298typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303# ifndef RISCOS
304# include <fcntl.h>
305# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000306# include <sys/ioctl.h>
307# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000308# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000309int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000310# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000311# endif
312
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000313#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000314
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000315/* MS_WINDOWS includes */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000316# ifdef HAVE_FCNTL_H
317# include <fcntl.h>
318# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000319
Jeremy Hylton22308652001-02-02 03:23:09 +0000320#endif
321
Skip Montanaro7befb992004-02-10 16:50:21 +0000322#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000323
324#ifndef offsetof
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000326#endif
327
Neal Norwitz39d22e52002-11-02 19:55:21 +0000328#ifndef O_NONBLOCK
329# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000330#endif
331
Trent Micka708d6e2004-09-07 17:48:26 +0000332/* include Python's addrinfo.h unless it causes trouble */
333#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
334 /* Do not include addinfo.h on some newer IRIX versions.
335 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
336 * for example, but not by 6.5.10.
337 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000338#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000339 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
340 * EAI_* constants are defined in (the already included) ws2tcpip.h.
341 */
342#else
343# include "addrinfo.h"
344#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000345
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000346#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +0000347#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000348int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000349const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000350#endif
Christian Heimese8954f82007-11-22 11:21:16 +0000351#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000352
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000353#ifdef __APPLE__
354/* On OS X, getaddrinfo returns no error indication of lookup
355 failure, so we must use the emulation instead of the libinfo
356 implementation. Unfortunately, performing an autoconf test
357 for this bug would require DNS access for the machine performing
358 the configuration, which is not acceptable. Therefore, we
359 determine the bug just by checking for __APPLE__. If this bug
360 gets ever fixed, perhaps checking for sys/version.h would be
361 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000362#ifndef HAVE_GETNAMEINFO
363/* This bug seems to be fixed in Jaguar. Ths easiest way I could
364 Find to check for Jaguar is that it has getnameinfo(), which
365 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000366#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000367#endif
Ronald Oussorend06b6f22006-04-23 11:59:25 +0000368
369#ifdef HAVE_INET_ATON
370#define USE_INET_ATON_WEAKLINK
371#endif
372
Jack Jansen84262fb2002-07-02 14:40:42 +0000373#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000374
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000375/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000376#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000377/* avoid clashes with the C library definition of the symbol. */
378#define getaddrinfo fake_getaddrinfo
379#define gai_strerror fake_gai_strerror
380#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000381#include "getaddrinfo.c"
382#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000383#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000384#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000385#include "getnameinfo.c"
386#endif
387
Guido van Rossumbcc20741998-08-04 22:53:56 +0000388#if defined(MS_WINDOWS) || defined(__BEOS__)
389/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000390/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000391#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000392#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000393#endif
394
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000395#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000396#define EAFNOSUPPORT WSAEAFNOSUPPORT
397#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000398#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000399
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000400#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000401#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000402#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000403#endif
404
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000405#ifndef SOCKETCLOSE
406#define SOCKETCLOSE close
407#endif
408
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000409#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000410#define USE_BLUETOOTH 1
411#if defined(__FreeBSD__)
412#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
413#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Martin v. Löwis45423a72007-02-14 10:07:37 +0000414#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000415#define SOL_HCI SOL_HCI_RAW
416#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000417#define sockaddr_l2 sockaddr_l2cap
418#define sockaddr_rc sockaddr_rfcomm
Hye-Shik Chang82958f02007-06-05 18:16:52 +0000419#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000420#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
421#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000422#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000423#elif defined(__NetBSD__) || defined(__DragonFly__)
Matt Flemingec926502006-07-28 11:27:27 +0000424#define sockaddr_l2 sockaddr_bt
425#define sockaddr_rc sockaddr_bt
Martin v. Löwis45423a72007-02-14 10:07:37 +0000426#define sockaddr_hci sockaddr_bt
Matt Flemingec926502006-07-28 11:27:27 +0000427#define sockaddr_sco sockaddr_bt
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000428#define SOL_HCI BTPROTO_HCI
429#define HCI_DATA_DIR SO_HCI_DIRECTION
Matt Flemingec926502006-07-28 11:27:27 +0000430#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
431#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000432#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Matt Flemingec926502006-07-28 11:27:27 +0000433#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000434#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000435#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
436#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Martin v. Löwis45423a72007-02-14 10:07:37 +0000437#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000438#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
439#endif
440#endif
441
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000442#ifdef __VMS
443/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
444#define SEGMENT_SIZE (32 * 1024 -1)
445#endif
446
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000447#define SAS2SA(x) ((struct sockaddr *)(x))
Martin v. Löwis046c4d12006-12-03 11:23:45 +0000448
Martin v. Löwise9416172003-05-03 10:12:45 +0000449/*
450 * Constants for getnameinfo()
451 */
452#if !defined(NI_MAXHOST)
453#define NI_MAXHOST 1025
454#endif
455#if !defined(NI_MAXSERV)
456#define NI_MAXSERV 32
457#endif
458
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000459/* XXX There's a problem here: *static* functions are not supposed to have
460 a Py prefix (or use CapitalizedWords). Later... */
461
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462/* Global variable holding the exception type for errors detected
463 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000464static PyObject *socket_error;
465static PyObject *socket_herror;
466static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000467static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000468
Guido van Rossum48a680c2001-03-02 06:34:14 +0000469#ifdef RISCOS
470/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
471static int taskwindow;
472#endif
473
Tim Peters643a7fc2002-02-17 04:13:21 +0000474/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000475 The sock_type variable contains pointers to various functions,
476 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000477 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000478static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000479
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000480#if defined(HAVE_POLL_H)
481#include <poll.h>
482#elif defined(HAVE_SYS_POLL_H)
483#include <sys/poll.h>
484#endif
485
Charles-François Natalifda7b372011-08-28 16:22:33 +0200486#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000487/* Instead of select(), we'll use poll() since poll() works on any fd. */
488#define IS_SELECTABLE(s) 1
489/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000490#else
Charles-François Natalifda7b372011-08-28 16:22:33 +0200491/* If there's no timeout left, we don't have to call select, so it's a safe,
492 * little white lie. */
493#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000494#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000495
496static PyObject*
497select_error(void)
498{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000499 PyErr_SetString(socket_error, "unable to select on socket");
500 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000501}
502
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700503#ifdef MS_WINDOWS
504#ifndef WSAEAGAIN
505#define WSAEAGAIN WSAEWOULDBLOCK
506#endif
507#define CHECK_ERRNO(expected) \
508 (WSAGetLastError() == WSA ## expected)
509#else
510#define CHECK_ERRNO(expected) \
511 (errno == expected)
512#endif
513
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514/* Convenience function to raise an error according to errno
515 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516
Guido van Rossum73624e91994-10-10 17:59:00 +0000517static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000518set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000520#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000521 int err_no = WSAGetLastError();
522 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
523 recognizes the error codes used by both GetLastError() and
524 WSAGetLastError */
525 if (err_no)
526 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000527#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000528
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000529#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 if (sock_errno() != NO_ERROR) {
531 APIRET rc;
532 ULONG msglen;
533 char outbuf[100];
534 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000535
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000536 /* Retrieve socket-related error message from MPTN.MSG file */
537 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
538 myerrorcode - SOCBASEERR + 26,
539 "mptn.msg",
540 &msglen);
541 if (rc == NO_ERROR) {
542 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000543
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000544 /* OS/2 doesn't guarantee a terminator */
545 outbuf[msglen] = '\0';
546 if (strlen(outbuf) > 0) {
547 /* If non-empty msg, trim CRLF */
548 char *lastc = &outbuf[ strlen(outbuf)-1 ];
549 while (lastc > outbuf &&
550 isspace(Py_CHARMASK(*lastc))) {
551 /* Trim trailing whitespace (CRLF) */
552 *lastc-- = '\0';
553 }
554 }
555 v = Py_BuildValue("(is)", myerrorcode, outbuf);
556 if (v != NULL) {
557 PyErr_SetObject(socket_error, v);
558 Py_DECREF(v);
559 }
560 return NULL;
561 }
562 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000563#endif
564
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000565#if defined(RISCOS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000566 if (_inet_error.errnum != NULL) {
567 PyObject *v;
568 v = Py_BuildValue("(is)", errno, _inet_err());
569 if (v != NULL) {
570 PyErr_SetObject(socket_error, v);
571 Py_DECREF(v);
572 }
573 return NULL;
574 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000575#endif
576
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578}
579
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000582set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000584 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585
586#ifdef HAVE_HSTRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000589 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000591 if (v != NULL) {
592 PyErr_SetObject(socket_herror, v);
593 Py_DECREF(v);
594 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000595
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000596 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000597}
598
599
600static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000601set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000602{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000603 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604
Martin v. Löwis272cb402002-03-01 08:31:07 +0000605#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 /* EAI_SYSTEM is not available on Windows XP. */
607 if (error == EAI_SYSTEM)
608 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000609#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000611#ifdef HAVE_GAI_STRERROR
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000613#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000615#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000616 if (v != NULL) {
617 PyErr_SetObject(socket_gaierror, v);
618 Py_DECREF(v);
619 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000621 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622}
623
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000624#ifdef __VMS
625/* Function to send in segments */
626static int
627sendsegmented(int sock_fd, char *buf, int len, int flags)
628{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 int n = 0;
630 int remaining = len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000631
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000632 while (remaining > 0) {
633 unsigned int segment;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000634
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000635 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
636 n = send(sock_fd, buf, segment, flags);
637 if (n < 0) {
638 return n;
639 }
640 remaining -= segment;
641 buf += segment;
642 } /* end while */
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000643
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000644 return len;
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000645}
646#endif
647
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000648/* Function to perform the setting of socket blocking mode
649 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650static int
651internal_setblocking(PySocketSockObject *s, int block)
652{
653#ifndef RISCOS
654#ifndef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000655 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656#endif
657#endif
658
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000659 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000661 block = !block;
662 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
663 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000664#else
665#ifndef RISCOS
666#ifndef MS_WINDOWS
667#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 block = !block;
669 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000670#elif defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000671 block = !block;
672 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Neal Norwitz2a30cd02006-07-10 01:18:57 +0000673#else /* !PYOS_OS2 && !__VMS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000674 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
675 if (block)
676 delay_flag &= (~O_NONBLOCK);
677 else
678 delay_flag |= O_NONBLOCK;
679 fcntl(s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000680#endif /* !PYOS_OS2 */
681#else /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000682 block = !block;
683 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000685#else /* RISCOS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000686 block = !block;
687 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000689#endif /* __BEOS__ */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000690 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000692 /* Since these don't return anything */
693 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694}
695
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000696/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000697 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000698 This does not raise an exception; we'll let our caller do that
699 after they've reacquired the interpreter lock.
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000700 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000701static int
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700702internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000705
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 /* Nothing to do unless we're in timeout mode (not non-blocking) */
707 if (s->sock_timeout <= 0.0)
708 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000709
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000710 /* Guard against closed socket */
711 if (s->sock_fd < 0)
712 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000713
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700714 /* Handling this condition here simplifies the select loops */
715 if (interval < 0.0)
716 return 1;
717
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000718 /* Prefer poll, if available, since you can poll() any fd
719 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000720#ifdef HAVE_POLL
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 {
722 struct pollfd pollfd;
723 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000724
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000725 pollfd.fd = s->sock_fd;
726 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000727
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000728 /* s->sock_timeout is in seconds, timeout in ms */
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700729 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000730 n = poll(&pollfd, 1, timeout);
731 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000732#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000733 {
734 /* Construct the arguments to select */
735 fd_set fds;
736 struct timeval tv;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700737 tv.tv_sec = (int)interval;
738 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000739 FD_ZERO(&fds);
740 FD_SET(s->sock_fd, &fds);
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000741
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000742 /* See if the socket is ready */
743 if (writing)
744 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
745 else
746 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
747 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +0000748#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000749
750 if (n < 0)
751 return -1;
752 if (n == 0)
753 return 1;
754 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000755}
756
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700757static int
758internal_select(PySocketSockObject *s, int writing)
759{
760 return internal_select_ex(s, writing, s->sock_timeout);
761}
762
763/*
764 Two macros for automatic retry of select() in case of false positives
765 (for example, select() could indicate a socket is ready for reading
766 but the data then discarded by the OS because of a wrong checksum).
767 Here is an example of use:
768
769 BEGIN_SELECT_LOOP(s)
770 Py_BEGIN_ALLOW_THREADS
771 timeout = internal_select_ex(s, 0, interval);
772 if (!timeout)
773 outlen = recv(s->sock_fd, cbuf, len, flags);
774 Py_END_ALLOW_THREADS
775 if (timeout == 1) {
776 PyErr_SetString(socket_timeout, "timed out");
777 return -1;
778 }
779 END_SELECT_LOOP(s)
780*/
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700781#define BEGIN_SELECT_LOOP(s) \
782 { \
Benjamin Petersone5fa8b02016-07-07 00:24:26 -0700783 double deadline = 0, interval = s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700784 int has_timeout = s->sock_timeout > 0.0; \
785 if (has_timeout) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700786 deadline = _PyTime_FloatTime() + s->sock_timeout; \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700787 } \
788 while (1) { \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700789 errno = 0;
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700790
791#define END_SELECT_LOOP(s) \
792 if (!has_timeout || \
793 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
794 break; \
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700795 interval = deadline - _PyTime_FloatTime(); \
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700796 } \
Kristján Valur Jónsson620e3642013-03-19 13:01:05 -0700797 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -0700798
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000799/* Initialize a new socket object. */
800
Tim Petersa12b4cf2002-07-18 22:38:44 +0000801static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000802
Mark Hammond62b1ab12002-07-23 06:31:15 +0000803PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000804init_sockobject(PySocketSockObject *s,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000805 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000806{
807#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000808 int block = 1;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000809#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000810 s->sock_fd = fd;
811 s->sock_family = family;
812 s->sock_type = type;
813 s->sock_proto = proto;
814 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000815
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000816 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000817
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000818 if (defaulttimeout >= 0.0)
819 internal_setblocking(s, 0);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000820
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000821#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000822 if (taskwindow)
823 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000824#endif
825}
826
827
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828/* Create a new socket object.
829 This just creates the object and initializes it.
830 If the creation fails, return NULL and set an exception (implicit
831 in NEWOBJ()). */
832
Guido van Rossum73624e91994-10-10 17:59:00 +0000833static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000834new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000836 PySocketSockObject *s;
837 s = (PySocketSockObject *)
838 PyType_GenericNew(&sock_type, NULL, NULL);
839 if (s != NULL)
840 init_sockobject(s, fd, family, type, proto);
841 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842}
843
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844
Guido van Rossum48a680c2001-03-02 06:34:14 +0000845/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000846 thread to be in gethostbyname or getaddrinfo */
847#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosec5517762012-08-14 17:24:47 +0200848static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000849#endif
850
851
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852/* Convert a string specifying a host name or one of a few symbolic
853 names to a numeric IP address. This usually calls gethostbyname()
854 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856 an error occurred; then an exception is raised. */
857
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000858static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000859setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000861 struct addrinfo hints, *res;
862 int error;
863 int d1, d2, d3, d4;
864 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000866 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
867 if (name[0] == '\0') {
868 int siz;
869 memset(&hints, 0, sizeof(hints));
870 hints.ai_family = af;
871 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
872 hints.ai_flags = AI_PASSIVE;
873 Py_BEGIN_ALLOW_THREADS
874 ACQUIRE_GETADDRINFO_LOCK
875 error = getaddrinfo(NULL, "0", &hints, &res);
876 Py_END_ALLOW_THREADS
877 /* We assume that those thread-unsafe getaddrinfo() versions
878 *are* safe regarding their return value, ie. that a
879 subsequent call to getaddrinfo() does not destroy the
880 outcome of the first call. */
881 RELEASE_GETADDRINFO_LOCK
882 if (error) {
883 set_gaierror(error);
884 return -1;
885 }
886 switch (res->ai_family) {
887 case AF_INET:
888 siz = 4;
889 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000890#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000891 case AF_INET6:
892 siz = 16;
893 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000894#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 default:
896 freeaddrinfo(res);
897 PyErr_SetString(socket_error,
898 "unsupported address family");
899 return -1;
900 }
901 if (res->ai_next) {
902 freeaddrinfo(res);
903 PyErr_SetString(socket_error,
904 "wildcard resolved to multiple address");
905 return -1;
906 }
907 if (res->ai_addrlen < addr_ret_size)
908 addr_ret_size = res->ai_addrlen;
909 memcpy(addr_ret, res->ai_addr, addr_ret_size);
910 freeaddrinfo(res);
911 return siz;
912 }
913 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
914 struct sockaddr_in *sin;
915 if (af != AF_INET && af != AF_UNSPEC) {
916 PyErr_SetString(socket_error,
917 "address family mismatched");
918 return -1;
919 }
920 sin = (struct sockaddr_in *)addr_ret;
921 memset((void *) sin, '\0', sizeof(*sin));
922 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000924 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000925#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 sin->sin_addr.s_addr = INADDR_BROADCAST;
927 return sizeof(sin->sin_addr);
928 }
929 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
930 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
931 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
932 struct sockaddr_in *sin;
933 sin = (struct sockaddr_in *)addr_ret;
934 sin->sin_addr.s_addr = htonl(
935 ((long) d1 << 24) | ((long) d2 << 16) |
936 ((long) d3 << 8) | ((long) d4 << 0));
937 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000938#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000939 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000940#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000941 return 4;
942 }
943 memset(&hints, 0, sizeof(hints));
944 hints.ai_family = af;
945 Py_BEGIN_ALLOW_THREADS
946 ACQUIRE_GETADDRINFO_LOCK
947 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000948#if defined(__digital__) && defined(__unix__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 if (error == EAI_NONAME && af == AF_UNSPEC) {
950 /* On Tru64 V5.1, numeric-to-addr conversion fails
951 if no address family is given. Assume IPv4 for now.*/
952 hints.ai_family = AF_INET;
953 error = getaddrinfo(name, NULL, &hints, &res);
954 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000955#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000956 Py_END_ALLOW_THREADS
957 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
958 if (error) {
959 set_gaierror(error);
960 return -1;
961 }
962 if (res->ai_addrlen < addr_ret_size)
963 addr_ret_size = res->ai_addrlen;
964 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
965 freeaddrinfo(res);
966 switch (addr_ret->sa_family) {
967 case AF_INET:
968 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000969#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000970 case AF_INET6:
971 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000972#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000973 default:
974 PyErr_SetString(socket_error, "unknown address family");
975 return -1;
976 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977}
978
Guido van Rossum30a685f1991-06-27 15:51:29 +0000979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980/* Create a string object representing an IP address.
981 This is always a string of the form 'dd.dd.dd.dd' (with variable
982 size numbers). */
983
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000985makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 char buf[NI_MAXHOST];
988 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000989
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000990 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
991 NI_NUMERICHOST);
992 if (error) {
993 set_gaierror(error);
994 return NULL;
995 }
996 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000997}
998
999
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001000#ifdef USE_BLUETOOTH
1001/* Convert a string representation of a Bluetooth address into a numeric
1002 address. Returns the length (6), or raises an exception and returns -1 if
1003 an error occurred. */
1004
1005static int
1006setbdaddr(char *name, bdaddr_t *bdaddr)
1007{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001008 unsigned int b0, b1, b2, b3, b4, b5;
1009 char ch;
1010 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001012 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1013 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1014 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1015 bdaddr->b[0] = b0;
1016 bdaddr->b[1] = b1;
1017 bdaddr->b[2] = b2;
1018 bdaddr->b[3] = b3;
1019 bdaddr->b[4] = b4;
1020 bdaddr->b[5] = b5;
1021 return 6;
1022 } else {
1023 PyErr_SetString(socket_error, "bad bluetooth address");
1024 return -1;
1025 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001026}
1027
1028/* Create a string representation of the Bluetooth address. This is always a
1029 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1030 value (zero padded if necessary). */
1031
1032static PyObject *
1033makebdaddr(bdaddr_t *bdaddr)
1034{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001035 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001036
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001037 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1038 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1039 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1040 return PyString_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001041}
1042#endif
1043
1044
Guido van Rossum30a685f1991-06-27 15:51:29 +00001045/* Create an object representing the given socket address,
1046 suitable for passing it back to bind(), connect() etc.
1047 The family field of the sockaddr structure is inspected
1048 to determine what kind of address it really is. */
1049
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001050/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001051static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001052makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001054 if (addrlen == 0) {
1055 /* No address -- may be recvfrom() from known socket */
1056 Py_INCREF(Py_None);
1057 return Py_None;
1058 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001059
Guido van Rossumbcc20741998-08-04 22:53:56 +00001060#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001061 /* XXX: BeOS version of accept() doesn't set family correctly */
1062 addr->sa_family = AF_INET;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001063#endif
1064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001065 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001067 case AF_INET:
1068 {
1069 struct sockaddr_in *a;
1070 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1071 PyObject *ret = NULL;
1072 if (addrobj) {
1073 a = (struct sockaddr_in *)addr;
1074 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1075 Py_DECREF(addrobj);
1076 }
1077 return ret;
1078 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001080#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001081 case AF_UNIX:
1082 {
1083 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Armin Rigoa9017c32006-04-19 11:50:27 +00001084#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001085 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1086 addrlen -= offsetof(struct sockaddr_un, sun_path);
1087 return PyString_FromStringAndSize(a->sun_path,
1088 addrlen);
1089 }
1090 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001091#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001092 {
1093 /* regular NULL-terminated string */
1094 return PyString_FromString(a->sun_path);
1095 }
1096 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001097#endif /* AF_UNIX */
1098
Martin v. Löwis11017b12006-01-14 18:12:57 +00001099#if defined(AF_NETLINK)
1100 case AF_NETLINK:
1101 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001102 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1103 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001104 }
1105#endif /* AF_NETLINK */
1106
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001107#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001108 case AF_INET6:
1109 {
1110 struct sockaddr_in6 *a;
1111 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1112 PyObject *ret = NULL;
1113 if (addrobj) {
1114 a = (struct sockaddr_in6 *)addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001115 ret = Py_BuildValue("OiII",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001116 addrobj,
1117 ntohs(a->sin6_port),
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001118 ntohl(a->sin6_flowinfo),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001119 a->sin6_scope_id);
1120 Py_DECREF(addrobj);
1121 }
1122 return ret;
1123 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001124#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001127 case AF_BLUETOOTH:
1128 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 case BTPROTO_L2CAP:
1131 {
1132 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1133 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1134 PyObject *ret = NULL;
1135 if (addrobj) {
1136 ret = Py_BuildValue("Oi",
1137 addrobj,
1138 _BT_L2_MEMB(a, psm));
1139 Py_DECREF(addrobj);
1140 }
1141 return ret;
1142 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001143
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001144 case BTPROTO_RFCOMM:
1145 {
1146 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1147 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1148 PyObject *ret = NULL;
1149 if (addrobj) {
1150 ret = Py_BuildValue("Oi",
1151 addrobj,
1152 _BT_RC_MEMB(a, channel));
1153 Py_DECREF(addrobj);
1154 }
1155 return ret;
1156 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001157
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001158 case BTPROTO_HCI:
1159 {
1160 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001161#if defined(__NetBSD__) || defined(__DragonFly__)
1162 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1163#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001164 PyObject *ret = NULL;
1165 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1166 return ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001167#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001168 }
Martin v. Löwis45423a72007-02-14 10:07:37 +00001169
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001170#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001171 case BTPROTO_SCO:
1172 {
1173 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1174 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1175 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001176#endif
1177
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001178 default:
1179 PyErr_SetString(PyExc_ValueError,
1180 "Unknown Bluetooth protocol");
1181 return NULL;
1182 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001183#endif
1184
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001185#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001186 case AF_PACKET:
1187 {
1188 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1189 char *ifname = "";
1190 struct ifreq ifr;
1191 /* need to look up interface name give index */
1192 if (a->sll_ifindex) {
1193 ifr.ifr_ifindex = a->sll_ifindex;
1194 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1195 ifname = ifr.ifr_name;
1196 }
1197 return Py_BuildValue("shbhs#",
1198 ifname,
1199 ntohs(a->sll_protocol),
1200 a->sll_pkttype,
1201 a->sll_hatype,
1202 a->sll_addr,
1203 a->sll_halen);
1204 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001205#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001206
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001207#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001208 case AF_TIPC:
1209 {
1210 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1211 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1212 return Py_BuildValue("IIIII",
1213 a->addrtype,
1214 a->addr.nameseq.type,
1215 a->addr.nameseq.lower,
1216 a->addr.nameseq.upper,
1217 a->scope);
1218 } else if (a->addrtype == TIPC_ADDR_NAME) {
1219 return Py_BuildValue("IIIII",
1220 a->addrtype,
1221 a->addr.name.name.type,
1222 a->addr.name.name.instance,
1223 a->addr.name.name.instance,
1224 a->scope);
1225 } else if (a->addrtype == TIPC_ADDR_ID) {
1226 return Py_BuildValue("IIIII",
1227 a->addrtype,
1228 a->addr.id.node,
1229 a->addr.id.ref,
1230 0,
1231 a->scope);
1232 } else {
1233 PyErr_SetString(PyExc_ValueError,
1234 "Invalid address type");
1235 return NULL;
1236 }
1237 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001238#endif
1239
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001240 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001241
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001242 default:
1243 /* If we don't know the address family, don't raise an
1244 exception -- return it as a tuple. */
1245 return Py_BuildValue("is#",
1246 addr->sa_family,
1247 addr->sa_data,
1248 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001251}
1252
Guido van Rossum30a685f1991-06-27 15:51:29 +00001253
1254/* Parse a socket address argument according to the socket object's
1255 address family. Return 1 if the address was in the proper format,
1256 0 of not. The address is returned through addr_ret, its length
1257 through len_ret. */
1258
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001260getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001261 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001262{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001263 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001264
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001265#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001266 case AF_UNIX:
1267 {
1268 struct sockaddr_un* addr;
1269 char *path;
1270 int len;
1271 if (!PyArg_Parse(args, "t#", &path, &len))
1272 return 0;
Martin v. Löwis046c4d12006-12-03 11:23:45 +00001273
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001274 addr = (struct sockaddr_un*)addr_ret;
Armin Rigoa9017c32006-04-19 11:50:27 +00001275#ifdef linux
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 if (len > 0 && path[0] == 0) {
1277 /* Linux abstract namespace extension */
1278 if (len > sizeof addr->sun_path) {
1279 PyErr_SetString(socket_error,
1280 "AF_UNIX path too long");
1281 return 0;
1282 }
1283 }
1284 else
Armin Rigoa9017c32006-04-19 11:50:27 +00001285#endif /* linux */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001286 {
1287 /* regular NULL-terminated string */
1288 if (len >= sizeof addr->sun_path) {
1289 PyErr_SetString(socket_error,
1290 "AF_UNIX path too long");
1291 return 0;
1292 }
1293 addr->sun_path[len] = 0;
1294 }
1295 addr->sun_family = s->sock_family;
1296 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001297#if defined(PYOS_OS2)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001298 *len_ret = sizeof(*addr);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001299#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001300 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001301#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001302 return 1;
1303 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001304#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001305
Martin v. Löwis11017b12006-01-14 18:12:57 +00001306#if defined(AF_NETLINK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001307 case AF_NETLINK:
1308 {
1309 struct sockaddr_nl* addr;
1310 int pid, groups;
1311 addr = (struct sockaddr_nl *)addr_ret;
1312 if (!PyTuple_Check(args)) {
1313 PyErr_Format(
1314 PyExc_TypeError,
1315 "getsockaddrarg: "
1316 "AF_NETLINK address must be tuple, not %.500s",
1317 Py_TYPE(args)->tp_name);
1318 return 0;
1319 }
1320 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1321 return 0;
1322 addr->nl_family = AF_NETLINK;
1323 addr->nl_pid = pid;
1324 addr->nl_groups = groups;
1325 *len_ret = sizeof(*addr);
1326 return 1;
1327 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001328#endif
1329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001330 case AF_INET:
1331 {
1332 struct sockaddr_in* addr;
1333 char *host;
1334 int port, result;
1335 if (!PyTuple_Check(args)) {
1336 PyErr_Format(
1337 PyExc_TypeError,
1338 "getsockaddrarg: "
1339 "AF_INET address must be tuple, not %.500s",
1340 Py_TYPE(args)->tp_name);
1341 return 0;
1342 }
1343 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1344 "idna", &host, &port))
1345 return 0;
1346 addr=(struct sockaddr_in*)addr_ret;
1347 result = setipaddr(host, (struct sockaddr *)addr,
1348 sizeof(*addr), AF_INET);
1349 PyMem_Free(host);
1350 if (result < 0)
1351 return 0;
1352 if (port < 0 || port > 0xffff) {
1353 PyErr_SetString(
1354 PyExc_OverflowError,
1355 "getsockaddrarg: port must be 0-65535.");
1356 return 0;
1357 }
1358 addr->sin_family = AF_INET;
1359 addr->sin_port = htons((short)port);
1360 *len_ret = sizeof *addr;
1361 return 1;
1362 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001363
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001364#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001365 case AF_INET6:
1366 {
1367 struct sockaddr_in6* addr;
1368 char *host;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001369 int port, result;
1370 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001371 flowinfo = scope_id = 0;
1372 if (!PyTuple_Check(args)) {
1373 PyErr_Format(
1374 PyExc_TypeError,
1375 "getsockaddrarg: "
1376 "AF_INET6 address must be tuple, not %.500s",
1377 Py_TYPE(args)->tp_name);
1378 return 0;
1379 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001380 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001381 "idna", &host, &port, &flowinfo,
1382 &scope_id)) {
1383 return 0;
1384 }
1385 addr = (struct sockaddr_in6*)addr_ret;
1386 result = setipaddr(host, (struct sockaddr *)addr,
1387 sizeof(*addr), AF_INET6);
1388 PyMem_Free(host);
1389 if (result < 0)
1390 return 0;
1391 if (port < 0 || port > 0xffff) {
1392 PyErr_SetString(
1393 PyExc_OverflowError,
1394 "getsockaddrarg: port must be 0-65535.");
1395 return 0;
1396 }
Charles-François Natali65dd7452012-06-23 10:06:56 +02001397 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001398 PyErr_SetString(
1399 PyExc_OverflowError,
1400 "getsockaddrarg: flowinfo must be 0-1048575.");
1401 return 0;
1402 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001403 addr->sin6_family = s->sock_family;
1404 addr->sin6_port = htons((short)port);
Charles-François Natali3aa59e32012-01-02 15:38:27 +01001405 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001406 addr->sin6_scope_id = scope_id;
1407 *len_ret = sizeof *addr;
1408 return 1;
1409 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001410#endif
1411
Hye-Shik Chang81268602004-02-02 06:05:24 +00001412#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 case AF_BLUETOOTH:
1414 {
1415 switch (s->sock_proto) {
1416 case BTPROTO_L2CAP:
1417 {
1418 struct sockaddr_l2 *addr;
1419 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001420
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001421 addr = (struct sockaddr_l2 *)addr_ret;
1422 memset(addr, 0, sizeof(struct sockaddr_l2));
1423 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1424 if (!PyArg_ParseTuple(args, "si", &straddr,
1425 &_BT_L2_MEMB(addr, psm))) {
1426 PyErr_SetString(socket_error, "getsockaddrarg: "
1427 "wrong format");
1428 return 0;
1429 }
1430 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1431 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001432
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001433 *len_ret = sizeof *addr;
1434 return 1;
1435 }
1436 case BTPROTO_RFCOMM:
1437 {
1438 struct sockaddr_rc *addr;
1439 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001440
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001441 addr = (struct sockaddr_rc *)addr_ret;
1442 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1443 if (!PyArg_ParseTuple(args, "si", &straddr,
1444 &_BT_RC_MEMB(addr, channel))) {
1445 PyErr_SetString(socket_error, "getsockaddrarg: "
1446 "wrong format");
1447 return 0;
1448 }
1449 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1450 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001452 *len_ret = sizeof *addr;
1453 return 1;
1454 }
1455 case BTPROTO_HCI:
1456 {
1457 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001458#if defined(__NetBSD__) || defined(__DragonFly__)
1459 char *straddr = PyBytes_AS_STRING(args);
1460
1461 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1462 if (straddr == NULL) {
1463 PyErr_SetString(socket_error, "getsockaddrarg: "
1464 "wrong format");
1465 return 0;
1466 }
1467 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1468 return 0;
1469#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001470 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1471 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1472 PyErr_SetString(socket_error, "getsockaddrarg: "
1473 "wrong format");
1474 return 0;
1475 }
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00001476#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001477 *len_ret = sizeof *addr;
1478 return 1;
1479 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001480#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001481 case BTPROTO_SCO:
1482 {
1483 struct sockaddr_sco *addr;
1484 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001486 addr = (struct sockaddr_sco *)addr_ret;
1487 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1488 straddr = PyString_AsString(args);
1489 if (straddr == NULL) {
1490 PyErr_SetString(socket_error, "getsockaddrarg: "
1491 "wrong format");
1492 return 0;
1493 }
1494 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1495 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001496
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001497 *len_ret = sizeof *addr;
1498 return 1;
1499 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001500#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001501 default:
1502 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1503 return 0;
1504 }
1505 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001506#endif
1507
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00001508#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001509 case AF_PACKET:
1510 {
1511 struct sockaddr_ll* addr;
1512 struct ifreq ifr;
1513 char *interfaceName;
1514 int protoNumber;
1515 int hatype = 0;
1516 int pkttype = 0;
1517 char *haddr = NULL;
1518 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001520 if (!PyTuple_Check(args)) {
1521 PyErr_Format(
1522 PyExc_TypeError,
1523 "getsockaddrarg: "
1524 "AF_PACKET address must be tuple, not %.500s",
1525 Py_TYPE(args)->tp_name);
1526 return 0;
1527 }
1528 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1529 &protoNumber, &pkttype, &hatype,
1530 &haddr, &halen))
1531 return 0;
1532 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1533 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1534 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1535 s->errorhandler();
1536 return 0;
1537 }
1538 if (halen > 8) {
1539 PyErr_SetString(PyExc_ValueError,
1540 "Hardware address must be 8 bytes or less");
1541 return 0;
1542 }
1543 if (protoNumber < 0 || protoNumber > 0xffff) {
1544 PyErr_SetString(
1545 PyExc_OverflowError,
1546 "getsockaddrarg: protoNumber must be 0-65535.");
1547 return 0;
1548 }
1549 addr = (struct sockaddr_ll*)addr_ret;
1550 addr->sll_family = AF_PACKET;
1551 addr->sll_protocol = htons((short)protoNumber);
1552 addr->sll_ifindex = ifr.ifr_ifindex;
1553 addr->sll_pkttype = pkttype;
1554 addr->sll_hatype = hatype;
1555 if (halen != 0) {
1556 memcpy(&addr->sll_addr, haddr, halen);
1557 }
1558 addr->sll_halen = halen;
1559 *len_ret = sizeof *addr;
1560 return 1;
1561 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001562#endif
1563
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001564#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 case AF_TIPC:
1566 {
1567 unsigned int atype, v1, v2, v3;
1568 unsigned int scope = TIPC_CLUSTER_SCOPE;
1569 struct sockaddr_tipc *addr;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001570
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001571 if (!PyTuple_Check(args)) {
1572 PyErr_Format(
1573 PyExc_TypeError,
1574 "getsockaddrarg: "
1575 "AF_TIPC address must be tuple, not %.500s",
1576 Py_TYPE(args)->tp_name);
1577 return 0;
1578 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001579
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001580 if (!PyArg_ParseTuple(args,
1581 "IIII|I;Invalid TIPC address format",
1582 &atype, &v1, &v2, &v3, &scope))
1583 return 0;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001584
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001585 addr = (struct sockaddr_tipc *) addr_ret;
1586 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001588 addr->family = AF_TIPC;
1589 addr->scope = scope;
1590 addr->addrtype = atype;
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001591
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001592 if (atype == TIPC_ADDR_NAMESEQ) {
1593 addr->addr.nameseq.type = v1;
1594 addr->addr.nameseq.lower = v2;
1595 addr->addr.nameseq.upper = v3;
1596 } else if (atype == TIPC_ADDR_NAME) {
1597 addr->addr.name.name.type = v1;
1598 addr->addr.name.name.instance = v2;
1599 } else if (atype == TIPC_ADDR_ID) {
1600 addr->addr.id.node = v1;
1601 addr->addr.id.ref = v2;
1602 } else {
1603 /* Shouldn't happen */
1604 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1605 return 0;
1606 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001607
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001608 *len_ret = sizeof(*addr);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001609
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001610 return 1;
1611 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001612#endif
1613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001614 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001616 default:
1617 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1618 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001619
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001620 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621}
1622
Guido van Rossum30a685f1991-06-27 15:51:29 +00001623
Guido van Rossum48a680c2001-03-02 06:34:14 +00001624/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001625 Return 1 if the family is known, 0 otherwise. The length is returned
1626 through len_ret. */
1627
1628static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001629getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001630{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001631 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001632
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001633#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001634 case AF_UNIX:
1635 {
1636 *len_ret = sizeof (struct sockaddr_un);
1637 return 1;
1638 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001639#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001640#if defined(AF_NETLINK)
1641 case AF_NETLINK:
1642 {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001643 *len_ret = sizeof (struct sockaddr_nl);
1644 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001645 }
1646#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001647
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001648 case AF_INET:
1649 {
1650 *len_ret = sizeof (struct sockaddr_in);
1651 return 1;
1652 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001653
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001654#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001655 case AF_INET6:
1656 {
1657 *len_ret = sizeof (struct sockaddr_in6);
1658 return 1;
1659 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001660#endif
1661
Hye-Shik Chang81268602004-02-02 06:05:24 +00001662#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001663 case AF_BLUETOOTH:
1664 {
1665 switch(s->sock_proto)
1666 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001667
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001668 case BTPROTO_L2CAP:
1669 *len_ret = sizeof (struct sockaddr_l2);
1670 return 1;
1671 case BTPROTO_RFCOMM:
1672 *len_ret = sizeof (struct sockaddr_rc);
1673 return 1;
1674 case BTPROTO_HCI:
1675 *len_ret = sizeof (struct sockaddr_hci);
1676 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001677#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001678 case BTPROTO_SCO:
1679 *len_ret = sizeof (struct sockaddr_sco);
1680 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001681#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001682 default:
1683 PyErr_SetString(socket_error, "getsockaddrlen: "
1684 "unknown BT protocol");
1685 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001686
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 }
1688 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001689#endif
1690
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001691#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001692 case AF_PACKET:
1693 {
1694 *len_ret = sizeof (struct sockaddr_ll);
1695 return 1;
1696 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001697#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001698
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001699#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001700 case AF_TIPC:
1701 {
1702 *len_ret = sizeof (struct sockaddr_tipc);
1703 return 1;
1704 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001705#endif
1706
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001707 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001708
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001709 default:
1710 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1711 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001712
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001714}
1715
1716
Guido van Rossum30a685f1991-06-27 15:51:29 +00001717/* s.accept() method */
1718
Guido van Rossum73624e91994-10-10 17:59:00 +00001719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001720sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001721{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001722 sock_addr_t addrbuf;
1723 SOCKET_T newfd;
1724 socklen_t addrlen;
1725 PyObject *sock = NULL;
1726 PyObject *addr = NULL;
1727 PyObject *res = NULL;
1728 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001730 if (!getsockaddrlen(s, &addrlen))
1731 return NULL;
1732 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001733
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001734 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001735
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001736 if (!IS_SELECTABLE(s))
1737 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001738
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001739 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001741 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001742 if (!timeout)
1743 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1744 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001745
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001746 if (timeout == 1) {
1747 PyErr_SetString(socket_timeout, "timed out");
1748 return NULL;
1749 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001750 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001751
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001752 if (newfd == INVALID_SOCKET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001753 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001755 /* Create the new object with unspecified family,
1756 to avoid calls to bind() etc. on it. */
1757 sock = (PyObject *) new_sockobject(newfd,
1758 s->sock_family,
1759 s->sock_type,
1760 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001762 if (sock == NULL) {
1763 SOCKETCLOSE(newfd);
1764 goto finally;
1765 }
1766 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1767 addrlen, s->sock_proto);
1768 if (addr == NULL)
1769 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001770
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001771 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001772
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001774 Py_XDECREF(sock);
1775 Py_XDECREF(addr);
1776 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777}
1778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001780"accept() -> (socket object, address info)\n\
1781\n\
1782Wait for an incoming connection. Return a new socket representing the\n\
1783connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001784info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001785
Guido van Rossum11ba0942002-06-13 15:07:44 +00001786/* s.setblocking(flag) method. Argument:
1787 False -- non-blocking mode; same as settimeout(0)
1788 True -- blocking mode; same as settimeout(None)
1789*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001790
Guido van Rossum73624e91994-10-10 17:59:00 +00001791static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001792sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001793{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001794 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001795
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001796 block = PyInt_AsLong(arg);
1797 if (block == -1 && PyErr_Occurred())
1798 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001799
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001800 s->sock_timeout = block ? -1.0 : 0.0;
1801 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001803 Py_INCREF(Py_None);
1804 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001805}
Guido van Rossume4485b01994-09-07 14:32:49 +00001806
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001807PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001808"setblocking(flag)\n\
1809\n\
1810Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001811setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001812setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001813
Guido van Rossum11ba0942002-06-13 15:07:44 +00001814/* s.settimeout(timeout) method. Argument:
1815 None -- no timeout, blocking mode; same as setblocking(True)
1816 0.0 -- non-blocking mode; same as setblocking(False)
1817 > 0 -- timeout mode; operations time out after timeout seconds
1818 < 0 -- illegal; raises an exception
1819*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001821sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001822{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001823 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001824
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001825 if (arg == Py_None)
1826 timeout = -1.0;
1827 else {
1828 timeout = PyFloat_AsDouble(arg);
1829 if (timeout < 0.0) {
1830 if (!PyErr_Occurred())
1831 PyErr_SetString(PyExc_ValueError,
1832 "Timeout value out of range");
1833 return NULL;
1834 }
1835 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001837 s->sock_timeout = timeout;
1838 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001840 Py_INCREF(Py_None);
1841 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001842}
1843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001844PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001845"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001846\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001847Set a timeout on socket operations. 'timeout' can be a float,\n\
1848giving in seconds, or None. Setting a timeout of None disables\n\
1849the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001850Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001851
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001852/* s.gettimeout() method.
1853 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001854static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001855sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001856{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001857 if (s->sock_timeout < 0.0) {
1858 Py_INCREF(Py_None);
1859 return Py_None;
1860 }
1861 else
1862 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001863}
1864
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001865PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001866"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001867\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001868Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001869operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001870operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001871
Guido van Rossum48a680c2001-03-02 06:34:14 +00001872#ifdef RISCOS
1873/* s.sleeptaskw(1 | 0) method */
1874
1875static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001876sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001877{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001878 int block;
1879 block = PyInt_AsLong(arg);
1880 if (block == -1 && PyErr_Occurred())
1881 return NULL;
1882 Py_BEGIN_ALLOW_THREADS
1883 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1884 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001885
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001886 Py_INCREF(Py_None);
1887 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001888}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001889PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001890"sleeptaskw(flag)\n\
1891\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001893#endif
1894
1895
Guido van Rossumaee08791992-09-08 09:05:33 +00001896/* s.setsockopt() method.
1897 With an integer third argument, sets an integer option.
1898 With a string third argument, sets an option from a buffer;
1899 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001900
Guido van Rossum73624e91994-10-10 17:59:00 +00001901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001902sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001903{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001904 int level;
1905 int optname;
1906 int res;
1907 char *buf;
1908 int buflen;
1909 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001910
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001911 if (PyArg_ParseTuple(args, "iii:setsockopt",
1912 &level, &optname, &flag)) {
1913 buf = (char *) &flag;
1914 buflen = sizeof flag;
1915 }
1916 else {
1917 PyErr_Clear();
1918 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1919 &level, &optname, &buf, &buflen))
1920 return NULL;
1921 }
1922 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1923 if (res < 0)
1924 return s->errorhandler();
1925 Py_INCREF(Py_None);
1926 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001927}
1928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001929PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001930"setsockopt(level, option, value)\n\
1931\n\
1932Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001933The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001934
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001935
Guido van Rossumaee08791992-09-08 09:05:33 +00001936/* s.getsockopt() method.
1937 With two arguments, retrieves an integer option.
1938 With a third integer argument, retrieves a string buffer of that size;
1939 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001940
Guido van Rossum73624e91994-10-10 17:59:00 +00001941static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001942sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001943{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001944 int level;
1945 int optname;
1946 int res;
1947 PyObject *buf;
1948 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001949
Guido van Rossumbcc20741998-08-04 22:53:56 +00001950#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001951 /* We have incomplete socket support. */
1952 PyErr_SetString(socket_error, "getsockopt not supported");
1953 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001954#else
1955
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1957 &level, &optname, &buflen))
1958 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001959
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001960 if (buflen == 0) {
1961 int flag = 0;
1962 socklen_t flagsize = sizeof flag;
1963 res = getsockopt(s->sock_fd, level, optname,
1964 (void *)&flag, &flagsize);
1965 if (res < 0)
1966 return s->errorhandler();
1967 return PyInt_FromLong(flag);
1968 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001969#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001970 /* socklen_t is unsigned so no negative test is needed,
1971 test buflen == 0 is previously done */
1972 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001973#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001974 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001975#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001976 PyErr_SetString(socket_error,
1977 "getsockopt buflen out of range");
1978 return NULL;
1979 }
1980 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1981 if (buf == NULL)
1982 return NULL;
1983 res = getsockopt(s->sock_fd, level, optname,
1984 (void *)PyString_AS_STRING(buf), &buflen);
1985 if (res < 0) {
1986 Py_DECREF(buf);
1987 return s->errorhandler();
1988 }
1989 _PyString_Resize(&buf, buflen);
1990 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001991#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001992}
1993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001994PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001995"getsockopt(level, option[, buffersize]) -> value\n\
1996\n\
1997Get a socket option. See the Unix manual for level and option.\n\
1998If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001999string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002000
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002001
Fred Drake728819a2000-07-01 03:40:12 +00002002/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002003
Guido van Rossum73624e91994-10-10 17:59:00 +00002004static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002005sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002006{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002007 sock_addr_t addrbuf;
2008 int addrlen;
2009 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002010
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002011 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2012 return NULL;
2013 Py_BEGIN_ALLOW_THREADS
2014 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2015 Py_END_ALLOW_THREADS
2016 if (res < 0)
2017 return s->errorhandler();
2018 Py_INCREF(Py_None);
2019 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002020}
2021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002022PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002023"bind(address)\n\
2024\n\
2025Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002026pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002028
Guido van Rossum30a685f1991-06-27 15:51:29 +00002029
2030/* s.close() method.
2031 Set the file descriptor to -1 so operations tried subsequently
2032 will surely fail. */
2033
Guido van Rossum73624e91994-10-10 17:59:00 +00002034static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002035sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002036{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002037 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002039 if ((fd = s->sock_fd) != -1) {
2040 s->sock_fd = -1;
2041 Py_BEGIN_ALLOW_THREADS
2042 (void) SOCKETCLOSE(fd);
2043 Py_END_ALLOW_THREADS
2044 }
2045 Py_INCREF(Py_None);
2046 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002047}
2048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002049PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002050"close()\n\
2051\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002052Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002053
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002054static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002055internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002056 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002057{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002058 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002059
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002060 timeout = 0;
2061 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002062
2063#ifdef MS_WINDOWS
2064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002065 if (s->sock_timeout > 0.0) {
2066 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2067 IS_SELECTABLE(s)) {
2068 /* This is a mess. Best solution: trust select */
2069 fd_set fds;
2070 fd_set fds_exc;
2071 struct timeval tv;
2072 tv.tv_sec = (int)s->sock_timeout;
2073 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2074 FD_ZERO(&fds);
2075 FD_SET(s->sock_fd, &fds);
2076 FD_ZERO(&fds_exc);
2077 FD_SET(s->sock_fd, &fds_exc);
2078 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2079 if (res == 0) {
2080 res = WSAEWOULDBLOCK;
2081 timeout = 1;
2082 } else if (res > 0) {
2083 if (FD_ISSET(s->sock_fd, &fds))
2084 /* The socket is in the writeable set - this
2085 means connected */
2086 res = 0;
2087 else {
2088 /* As per MS docs, we need to call getsockopt()
2089 to get the underlying error */
2090 int res_size = sizeof res;
2091 /* It must be in the exception set */
2092 assert(FD_ISSET(s->sock_fd, &fds_exc));
2093 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2094 (char *)&res, &res_size))
2095 /* getsockopt also clears WSAGetLastError,
2096 so reset it back. */
2097 WSASetLastError(res);
2098 else
2099 res = WSAGetLastError();
2100 }
2101 }
2102 /* else if (res < 0) an error occurred */
2103 }
2104 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002105
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002106 if (res < 0)
2107 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002108
2109#else
2110
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002111 if (s->sock_timeout > 0.0) {
2112 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2113 timeout = internal_select(s, 1);
2114 if (timeout == 0) {
2115 /* Bug #1019808: in case of an EINPROGRESS,
2116 use getsockopt(SO_ERROR) to get the real
2117 error. */
2118 socklen_t res_size = sizeof res;
2119 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2120 SO_ERROR, &res, &res_size);
2121 if (res == EISCONN)
2122 res = 0;
2123 errno = res;
2124 }
2125 else if (timeout == -1) {
2126 res = errno; /* had error */
2127 }
2128 else
2129 res = EWOULDBLOCK; /* timed out */
2130 }
2131 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002132
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002133 if (res < 0)
2134 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002135
2136#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002137 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002138
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002139 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002140}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002141
Fred Drake728819a2000-07-01 03:40:12 +00002142/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002143
Guido van Rossum73624e91994-10-10 17:59:00 +00002144static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002145sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002146{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002147 sock_addr_t addrbuf;
2148 int addrlen;
2149 int res;
2150 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002151
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002152 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2153 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002155 Py_BEGIN_ALLOW_THREADS
2156 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2157 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002159 if (timeout == 1) {
2160 PyErr_SetString(socket_timeout, "timed out");
2161 return NULL;
2162 }
2163 if (res != 0)
2164 return s->errorhandler();
2165 Py_INCREF(Py_None);
2166 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002167}
2168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002169PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170"connect(address)\n\
2171\n\
2172Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002173is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174
Guido van Rossum30a685f1991-06-27 15:51:29 +00002175
Fred Drake728819a2000-07-01 03:40:12 +00002176/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002177
2178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002179sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002180{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002181 sock_addr_t addrbuf;
2182 int addrlen;
2183 int res;
2184 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002185
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002186 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2187 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002188
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002189 Py_BEGIN_ALLOW_THREADS
2190 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2191 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002192
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002193 /* Signals are not errors (though they may raise exceptions). Adapted
2194 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002195#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002196 if (res == EINTR && PyErr_CheckSignals())
2197 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002198#endif
2199
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002200 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002201}
2202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002203PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002204"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002205\n\
2206This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002208
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002209
Guido van Rossumed233a51992-06-23 09:07:03 +00002210/* s.fileno() method */
2211
Guido van Rossum73624e91994-10-10 17:59:00 +00002212static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002213sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002214{
Fred Drakea04eaad2000-06-30 02:46:07 +00002215#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002216 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002217#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002218 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002219#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002220}
2221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002222PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002223"fileno() -> integer\n\
2224\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002225Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002226
Guido van Rossumed233a51992-06-23 09:07:03 +00002227
Guido van Rossumbe32c891996-06-20 16:25:29 +00002228#ifndef NO_DUP
2229/* s.dup() method */
2230
2231static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002232sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002233{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002234 SOCKET_T newfd;
2235 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002236
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002237 newfd = dup(s->sock_fd);
2238 if (newfd < 0)
2239 return s->errorhandler();
2240 sock = (PyObject *) new_sockobject(newfd,
2241 s->sock_family,
2242 s->sock_type,
2243 s->sock_proto);
2244 if (sock == NULL)
2245 SOCKETCLOSE(newfd);
2246 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002247}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002249PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002250"dup() -> socket object\n\
2251\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002252Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002253
Guido van Rossumbe32c891996-06-20 16:25:29 +00002254#endif
2255
2256
Guido van Rossumc89705d1992-11-26 08:54:07 +00002257/* s.getsockname() method */
2258
Guido van Rossum73624e91994-10-10 17:59:00 +00002259static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002261{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002262 sock_addr_t addrbuf;
2263 int res;
2264 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002265
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002266 if (!getsockaddrlen(s, &addrlen))
2267 return NULL;
2268 memset(&addrbuf, 0, addrlen);
2269 Py_BEGIN_ALLOW_THREADS
2270 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2271 Py_END_ALLOW_THREADS
2272 if (res < 0)
2273 return s->errorhandler();
2274 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2275 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002276}
2277
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002278PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002279"getsockname() -> address info\n\
2280\n\
2281Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002282info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002283
Guido van Rossumc89705d1992-11-26 08:54:07 +00002284
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002285#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002286/* s.getpeername() method */
2287
Guido van Rossum73624e91994-10-10 17:59:00 +00002288static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002289sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002290{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002291 sock_addr_t addrbuf;
2292 int res;
2293 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002294
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002295 if (!getsockaddrlen(s, &addrlen))
2296 return NULL;
2297 memset(&addrbuf, 0, addrlen);
2298 Py_BEGIN_ALLOW_THREADS
2299 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2300 Py_END_ALLOW_THREADS
2301 if (res < 0)
2302 return s->errorhandler();
2303 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2304 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002305}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002307PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308"getpeername() -> address info\n\
2309\n\
2310Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002311info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312
Guido van Rossumb6775db1994-08-01 11:34:53 +00002313#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002314
2315
Guido van Rossum30a685f1991-06-27 15:51:29 +00002316/* s.listen(n) method */
2317
Guido van Rossum73624e91994-10-10 17:59:00 +00002318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002319sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002320{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002321 int backlog;
2322 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002323
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002324 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002325 if (backlog == -1 && PyErr_Occurred())
2326 return NULL;
2327 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002328 /* To avoid problems on systems that don't allow a negative backlog
2329 * (which doesn't make sense anyway) we force a minimum value of 0. */
2330 if (backlog < 0)
2331 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002332 res = listen(s->sock_fd, backlog);
2333 Py_END_ALLOW_THREADS
2334 if (res < 0)
2335 return s->errorhandler();
2336 Py_INCREF(Py_None);
2337 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002338}
2339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002340PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002341"listen(backlog)\n\
2342\n\
2343Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002344least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2345unaccepted connections that the system will allow before refusing new\n\
2346connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347
2348
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002349#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350/* s.makefile(mode) method.
2351 Create a new open file object referring to a dupped version of
2352 the socket's file descriptor. (The dup() call is necessary so
2353 that the open file and socket objects may be closed independent
2354 of each other.)
2355 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2356
Guido van Rossum73624e91994-10-10 17:59:00 +00002357static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002358sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002359{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 extern int fclose(FILE *);
2361 char *mode = "r";
2362 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002363#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002364 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002365#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002366 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002368 FILE *fp;
2369 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002370#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002371 char *mode_r = "r";
2372 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002373#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2376 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002377#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002378 if (strcmp(mode,"rb") == 0) {
2379 mode = mode_r;
2380 }
2381 else {
2382 if (strcmp(mode,"wb") == 0) {
2383 mode = mode_w;
2384 }
2385 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002386#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002387#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002388 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2389 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002390#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002391 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002392#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002393 {
2394 if (fd >= 0)
2395 SOCKETCLOSE(fd);
2396 return s->errorhandler();
2397 }
2398 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2399 if (f != NULL)
2400 PyFile_SetBufSize(f, bufsize);
2401 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002402}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002404PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002405"makefile([mode[, buffersize]]) -> file object\n\
2406\n\
2407Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002409
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002410#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002411
Martin Blais2856e5f2006-05-26 12:03:27 +00002412/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002413 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002414 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002415 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002416 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002417 * also possible that we return a number of bytes smaller than the request
2418 * bytes.
2419 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002420static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002421sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2422{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002423 ssize_t outlen = -1;
2424 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002425#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002426 int remaining;
2427 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002428#endif
2429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 if (!IS_SELECTABLE(s)) {
2431 select_error();
2432 return -1;
2433 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002434
2435#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002436 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002437 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002438 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002439 if (!timeout)
2440 outlen = recv(s->sock_fd, cbuf, len, flags);
2441 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002443 if (timeout == 1) {
2444 PyErr_SetString(socket_timeout, "timed out");
2445 return -1;
2446 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002447 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002448 if (outlen < 0) {
2449 /* Note: the call to errorhandler() ALWAYS indirectly returned
2450 NULL, so ignore its return value */
2451 s->errorhandler();
2452 return -1;
2453 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002454#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002455 read_buf = cbuf;
2456 remaining = len;
2457 while (remaining != 0) {
2458 unsigned int segment;
2459 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002460
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002461 segment = remaining /SEGMENT_SIZE;
2462 if (segment != 0) {
2463 segment = SEGMENT_SIZE;
2464 }
2465 else {
2466 segment = remaining;
2467 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002468
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002469 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002470 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002471 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002472 if (!timeout)
2473 nread = recv(s->sock_fd, read_buf, segment, flags);
2474 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002475
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002476 if (timeout == 1) {
2477 PyErr_SetString(socket_timeout, "timed out");
2478 return -1;
2479 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002480 END_SELECT_LOOP(s)
2481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002482 if (nread < 0) {
2483 s->errorhandler();
2484 return -1;
2485 }
2486 if (nread != remaining) {
2487 read_buf += nread;
2488 break;
2489 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002491 remaining -= segment;
2492 read_buf += segment;
2493 }
2494 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002495#endif /* !__VMS */
2496
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002497 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002498}
2499
Guido van Rossum48a680c2001-03-02 06:34:14 +00002500
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002501/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502
Guido van Rossum73624e91994-10-10 17:59:00 +00002503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002504sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002506 int recvlen, flags = 0;
2507 ssize_t outlen;
2508 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002510 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2511 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002512
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002513 if (recvlen < 0) {
2514 PyErr_SetString(PyExc_ValueError,
2515 "negative buffersize in recv");
2516 return NULL;
2517 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002519 /* Allocate a new string. */
2520 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2521 if (buf == NULL)
2522 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002523
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002524 /* Call the guts */
2525 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2526 if (outlen < 0) {
2527 /* An error occurred, release the string and return an
2528 error. */
2529 Py_DECREF(buf);
2530 return NULL;
2531 }
2532 if (outlen != recvlen) {
2533 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002534 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002535 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002536 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002537 return NULL;
2538 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002539
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002541}
2542
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544"recv(buffersize[, flags]) -> data\n\
2545\n\
2546Receive up to buffersize bytes from the socket. For the optional flags\n\
2547argument, see the Unix manual. When no data is available, block until\n\
2548at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002549the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002550
Guido van Rossum30a685f1991-06-27 15:51:29 +00002551
Martin Blaisaf2ae722006-06-04 13:49:49 +00002552/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002553
Martin Blais2856e5f2006-05-26 12:03:27 +00002554static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002555sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002556{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002557 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002559 int recvlen = 0, flags = 0;
2560 ssize_t readlen;
2561 Py_buffer buf;
2562 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002563
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002564 /* Get the buffer's memory */
2565 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2566 &buf, &recvlen, &flags))
2567 return NULL;
2568 buflen = buf.len;
2569 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002570
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002571 if (recvlen < 0) {
2572 PyErr_SetString(PyExc_ValueError,
2573 "negative buffersize in recv_into");
2574 goto error;
2575 }
2576 if (recvlen == 0) {
2577 /* If nbytes was not specified, use the buffer's length */
2578 recvlen = buflen;
2579 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002580
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002581 /* Check if the buffer is large enough */
2582 if (buflen < recvlen) {
2583 PyErr_SetString(PyExc_ValueError,
2584 "buffer too small for requested bytes");
2585 goto error;
2586 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002587
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002588 /* Call the guts */
2589 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2590 if (readlen < 0) {
2591 /* Return an error. */
2592 goto error;
2593 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002594
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002595 PyBuffer_Release(&buf);
2596 /* Return the number of bytes read. Note that we do not do anything
2597 special here in the case that readlen < recvlen. */
2598 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002599
2600error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002601 PyBuffer_Release(&buf);
2602 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002603}
2604
Martin Blaisaf2ae722006-06-04 13:49:49 +00002605PyDoc_STRVAR(recv_into_doc,
2606"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002607\n\
2608A version of recv() that stores its data into a buffer rather than creating \n\
2609a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2610is not specified (or 0), receive up to the size available in the given buffer.\n\
2611\n\
2612See recv() for documentation about the flags.");
2613
2614
2615/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002616 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2617 * into a char buffer. If you have any inc/def ref to do to the objects that
2618 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002619 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002620 * that it is also possible that we return a number of bytes smaller than the
2621 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002622 *
2623 * 'addr' is a return value for the address object. Note that you must decref
2624 * it yourself.
2625 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002626static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002627sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002628 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002629{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002630 sock_addr_t addrbuf;
2631 int timeout;
2632 ssize_t n = -1;
2633 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002634
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002635 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002636
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002637 if (!getsockaddrlen(s, &addrlen))
2638 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002639
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002640 if (!IS_SELECTABLE(s)) {
2641 select_error();
2642 return -1;
2643 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002644
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002645 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002646 Py_BEGIN_ALLOW_THREADS
2647 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002648 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002649 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002650#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002651#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002652 n = recvfrom(s->sock_fd, cbuf, len, flags,
2653 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002654#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002655 n = recvfrom(s->sock_fd, cbuf, len, flags,
2656 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002657#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002658#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002659 n = recvfrom(s->sock_fd, cbuf, len, flags,
2660 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002661#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002662 }
2663 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002665 if (timeout == 1) {
2666 PyErr_SetString(socket_timeout, "timed out");
2667 return -1;
2668 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002669 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 if (n < 0) {
2671 s->errorhandler();
2672 return -1;
2673 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002675 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2676 addrlen, s->sock_proto)))
2677 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002678
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002679 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002680}
2681
2682/* s.recvfrom(nbytes [,flags]) method */
2683
2684static PyObject *
2685sock_recvfrom(PySocketSockObject *s, PyObject *args)
2686{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002687 PyObject *buf = NULL;
2688 PyObject *addr = NULL;
2689 PyObject *ret = NULL;
2690 int recvlen, flags = 0;
2691 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002692
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002693 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2694 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002696 if (recvlen < 0) {
2697 PyErr_SetString(PyExc_ValueError,
2698 "negative buffersize in recvfrom");
2699 return NULL;
2700 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002701
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002702 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2703 if (buf == NULL)
2704 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002705
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002706 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2707 recvlen, flags, &addr);
2708 if (outlen < 0) {
2709 goto finally;
2710 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002712 if (outlen != recvlen) {
2713 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002714 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002715 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002716 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 goto finally;
2718 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002719
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002720 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002721
2722finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002723 Py_XDECREF(buf);
2724 Py_XDECREF(addr);
2725 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002726}
2727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002728PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002729"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2730\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002732
Martin Blais2856e5f2006-05-26 12:03:27 +00002733
Martin Blaisaf2ae722006-06-04 13:49:49 +00002734/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002735
2736static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002737sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002738{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002739 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002740
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002741 int recvlen = 0, flags = 0;
2742 ssize_t readlen;
2743 Py_buffer buf;
2744 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002745
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002746 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002747
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002748 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2749 kwlist, &buf,
2750 &recvlen, &flags))
2751 return NULL;
2752 buflen = buf.len;
Martin Blais2856e5f2006-05-26 12:03:27 +00002753
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002754 if (recvlen < 0) {
2755 PyErr_SetString(PyExc_ValueError,
2756 "negative buffersize in recvfrom_into");
2757 goto error;
2758 }
2759 if (recvlen == 0) {
2760 /* If nbytes was not specified, use the buffer's length */
2761 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002762 } else if (recvlen > buflen) {
2763 PyErr_SetString(PyExc_ValueError,
2764 "nbytes is greater than the length of the buffer");
2765 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002766 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002767
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002768 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2769 if (readlen < 0) {
2770 /* Return an error */
2771 goto error;
2772 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002773
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002774 PyBuffer_Release(&buf);
2775 /* Return the number of bytes read and the address. Note that we do
2776 not do anything special here in the case that readlen < recvlen. */
2777 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002778
2779error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002780 Py_XDECREF(addr);
2781 PyBuffer_Release(&buf);
2782 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002783}
2784
Martin Blaisaf2ae722006-06-04 13:49:49 +00002785PyDoc_STRVAR(recvfrom_into_doc,
2786"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002787\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002788Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002789
2790
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002791/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002792
Guido van Rossum73624e91994-10-10 17:59:00 +00002793static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002794sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002795{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002796 char *buf;
2797 int len, n = -1, flags = 0, timeout;
2798 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002799
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002800 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2801 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002802
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002803 if (!IS_SELECTABLE(s)) {
2804 PyBuffer_Release(&pbuf);
2805 return select_error();
2806 }
2807 buf = pbuf.buf;
2808 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002809
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002810 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002812 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002813 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002814#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002815 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002816#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002817 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002818#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002819 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002820 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002821 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002822 PyErr_SetString(socket_timeout, "timed out");
2823 return NULL;
2824 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002825 END_SELECT_LOOP(s)
2826
2827 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002828 if (n < 0)
2829 return s->errorhandler();
2830 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002831}
2832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002833PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002834"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002835\n\
2836Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002837argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002838sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002839
2840
2841/* s.sendall(data [,flags]) method */
2842
2843static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002844sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002845{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002846 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002847 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002848 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002850 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2851 return NULL;
2852 buf = pbuf.buf;
2853 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002854
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002855 if (!IS_SELECTABLE(s)) {
2856 PyBuffer_Release(&pbuf);
2857 return select_error();
2858 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002860 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002861 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002862 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002863 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002864 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002865 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002866#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002867 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002868#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002869 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002870#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002871 }
2872 Py_END_ALLOW_THREADS
2873 if (timeout == 1) {
2874 PyBuffer_Release(&pbuf);
2875 PyErr_SetString(socket_timeout, "timed out");
2876 return NULL;
2877 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002878 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002879 /* PyErr_CheckSignals() might change errno */
2880 saved_errno = errno;
2881 /* We must run our signal handlers before looping again.
2882 send() can return a successful partial write when it is
2883 interrupted, so we can't restrict ourselves to EINTR. */
2884 if (PyErr_CheckSignals()) {
2885 PyBuffer_Release(&pbuf);
2886 return NULL;
2887 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002888 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002889 /* If interrupted, try again */
2890 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002891 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002892 else
2893 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002894 }
2895 buf += n;
2896 len -= n;
2897 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002898 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002899
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002900 if (n < 0)
2901 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002903 Py_INCREF(Py_None);
2904 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002905}
2906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002907PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002908"sendall(data[, flags])\n\
2909\n\
2910Send a data string to the socket. For the optional flags\n\
2911argument, see the Unix manual. This calls send() repeatedly\n\
2912until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002913to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002916/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002917
Guido van Rossum73624e91994-10-10 17:59:00 +00002918static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002919sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002920{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002921 Py_buffer pbuf;
2922 PyObject *addro;
2923 char *buf;
2924 Py_ssize_t len;
2925 sock_addr_t addrbuf;
Victor Stinner31c7e4f2015-04-02 17:19:17 +02002926 int addrlen, flags, timeout;
2927 long n = -1;
Ezio Melotti0639be62011-05-07 19:21:22 +03002928 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002930 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002931 arglen = PyTuple_Size(args);
2932 switch(arglen) {
2933 case 2:
2934 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2935 break;
2936 case 3:
2937 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2938 break;
2939 default:
2940 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2941 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002942 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002943 if (PyErr_Occurred())
2944 return NULL;
2945
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002946 buf = pbuf.buf;
2947 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002948
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002949 if (!IS_SELECTABLE(s)) {
2950 PyBuffer_Release(&pbuf);
2951 return select_error();
2952 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002953
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002954 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2955 PyBuffer_Release(&pbuf);
2956 return NULL;
2957 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002958
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002959 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002960 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002961 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002962 if (!timeout)
2963 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2964 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002965
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002966 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002967 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002968 PyErr_SetString(socket_timeout, "timed out");
2969 return NULL;
2970 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002971 END_SELECT_LOOP(s)
2972 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002973 if (n < 0)
2974 return s->errorhandler();
2975 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002976}
2977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002978PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002979"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002980\n\
2981Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002982For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983
Guido van Rossum30a685f1991-06-27 15:51:29 +00002984
2985/* s.shutdown(how) method */
2986
Guido van Rossum73624e91994-10-10 17:59:00 +00002987static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002988sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002989{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002990 int how;
2991 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002992
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002993 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002994 if (how == -1 && PyErr_Occurred())
2995 return NULL;
2996 Py_BEGIN_ALLOW_THREADS
2997 res = shutdown(s->sock_fd, how);
2998 Py_END_ALLOW_THREADS
2999 if (res < 0)
3000 return s->errorhandler();
3001 Py_INCREF(Py_None);
3002 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003003}
3004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003005PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003006"shutdown(flag)\n\
3007\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003008Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3009of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003010
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003011#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00003012static PyObject*
3013sock_ioctl(PySocketSockObject *s, PyObject *arg)
3014{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003015 unsigned long cmd = SIO_RCVALL;
3016 PyObject *argO;
3017 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00003018
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003019 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3020 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003021
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003022 switch (cmd) {
3023 case SIO_RCVALL: {
3024 unsigned int option = RCVALL_ON;
3025 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3026 return NULL;
3027 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3028 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3029 return set_error();
3030 }
3031 return PyLong_FromUnsignedLong(recv); }
3032 case SIO_KEEPALIVE_VALS: {
3033 struct tcp_keepalive ka;
3034 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3035 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3036 return NULL;
3037 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3038 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3039 return set_error();
3040 }
3041 return PyLong_FromUnsignedLong(recv); }
3042 default:
3043 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3044 return NULL;
3045 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003046}
3047PyDoc_STRVAR(sock_ioctl_doc,
3048"ioctl(cmd, option) -> long\n\
3049\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003050Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3051SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3052SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003053
3054#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003055
3056/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003058static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003059 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3060 accept_doc},
3061 {"bind", (PyCFunction)sock_bind, METH_O,
3062 bind_doc},
3063 {"close", (PyCFunction)sock_close, METH_NOARGS,
3064 close_doc},
3065 {"connect", (PyCFunction)sock_connect, METH_O,
3066 connect_doc},
3067 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3068 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003069#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003070 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3071 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003072#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3074 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003075#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003076 {"getpeername", (PyCFunction)sock_getpeername,
3077 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003078#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003079 {"getsockname", (PyCFunction)sock_getsockname,
3080 METH_NOARGS, getsockname_doc},
3081 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3082 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003083#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003084 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3085 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003087 {"listen", (PyCFunction)sock_listen, METH_O,
3088 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003089#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003090 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3091 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003093 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3094 recv_doc},
3095 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3096 recv_into_doc},
3097 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3098 recvfrom_doc},
3099 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3100 recvfrom_into_doc},
3101 {"send", (PyCFunction)sock_send, METH_VARARGS,
3102 send_doc},
3103 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3104 sendall_doc},
3105 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3106 sendto_doc},
3107 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3108 setblocking_doc},
3109 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3110 settimeout_doc},
3111 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3112 gettimeout_doc},
3113 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3114 setsockopt_doc},
3115 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3116 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003117#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003118 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3119 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003120#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003121 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003122};
3123
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003124/* SockObject members */
3125static PyMemberDef sock_memberlist[] = {
3126 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3127 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3128 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3129 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3130 {0},
3131};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003132
Guido van Rossum73624e91994-10-10 17:59:00 +00003133/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003134 First close the file description. */
3135
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003136static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003137sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003138{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003139 if (s->sock_fd != -1)
3140 (void) SOCKETCLOSE(s->sock_fd);
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003141 if (s->weakreflist != NULL)
3142 PyObject_ClearWeakRefs((PyObject *)s);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003143 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003144}
3145
Guido van Rossum30a685f1991-06-27 15:51:29 +00003146
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003147static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003148sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003149{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003150 char buf[512];
Victor Stinner0a649c72014-07-26 14:52:55 +02003151 long sock_fd;
3152 /* On Windows, this test is needed because SOCKET_T is unsigned */
3153 if (s->sock_fd == INVALID_SOCKET) {
3154 sock_fd = -1;
3155 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003156#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinner0a649c72014-07-26 14:52:55 +02003157 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003158 /* this can occur on Win64, and actually there is a special
3159 ugly printf formatter for decimal pointer length integer
3160 printing, only bother if necessary*/
3161 PyErr_SetString(PyExc_OverflowError,
3162 "no printf formatter to display "
3163 "the socket descriptor in decimal");
3164 return NULL;
3165 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003166#endif
Victor Stinner0a649c72014-07-26 14:52:55 +02003167 else
3168 sock_fd = (long)s->sock_fd;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003169 PyOS_snprintf(
3170 buf, sizeof(buf),
3171 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Victor Stinner0a649c72014-07-26 14:52:55 +02003172 sock_fd, s->sock_family,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003173 s->sock_type,
3174 s->sock_proto);
3175 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003176}
3177
3178
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003179/* Create a new, uninitialized socket object. */
3180
3181static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003182sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003183{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003184 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003185
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003186 new = type->tp_alloc(type, 0);
3187 if (new != NULL) {
3188 ((PySocketSockObject *)new)->sock_fd = -1;
3189 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3190 ((PySocketSockObject *)new)->errorhandler = &set_error;
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003191 ((PySocketSockObject *)new)->weakreflist = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003192 }
3193 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003194}
3195
3196
3197/* Initialize a new socket object. */
3198
3199/*ARGSUSED*/
3200static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003201sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003202{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003203 PySocketSockObject *s = (PySocketSockObject *)self;
3204 SOCKET_T fd;
3205 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3206 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003207
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003208 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3209 "|iii:socket", keywords,
3210 &family, &type, &proto))
3211 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003212
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003213 Py_BEGIN_ALLOW_THREADS
3214 fd = socket(family, type, proto);
3215 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003216
Victor Stinner465db3c2014-07-26 14:47:56 +02003217 if (fd == INVALID_SOCKET) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003218 set_error();
3219 return -1;
3220 }
3221 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003222
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003223 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003224
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003225}
3226
3227
Guido van Rossumb6775db1994-08-01 11:34:53 +00003228/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003229
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003230static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003231 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3232 "_socket.socket", /* tp_name */
3233 sizeof(PySocketSockObject), /* tp_basicsize */
3234 0, /* tp_itemsize */
3235 (destructor)sock_dealloc, /* tp_dealloc */
3236 0, /* tp_print */
3237 0, /* tp_getattr */
3238 0, /* tp_setattr */
3239 0, /* tp_compare */
3240 (reprfunc)sock_repr, /* tp_repr */
3241 0, /* tp_as_number */
3242 0, /* tp_as_sequence */
3243 0, /* tp_as_mapping */
3244 0, /* tp_hash */
3245 0, /* tp_call */
3246 0, /* tp_str */
3247 PyObject_GenericGetAttr, /* tp_getattro */
3248 0, /* tp_setattro */
3249 0, /* tp_as_buffer */
3250 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3251 sock_doc, /* tp_doc */
3252 0, /* tp_traverse */
3253 0, /* tp_clear */
3254 0, /* tp_richcompare */
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003255 offsetof(PySocketSockObject, weakreflist), /* tp_weaklistoffset */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003256 0, /* tp_iter */
3257 0, /* tp_iternext */
3258 sock_methods, /* tp_methods */
3259 sock_memberlist, /* tp_members */
3260 0, /* tp_getset */
3261 0, /* tp_base */
3262 0, /* tp_dict */
3263 0, /* tp_descr_get */
3264 0, /* tp_descr_set */
3265 0, /* tp_dictoffset */
3266 sock_initobj, /* tp_init */
3267 PyType_GenericAlloc, /* tp_alloc */
3268 sock_new, /* tp_new */
3269 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003270};
3271
Guido van Rossum30a685f1991-06-27 15:51:29 +00003272
Guido van Rossum81194471991-07-27 21:42:02 +00003273/* Python interface to gethostname(). */
3274
3275/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003276static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003277socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003279 char buf[1024];
3280 int res;
3281 Py_BEGIN_ALLOW_THREADS
3282 res = gethostname(buf, (int) sizeof buf - 1);
3283 Py_END_ALLOW_THREADS
3284 if (res < 0)
3285 return set_error();
3286 buf[sizeof buf - 1] = '\0';
3287 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003288}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003290PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003291"gethostname() -> string\n\
3292\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003293Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003294
Guido van Rossumff4949e1992-08-05 19:58:53 +00003295
Guido van Rossum30a685f1991-06-27 15:51:29 +00003296/* Python interface to gethostbyname(name). */
3297
3298/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003299static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003300socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003301{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003302 char *name;
3303 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003304
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003305 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3306 return NULL;
3307 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3308 return NULL;
3309 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003310}
3311
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003312PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003313"gethostbyname(host) -> address\n\
3314\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003315Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003316
3317
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003318/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3319
3320static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003321gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003322{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003323 char **pch;
3324 PyObject *rtn_tuple = (PyObject *)NULL;
3325 PyObject *name_list = (PyObject *)NULL;
3326 PyObject *addr_list = (PyObject *)NULL;
3327 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003328
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003329 if (h == NULL) {
3330 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003331#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003332 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003333#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003334 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003335#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003336 return NULL;
3337 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003338
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003339 if (h->h_addrtype != af) {
3340 /* Let's get real error message to return */
3341 PyErr_SetString(socket_error,
3342 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003344 return NULL;
3345 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003346
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003347 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003348
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003349 case AF_INET:
3350 if (alen < sizeof(struct sockaddr_in))
3351 return NULL;
3352 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003353
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003354#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003355 case AF_INET6:
3356 if (alen < sizeof(struct sockaddr_in6))
3357 return NULL;
3358 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003359#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003361 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003363 if ((name_list = PyList_New(0)) == NULL)
3364 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003365
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003366 if ((addr_list = PyList_New(0)) == NULL)
3367 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003368
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003369 /* SF #1511317: h_aliases can be NULL */
3370 if (h->h_aliases) {
3371 for (pch = h->h_aliases; *pch != NULL; pch++) {
3372 int status;
3373 tmp = PyString_FromString(*pch);
3374 if (tmp == NULL)
3375 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003376
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003377 status = PyList_Append(name_list, tmp);
3378 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003379
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003380 if (status)
3381 goto err;
3382 }
3383 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003384
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003385 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3386 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003387
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003388 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003389
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003390 case AF_INET:
3391 {
3392 struct sockaddr_in sin;
3393 memset(&sin, 0, sizeof(sin));
3394 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003395#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003396 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003397#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003398 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3399 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003400
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003401 if (pch == h->h_addr_list && alen >= sizeof(sin))
3402 memcpy((char *) addr, &sin, sizeof(sin));
3403 break;
3404 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003405
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003406#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003407 case AF_INET6:
3408 {
3409 struct sockaddr_in6 sin6;
3410 memset(&sin6, 0, sizeof(sin6));
3411 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003412#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003413 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003414#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003415 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3416 tmp = makeipaddr((struct sockaddr *)&sin6,
3417 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003418
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003419 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3420 memcpy((char *) addr, &sin6, sizeof(sin6));
3421 break;
3422 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003423#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003424
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003425 default: /* can't happen */
3426 PyErr_SetString(socket_error,
3427 "unsupported address family");
3428 return NULL;
3429 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003430
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003431 if (tmp == NULL)
3432 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003433
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003434 status = PyList_Append(addr_list, tmp);
3435 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003436
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003437 if (status)
3438 goto err;
3439 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003440
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003441 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003442
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003443 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003444 Py_XDECREF(name_list);
3445 Py_XDECREF(addr_list);
3446 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003447}
3448
3449
3450/* Python interface to gethostbyname_ex(name). */
3451
3452/*ARGSUSED*/
3453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003454socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003455{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003456 char *name;
3457 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003458#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003459 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003460#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003461 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003462#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003463 struct sockaddr *sa;
3464 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003465#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003466 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003467#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003468 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003469#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003470 char buf[16384];
3471 int buf_len = (sizeof buf) - 1;
3472 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003473#endif
3474#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003475 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003476#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003477#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003478
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003479 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3480 return NULL;
3481 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3482 return NULL;
3483 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003484#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003485#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003486 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3487 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003488#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003489 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003490#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003491 memset((void *) &data, '\0', sizeof(data));
3492 result = gethostbyname_r(name, &hp_allocated, &data);
3493 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003494#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003495#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003496#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003497 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003498#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003499 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003500#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003501 Py_END_ALLOW_THREADS
3502 /* Some C libraries would require addr.__ss_family instead of
3503 addr.ss_family.
3504 Therefore, we cast the sockaddr_storage into sockaddr to
3505 access sa_family. */
3506 sa = (struct sockaddr*)&addr;
3507 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3508 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003509#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003510 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003511#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003512 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003513}
3514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003515PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003516"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3517\n\
3518Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003519for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003520
3521
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003522/* Python interface to gethostbyaddr(IP). */
3523
3524/*ARGSUSED*/
3525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003526socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003527{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003528#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003529 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003530#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003531 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003532#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003533 struct sockaddr *sa = (struct sockaddr *)&addr;
3534 char *ip_num;
3535 struct hostent *h;
3536 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003537#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003538 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003539#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003540 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003541#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003542 /* glibcs up to 2.10 assume that the buf argument to
3543 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3544 does not ensure. The attribute below instructs the compiler
3545 to maintain this alignment. */
3546 char buf[16384] Py_ALIGNED(8);
3547 int buf_len = (sizeof buf) - 1;
3548 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003549#endif
3550#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003551 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003552#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003553#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003554 char *ap;
3555 int al;
3556 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003557
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003558 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3559 return NULL;
3560 af = AF_UNSPEC;
3561 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3562 return NULL;
3563 af = sa->sa_family;
3564 ap = NULL;
3565 switch (af) {
3566 case AF_INET:
3567 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3568 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3569 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003570#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003571 case AF_INET6:
3572 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3573 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3574 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003576 default:
3577 PyErr_SetString(socket_error, "unsupported address family");
3578 return NULL;
3579 }
3580 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003581#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003582#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003583 result = gethostbyaddr_r(ap, al, af,
3584 &hp_allocated, buf, buf_len,
3585 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003586#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003587 h = gethostbyaddr_r(ap, al, af,
3588 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003589#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003590 memset((void *) &data, '\0', sizeof(data));
3591 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3592 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003593#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003594#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003595#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003596 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003597#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003598 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003599#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003600 Py_END_ALLOW_THREADS
3601 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003602#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003603 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003604#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003605 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003606}
3607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003608PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003609"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3610\n\
3611Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003612for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003613
Guido van Rossum30a685f1991-06-27 15:51:29 +00003614
3615/* Python interface to getservbyname(name).
3616 This only returns the port number, since the other info is already
3617 known or not useful (like the list of aliases). */
3618
3619/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003621socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003622{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003623 char *name, *proto=NULL;
3624 struct servent *sp;
3625 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3626 return NULL;
3627 Py_BEGIN_ALLOW_THREADS
3628 sp = getservbyname(name, proto);
3629 Py_END_ALLOW_THREADS
3630 if (sp == NULL) {
3631 PyErr_SetString(socket_error, "service/proto not found");
3632 return NULL;
3633 }
3634 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003635}
3636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003637PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003638"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003639\n\
3640Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003641The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3642otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003643
Guido van Rossum30a685f1991-06-27 15:51:29 +00003644
Barry Warsaw11b91a02004-06-28 00:50:43 +00003645/* Python interface to getservbyport(port).
3646 This only returns the service name, since the other info is already
3647 known or not useful (like the list of aliases). */
3648
3649/*ARGSUSED*/
3650static PyObject *
3651socket_getservbyport(PyObject *self, PyObject *args)
3652{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003653 int port;
3654 char *proto=NULL;
3655 struct servent *sp;
3656 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3657 return NULL;
3658 if (port < 0 || port > 0xffff) {
3659 PyErr_SetString(
3660 PyExc_OverflowError,
3661 "getservbyport: port must be 0-65535.");
3662 return NULL;
3663 }
3664 Py_BEGIN_ALLOW_THREADS
3665 sp = getservbyport(htons((short)port), proto);
3666 Py_END_ALLOW_THREADS
3667 if (sp == NULL) {
3668 PyErr_SetString(socket_error, "port/proto not found");
3669 return NULL;
3670 }
3671 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003672}
3673
3674PyDoc_STRVAR(getservbyport_doc,
3675"getservbyport(port[, protocolname]) -> string\n\
3676\n\
3677Return the service name from a port number and protocol name.\n\
3678The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3679otherwise any protocol will match.");
3680
Guido van Rossum3901d851996-12-19 16:35:04 +00003681/* Python interface to getprotobyname(name).
3682 This only returns the protocol number, since the other info is
3683 already known or not useful (like the list of aliases). */
3684
3685/*ARGSUSED*/
3686static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003687socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003688{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003689 char *name;
3690 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003691#ifdef __BEOS__
3692/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003693 PyErr_SetString(socket_error, "getprotobyname not supported");
3694 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003695#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003696 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3697 return NULL;
3698 Py_BEGIN_ALLOW_THREADS
3699 sp = getprotobyname(name);
3700 Py_END_ALLOW_THREADS
3701 if (sp == NULL) {
3702 PyErr_SetString(socket_error, "protocol not found");
3703 return NULL;
3704 }
3705 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003706#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003707}
3708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003709PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003710"getprotobyname(name) -> integer\n\
3711\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003712Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003713
Guido van Rossum3901d851996-12-19 16:35:04 +00003714
Dave Cole331708b2004-08-09 04:51:41 +00003715#ifdef HAVE_SOCKETPAIR
3716/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003717 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003718 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003719
3720/*ARGSUSED*/
3721static PyObject *
3722socket_socketpair(PyObject *self, PyObject *args)
3723{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003724 PySocketSockObject *s0 = NULL, *s1 = NULL;
3725 SOCKET_T sv[2];
3726 int family, type = SOCK_STREAM, proto = 0;
3727 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003728
3729#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003730 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003731#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003732 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003733#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003734 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3735 &family, &type, &proto))
3736 return NULL;
3737 /* Create a pair of socket fds */
3738 if (socketpair(family, type, proto, sv) < 0)
3739 return set_error();
3740 s0 = new_sockobject(sv[0], family, type, proto);
3741 if (s0 == NULL)
3742 goto finally;
3743 s1 = new_sockobject(sv[1], family, type, proto);
3744 if (s1 == NULL)
3745 goto finally;
3746 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003747
3748finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003749 if (res == NULL) {
3750 if (s0 == NULL)
3751 SOCKETCLOSE(sv[0]);
3752 if (s1 == NULL)
3753 SOCKETCLOSE(sv[1]);
3754 }
3755 Py_XDECREF(s0);
3756 Py_XDECREF(s1);
3757 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003758}
3759
3760PyDoc_STRVAR(socketpair_doc,
3761"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3762\n\
3763Create a pair of socket objects from the sockets returned by the platform\n\
3764socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003765The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003766AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003767
3768#endif /* HAVE_SOCKETPAIR */
3769
3770
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003771#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003772/* Create a socket object from a numeric file description.
3773 Useful e.g. if stdin is a socket.
3774 Additional arguments as for socket(). */
3775
3776/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003777static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003779{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003780 PySocketSockObject *s;
3781 SOCKET_T fd;
3782 int family, type, proto = 0;
3783 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3784 &fd, &family, &type, &proto))
3785 return NULL;
3786 /* Dup the fd so it and the socket can be closed independently */
3787 fd = dup(fd);
3788 if (fd < 0)
3789 return set_error();
3790 s = new_sockobject(fd, family, type, proto);
3791 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003792}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003794PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003795"fromfd(fd, family, type[, proto]) -> socket object\n\
3796\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003797Create a socket object from a duplicate of the given\n\
3798file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003799The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003800
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003801#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003802
Guido van Rossum82a5c661998-07-07 20:45:43 +00003803
Guido van Rossum006bf911996-06-12 04:04:55 +00003804static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003805socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003806{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003807 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003808
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003809 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3810 return NULL;
3811 }
3812 if (x1 < 0) {
3813 PyErr_SetString(PyExc_OverflowError,
3814 "can't convert negative number to unsigned long");
3815 return NULL;
3816 }
3817 x2 = (unsigned int)ntohs((unsigned short)x1);
3818 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003819}
3820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003821PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003822"ntohs(integer) -> integer\n\
3823\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003824Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003825
3826
Guido van Rossum006bf911996-06-12 04:04:55 +00003827static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003828socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003829{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003830 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003831
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003832 if (PyInt_Check(arg)) {
3833 x = PyInt_AS_LONG(arg);
3834 if (x == (unsigned long) -1 && PyErr_Occurred())
3835 return NULL;
3836 if ((long)x < 0) {
3837 PyErr_SetString(PyExc_OverflowError,
3838 "can't convert negative number to unsigned long");
3839 return NULL;
3840 }
3841 }
3842 else if (PyLong_Check(arg)) {
3843 x = PyLong_AsUnsignedLong(arg);
3844 if (x == (unsigned long) -1 && PyErr_Occurred())
3845 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003846#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003847 {
3848 unsigned long y;
3849 /* only want the trailing 32 bits */
3850 y = x & 0xFFFFFFFFUL;
3851 if (y ^ x)
3852 return PyErr_Format(PyExc_OverflowError,
3853 "long int larger than 32 bits");
3854 x = y;
3855 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003856#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003857 }
3858 else
3859 return PyErr_Format(PyExc_TypeError,
3860 "expected int/long, %s found",
3861 Py_TYPE(arg)->tp_name);
3862 if (x == (unsigned long) -1 && PyErr_Occurred())
3863 return NULL;
3864 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003865}
3866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003867PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003868"ntohl(integer) -> integer\n\
3869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003870Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003871
3872
Guido van Rossum006bf911996-06-12 04:04:55 +00003873static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003874socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003875{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003876 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003877
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003878 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3879 return NULL;
3880 }
3881 if (x1 < 0) {
3882 PyErr_SetString(PyExc_OverflowError,
3883 "can't convert negative number to unsigned long");
3884 return NULL;
3885 }
3886 x2 = (unsigned int)htons((unsigned short)x1);
3887 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003888}
3889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003890PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003891"htons(integer) -> integer\n\
3892\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003893Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003894
3895
Guido van Rossum006bf911996-06-12 04:04:55 +00003896static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003897socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003898{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003899 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003900
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003901 if (PyInt_Check(arg)) {
3902 x = PyInt_AS_LONG(arg);
3903 if (x == (unsigned long) -1 && PyErr_Occurred())
3904 return NULL;
3905 if ((long)x < 0) {
3906 PyErr_SetString(PyExc_OverflowError,
3907 "can't convert negative number to unsigned long");
3908 return NULL;
3909 }
3910 }
3911 else if (PyLong_Check(arg)) {
3912 x = PyLong_AsUnsignedLong(arg);
3913 if (x == (unsigned long) -1 && PyErr_Occurred())
3914 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003915#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003916 {
3917 unsigned long y;
3918 /* only want the trailing 32 bits */
3919 y = x & 0xFFFFFFFFUL;
3920 if (y ^ x)
3921 return PyErr_Format(PyExc_OverflowError,
3922 "long int larger than 32 bits");
3923 x = y;
3924 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003925#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003926 }
3927 else
3928 return PyErr_Format(PyExc_TypeError,
3929 "expected int/long, %s found",
3930 Py_TYPE(arg)->tp_name);
3931 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003932}
3933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003934PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003935"htonl(integer) -> integer\n\
3936\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003937Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003938
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003939/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003940
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003941PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003942"inet_aton(string) -> packed 32-bit IP representation\n\
3943\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003944Convert 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 +00003945binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003946
3947static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003949{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003950#ifndef INADDR_NONE
3951#define INADDR_NONE (-1)
3952#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003953#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003954 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003955#endif
3956
3957#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003958#if (SIZEOF_INT != 4)
3959#error "Not sure if in_addr_t exists and int is not 32-bits."
3960#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003961 /* Have to use inet_addr() instead */
3962 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003963#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003964 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003965
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003966 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3967 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003968
Tim Peters1df9fdd2003-02-13 03:13:40 +00003969
3970#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003971
3972#ifdef USE_INET_ATON_WEAKLINK
3973 if (inet_aton != NULL) {
3974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003975 if (inet_aton(ip_addr, &buf))
3976 return PyString_FromStringAndSize((char *)(&buf),
3977 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003978
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003979 PyErr_SetString(socket_error,
3980 "illegal IP address string passed to inet_aton");
3981 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003982
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003983#ifdef USE_INET_ATON_WEAKLINK
3984 } else {
3985#endif
3986
3987#endif
3988
3989#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3990
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003991 /* special-case this address as inet_addr might return INADDR_NONE
3992 * for this */
3993 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3994 packed_addr = 0xFFFFFFFF;
3995 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003996
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003997 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003998
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003999 if (packed_addr == INADDR_NONE) { /* invalid address */
4000 PyErr_SetString(socket_error,
4001 "illegal IP address string passed to inet_aton");
4002 return NULL;
4003 }
4004 }
4005 return PyString_FromStringAndSize((char *) &packed_addr,
4006 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00004007
4008#ifdef USE_INET_ATON_WEAKLINK
4009 }
4010#endif
4011
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004012#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004013}
4014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004015PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004016"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004017\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004018Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004019
4020static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004021socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004022{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004023 char *packed_str;
4024 int addr_len;
4025 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004026
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004027 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4028 return NULL;
4029 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004030
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004031 if (addr_len != sizeof(packed_addr)) {
4032 PyErr_SetString(socket_error,
4033 "packed IP wrong length for inet_ntoa");
4034 return NULL;
4035 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004036
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004037 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004038
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004039 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004040}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004041
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004042#ifdef HAVE_INET_PTON
4043
4044PyDoc_STRVAR(inet_pton_doc,
4045"inet_pton(af, ip) -> packed IP address string\n\
4046\n\
4047Convert an IP address from string format to a packed string suitable\n\
4048for use with low-level network functions.");
4049
4050static PyObject *
4051socket_inet_pton(PyObject *self, PyObject *args)
4052{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004053 int af;
4054 char* ip;
4055 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004056#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004057 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004058#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004059 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004060#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004061 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4062 return NULL;
4063 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004064
Martin v. Löwis04697e82004-06-02 12:35:29 +00004065#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004066 if(af == AF_INET6) {
4067 PyErr_SetString(socket_error,
4068 "can't use AF_INET6, IPv6 is disabled");
4069 return NULL;
4070 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004071#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004072
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004073 retval = inet_pton(af, ip, packed);
4074 if (retval < 0) {
4075 PyErr_SetFromErrno(socket_error);
4076 return NULL;
4077 } else if (retval == 0) {
4078 PyErr_SetString(socket_error,
4079 "illegal IP address string passed to inet_pton");
4080 return NULL;
4081 } else if (af == AF_INET) {
4082 return PyString_FromStringAndSize(packed,
4083 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004084#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004085 } else if (af == AF_INET6) {
4086 return PyString_FromStringAndSize(packed,
4087 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004088#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004089 } else {
4090 PyErr_SetString(socket_error, "unknown address family");
4091 return NULL;
4092 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004093}
Martin Blais2856e5f2006-05-26 12:03:27 +00004094
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004095PyDoc_STRVAR(inet_ntop_doc,
4096"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4097\n\
4098Convert a packed IP address of the given family to string format.");
4099
4100static PyObject *
4101socket_inet_ntop(PyObject *self, PyObject *args)
4102{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004103 int af;
4104 char* packed;
4105 int len;
4106 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004107#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004108 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004109#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004110 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004111#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004112
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004113 /* Guarantee NUL-termination for PyString_FromString() below */
4114 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004115
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004116 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4117 return NULL;
4118 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004119
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004120 if (af == AF_INET) {
4121 if (len != sizeof(struct in_addr)) {
4122 PyErr_SetString(PyExc_ValueError,
4123 "invalid length of packed IP address string");
4124 return NULL;
4125 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004126#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004127 } else if (af == AF_INET6) {
4128 if (len != sizeof(struct in6_addr)) {
4129 PyErr_SetString(PyExc_ValueError,
4130 "invalid length of packed IP address string");
4131 return NULL;
4132 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004133#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004134 } else {
4135 PyErr_Format(PyExc_ValueError,
4136 "unknown address family %d", af);
4137 return NULL;
4138 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004139
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004140 retval = inet_ntop(af, packed, ip, sizeof(ip));
4141 if (!retval) {
4142 PyErr_SetFromErrno(socket_error);
4143 return NULL;
4144 } else {
4145 return PyString_FromString(retval);
4146 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004147
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004148 /* NOTREACHED */
4149 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4150 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004151}
4152
4153#endif /* HAVE_INET_PTON */
4154
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004155/* Python interface to getaddrinfo(host, port). */
4156
4157/*ARGSUSED*/
4158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004159socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004160{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004161 struct addrinfo hints, *res;
4162 struct addrinfo *res0 = NULL;
4163 PyObject *hobj = NULL;
4164 PyObject *pobj = (PyObject *)NULL;
4165 char pbuf[30];
4166 char *hptr, *pptr;
4167 int family, socktype, protocol, flags;
4168 int error;
4169 PyObject *all = (PyObject *)NULL;
4170 PyObject *single = (PyObject *)NULL;
4171 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004172
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004173 family = socktype = protocol = flags = 0;
4174 family = AF_UNSPEC;
4175 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4176 &hobj, &pobj, &family, &socktype,
4177 &protocol, &flags)) {
4178 return NULL;
4179 }
4180 if (hobj == Py_None) {
4181 hptr = NULL;
4182 } else if (PyUnicode_Check(hobj)) {
Victor Stinner9a2326b2015-09-11 12:42:13 +02004183 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004184 if (!idna)
4185 return NULL;
4186 hptr = PyString_AsString(idna);
4187 } else if (PyString_Check(hobj)) {
4188 hptr = PyString_AsString(hobj);
4189 } else {
4190 PyErr_SetString(PyExc_TypeError,
4191 "getaddrinfo() argument 1 must be string or None");
4192 return NULL;
4193 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004194 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4195 long value = PyLong_AsLong(pobj);
4196 if (value == -1 && PyErr_Occurred())
4197 return NULL;
4198 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004199 pptr = pbuf;
4200 } else if (PyString_Check(pobj)) {
4201 pptr = PyString_AsString(pobj);
4202 } else if (pobj == Py_None) {
4203 pptr = (char *)NULL;
4204 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004205 PyErr_SetString(socket_error,
4206 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004207 goto err;
4208 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004209#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004210 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4211 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4212 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4213 * This workaround avoids a segfault in libsystem.
4214 */
4215 pptr = "00";
4216 }
4217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004218 memset(&hints, 0, sizeof(hints));
4219 hints.ai_family = family;
4220 hints.ai_socktype = socktype;
4221 hints.ai_protocol = protocol;
4222 hints.ai_flags = flags;
4223 Py_BEGIN_ALLOW_THREADS
4224 ACQUIRE_GETADDRINFO_LOCK
4225 error = getaddrinfo(hptr, pptr, &hints, &res0);
4226 Py_END_ALLOW_THREADS
4227 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4228 if (error) {
4229 set_gaierror(error);
4230 goto err;
4231 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004232
Benjamin Petersona5a44ab2015-04-01 11:16:40 -04004233 all = PyList_New(0);
4234 if (all == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004235 goto err;
4236 for (res = res0; res; res = res->ai_next) {
4237 PyObject *addr =
4238 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4239 if (addr == NULL)
4240 goto err;
4241 single = Py_BuildValue("iiisO", res->ai_family,
4242 res->ai_socktype, res->ai_protocol,
4243 res->ai_canonname ? res->ai_canonname : "",
4244 addr);
4245 Py_DECREF(addr);
4246 if (single == NULL)
4247 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004248
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004249 if (PyList_Append(all, single))
4250 goto err;
4251 Py_XDECREF(single);
4252 }
4253 Py_XDECREF(idna);
4254 if (res0)
4255 freeaddrinfo(res0);
4256 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004257 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004258 Py_XDECREF(single);
4259 Py_XDECREF(all);
4260 Py_XDECREF(idna);
4261 if (res0)
4262 freeaddrinfo(res0);
4263 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004264}
4265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004266PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004267"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4268 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004269\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004270Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004271
4272/* Python interface to getnameinfo(sa, flags). */
4273
4274/*ARGSUSED*/
4275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004276socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004277{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004278 PyObject *sa = (PyObject *)NULL;
4279 int flags;
4280 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004281 int port;
4282 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004283 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4284 struct addrinfo hints, *res = NULL;
4285 int error;
4286 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004287
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004288 flags = flowinfo = scope_id = 0;
4289 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4290 return NULL;
4291 if (!PyTuple_Check(sa)) {
4292 PyErr_SetString(PyExc_TypeError,
4293 "getnameinfo() argument 1 must be a tuple");
4294 return NULL;
4295 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004296 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004297 &hostp, &port, &flowinfo, &scope_id))
4298 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004299 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004300 PyErr_SetString(PyExc_OverflowError,
4301 "getsockaddrarg: flowinfo must be 0-1048575.");
4302 return NULL;
4303 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004304 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4305 memset(&hints, 0, sizeof(hints));
4306 hints.ai_family = AF_UNSPEC;
4307 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4308 Py_BEGIN_ALLOW_THREADS
4309 ACQUIRE_GETADDRINFO_LOCK
4310 error = getaddrinfo(hostp, pbuf, &hints, &res);
4311 Py_END_ALLOW_THREADS
4312 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4313 if (error) {
4314 set_gaierror(error);
4315 goto fail;
4316 }
4317 if (res->ai_next) {
4318 PyErr_SetString(socket_error,
4319 "sockaddr resolved to multiple addresses");
4320 goto fail;
4321 }
4322 switch (res->ai_family) {
4323 case AF_INET:
4324 {
4325 if (PyTuple_GET_SIZE(sa) != 2) {
4326 PyErr_SetString(socket_error,
4327 "IPv4 sockaddr must be 2 tuple");
4328 goto fail;
4329 }
4330 break;
4331 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004332#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004333 case AF_INET6:
4334 {
4335 struct sockaddr_in6 *sin6;
4336 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004337 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004338 sin6->sin6_scope_id = scope_id;
4339 break;
4340 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004341#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004342 }
4343 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4344 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4345 if (error) {
4346 set_gaierror(error);
4347 goto fail;
4348 }
4349 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004350
4351fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004352 if (res)
4353 freeaddrinfo(res);
4354 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004355}
4356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004357PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004358"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004359\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004360Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004361
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004362
4363/* Python API to getting and setting the default timeout value. */
4364
4365static PyObject *
4366socket_getdefaulttimeout(PyObject *self)
4367{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004368 if (defaulttimeout < 0.0) {
4369 Py_INCREF(Py_None);
4370 return Py_None;
4371 }
4372 else
4373 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004374}
4375
4376PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004377"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004378\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004379Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004380A value of None indicates that new socket objects have no timeout.\n\
4381When the socket module is first imported, the default is None.");
4382
4383static PyObject *
4384socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4385{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004386 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004387
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004388 if (arg == Py_None)
4389 timeout = -1.0;
4390 else {
4391 timeout = PyFloat_AsDouble(arg);
4392 if (timeout < 0.0) {
4393 if (!PyErr_Occurred())
4394 PyErr_SetString(PyExc_ValueError,
4395 "Timeout value out of range");
4396 return NULL;
4397 }
4398 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004399
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004400 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004402 Py_INCREF(Py_None);
4403 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004404}
4405
4406PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004407"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004408\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004409Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004410A value of None indicates that new socket objects have no timeout.\n\
4411When the socket module is first imported, the default is None.");
4412
4413
Guido van Rossum30a685f1991-06-27 15:51:29 +00004414/* List of functions exported by this module. */
4415
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004416static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004417 {"gethostbyname", socket_gethostbyname,
4418 METH_VARARGS, gethostbyname_doc},
4419 {"gethostbyname_ex", socket_gethostbyname_ex,
4420 METH_VARARGS, ghbn_ex_doc},
4421 {"gethostbyaddr", socket_gethostbyaddr,
4422 METH_VARARGS, gethostbyaddr_doc},
4423 {"gethostname", socket_gethostname,
4424 METH_NOARGS, gethostname_doc},
4425 {"getservbyname", socket_getservbyname,
4426 METH_VARARGS, getservbyname_doc},
4427 {"getservbyport", socket_getservbyport,
4428 METH_VARARGS, getservbyport_doc},
4429 {"getprotobyname", socket_getprotobyname,
4430 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004431#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004432 {"fromfd", socket_fromfd,
4433 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004434#endif
Dave Cole331708b2004-08-09 04:51:41 +00004435#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004436 {"socketpair", socket_socketpair,
4437 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004438#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004439 {"ntohs", socket_ntohs,
4440 METH_VARARGS, ntohs_doc},
4441 {"ntohl", socket_ntohl,
4442 METH_O, ntohl_doc},
4443 {"htons", socket_htons,
4444 METH_VARARGS, htons_doc},
4445 {"htonl", socket_htonl,
4446 METH_O, htonl_doc},
4447 {"inet_aton", socket_inet_aton,
4448 METH_VARARGS, inet_aton_doc},
4449 {"inet_ntoa", socket_inet_ntoa,
4450 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004451#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004452 {"inet_pton", socket_inet_pton,
4453 METH_VARARGS, inet_pton_doc},
4454 {"inet_ntop", socket_inet_ntop,
4455 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004456#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004457 {"getaddrinfo", socket_getaddrinfo,
4458 METH_VARARGS, getaddrinfo_doc},
4459 {"getnameinfo", socket_getnameinfo,
4460 METH_VARARGS, getnameinfo_doc},
4461 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4462 METH_NOARGS, getdefaulttimeout_doc},
4463 {"setdefaulttimeout", socket_setdefaulttimeout,
4464 METH_O, setdefaulttimeout_doc},
4465 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004466};
4467
Guido van Rossum30a685f1991-06-27 15:51:29 +00004468
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004469#ifdef RISCOS
4470#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004471
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004472static int
4473os_init(void)
4474{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004475 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004476
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004477 r.r[0] = 0;
4478 _kernel_swi(0x43380, &r, &r);
4479 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004480
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004481 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004482}
4483
4484#endif /* RISCOS */
4485
4486
4487#ifdef MS_WINDOWS
4488#define OS_INIT_DEFINED
4489
4490/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004491
4492static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004493os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004494{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004495 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004496}
4497
4498static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004499os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004500{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004501 WSADATA WSAData;
4502 int ret;
4503 char buf[100];
4504 ret = WSAStartup(0x0101, &WSAData);
4505 switch (ret) {
4506 case 0: /* No error */
4507 Py_AtExit(os_cleanup);
4508 return 1; /* Success */
4509 case WSASYSNOTREADY:
4510 PyErr_SetString(PyExc_ImportError,
4511 "WSAStartup failed: network not ready");
4512 break;
4513 case WSAVERNOTSUPPORTED:
4514 case WSAEINVAL:
4515 PyErr_SetString(
4516 PyExc_ImportError,
4517 "WSAStartup failed: requested version not supported");
4518 break;
4519 default:
4520 PyOS_snprintf(buf, sizeof(buf),
4521 "WSAStartup failed: error code %d", ret);
4522 PyErr_SetString(PyExc_ImportError, buf);
4523 break;
4524 }
4525 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004526}
4527
Guido van Rossum8d665e61996-06-26 18:22:49 +00004528#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004529
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004530
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004531#ifdef PYOS_OS2
4532#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004533
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004534/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004535
4536static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004537os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004538{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004539#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004540 char reason[64];
4541 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004542
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004543 if (rc == 0) {
4544 return 1; /* Success */
4545 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004546
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004547 PyOS_snprintf(reason, sizeof(reason),
4548 "OS/2 TCP/IP Error# %d", sock_errno());
4549 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004550
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004551 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004552#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004553 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004554 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004555#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004556}
4557
4558#endif /* PYOS_OS2 */
4559
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004560
4561#ifndef OS_INIT_DEFINED
4562static int
4563os_init(void)
4564{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004565 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004566}
4567#endif
4568
4569
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004570/* C API table - always add new things to the end for binary
4571 compatibility. */
4572static
4573PySocketModule_APIObject PySocketModuleAPI =
4574{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004575 &sock_type,
4576 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004577};
4578
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004579
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004580/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004581
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004582 This module is actually called "_socket", and there's a wrapper
4583 "socket.py" which implements some additional functionality. On some
4584 platforms (e.g. Windows and OS/2), socket.py also implements a
4585 wrapper for the socket type that provides missing functionality such
4586 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4587 with an ImportError exception if os-specific initialization fails.
4588 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004589 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004590 made at exit time.
4591*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004592
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004593PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004594"Implementation module for socket operations.\n\
4595\n\
4596See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004597
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004598PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004599init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004600{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004601 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004602
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004603 if (!os_init())
4604 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004605
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004606 Py_TYPE(&sock_type) = &PyType_Type;
4607 m = Py_InitModule3(PySocket_MODULE_NAME,
4608 socket_methods,
4609 socket_doc);
4610 if (m == NULL)
4611 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004612
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004613 socket_error = PyErr_NewException("socket.error",
4614 PyExc_IOError, NULL);
4615 if (socket_error == NULL)
4616 return;
4617 PySocketModuleAPI.error = socket_error;
4618 Py_INCREF(socket_error);
4619 PyModule_AddObject(m, "error", socket_error);
4620 socket_herror = PyErr_NewException("socket.herror",
4621 socket_error, NULL);
4622 if (socket_herror == NULL)
4623 return;
4624 Py_INCREF(socket_herror);
4625 PyModule_AddObject(m, "herror", socket_herror);
4626 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4627 NULL);
4628 if (socket_gaierror == NULL)
4629 return;
4630 Py_INCREF(socket_gaierror);
4631 PyModule_AddObject(m, "gaierror", socket_gaierror);
4632 socket_timeout = PyErr_NewException("socket.timeout",
4633 socket_error, NULL);
4634 if (socket_timeout == NULL)
4635 return;
4636 Py_INCREF(socket_timeout);
4637 PyModule_AddObject(m, "timeout", socket_timeout);
4638 Py_INCREF((PyObject *)&sock_type);
4639 if (PyModule_AddObject(m, "SocketType",
4640 (PyObject *)&sock_type) != 0)
4641 return;
4642 Py_INCREF((PyObject *)&sock_type);
4643 if (PyModule_AddObject(m, "socket",
4644 (PyObject *)&sock_type) != 0)
4645 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004646
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004647#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004648 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004649#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004650 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004651#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004652 Py_INCREF(has_ipv6);
4653 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004654
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004655 /* Export C API */
4656 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4657 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4658 ) != 0)
4659 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004660
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004661 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004662#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004663 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004664#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004665 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004666#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004667 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004668#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004669#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004670 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004671#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004672#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004673 /* Amateur Radio AX.25 */
4674 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004675#endif
4676#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004677 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004678#endif
4679#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004680 /* Appletalk DDP */
4681 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004682#endif
4683#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004684 /* Amateur radio NetROM */
4685 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004686#endif
4687#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004688 /* Multiprotocol bridge */
4689 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004690#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004691#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004692 /* ATM PVCs */
4693 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004694#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004695#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004696 /* Reserved for Werner's ATM */
4697 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004698#endif
4699#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004700 /* Reserved for X.25 project */
4701 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004702#endif
4703#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004704 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004705#endif
4706#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004707 /* Amateur Radio X.25 PLP */
4708 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004709#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004710#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004711 /* Reserved for DECnet project */
4712 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004713#endif
4714#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004715 /* Reserved for 802.2LLC project */
4716 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004717#endif
4718#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004719 /* Security callback pseudo AF */
4720 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004721#endif
4722#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004723 /* PF_KEY key management API */
4724 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004725#endif
4726#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004727 /* */
4728 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4729 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004730#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004731 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004732#endif
4733#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004734 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004735#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004736 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4737 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004738#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004739 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004740#endif
4741#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004742 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004743#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004744#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004745 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004746#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004747#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004748 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004749#endif
4750#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004751 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004752#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004753 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004754#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004755 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4756#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004757#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004758 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004759#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004760#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004761#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004762 /* Alias to emulate 4.4BSD */
4763 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004764#endif
4765#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004766 /* Ash */
4767 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004768#endif
4769#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004770 /* Acorn Econet */
4771 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004772#endif
4773#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004774 /* ATM SVCs */
4775 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004776#endif
4777#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004778 /* Linux SNA Project (nutters!) */
4779 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004780#endif
4781#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004782 /* IRDA sockets */
4783 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004784#endif
4785#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004786 /* PPPoX sockets */
4787 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004788#endif
4789#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004790 /* Wanpipe API Sockets */
4791 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004792#endif
4793#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004794 /* Linux LLC */
4795 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004796#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004797
Hye-Shik Chang81268602004-02-02 06:05:24 +00004798#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004799 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4800 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4801 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4802 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004803#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004804 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004805#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004806#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004807#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004808 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004809#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004810 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4811 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004812#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004813 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4814 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4815 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004816#endif
4817
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004818#ifdef AF_PACKET
4819 PyModule_AddIntMacro(m, AF_PACKET);
4820#endif
4821#ifdef PF_PACKET
4822 PyModule_AddIntMacro(m, PF_PACKET);
4823#endif
4824#ifdef PACKET_HOST
4825 PyModule_AddIntMacro(m, PACKET_HOST);
4826#endif
4827#ifdef PACKET_BROADCAST
4828 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4829#endif
4830#ifdef PACKET_MULTICAST
4831 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4832#endif
4833#ifdef PACKET_OTHERHOST
4834 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4835#endif
4836#ifdef PACKET_OUTGOING
4837 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4838#endif
4839#ifdef PACKET_LOOPBACK
4840 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4841#endif
4842#ifdef PACKET_FASTROUTE
4843 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004844#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004845
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004846#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004847 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004849 /* for addresses */
4850 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4851 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4852 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004853
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004854 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4855 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4856 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004857
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004858 /* for setsockopt() */
4859 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4860 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4861 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4862 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4863 TIPC_DEST_DROPPABLE);
4864 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004866 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4867 TIPC_LOW_IMPORTANCE);
4868 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4869 TIPC_MEDIUM_IMPORTANCE);
4870 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4871 TIPC_HIGH_IMPORTANCE);
4872 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4873 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004874
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004875 /* for subscriptions */
4876 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4877 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004878#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004879 /* doesn't seem to be available everywhere */
4880 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004881#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004882 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4883 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4884 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4885 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4886 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4887 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004888#endif
4889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004890 /* Socket types */
4891 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4892 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004893#ifndef __BEOS__
4894/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004895 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4896 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004897#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004898 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004899#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004900#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004901
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004902#ifdef SO_DEBUG
4903 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004904#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004905#ifdef SO_ACCEPTCONN
4906 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004907#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004908#ifdef SO_REUSEADDR
4909 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004910#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004911#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004912 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004913#endif
4914
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004915#ifdef SO_KEEPALIVE
4916 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004917#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004918#ifdef SO_DONTROUTE
4919 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004920#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004921#ifdef SO_BROADCAST
4922 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004923#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004924#ifdef SO_USELOOPBACK
4925 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004927#ifdef SO_LINGER
4928 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004929#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004930#ifdef SO_OOBINLINE
4931 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004932#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004933#ifdef SO_REUSEPORT
4934 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004935#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004936#ifdef SO_SNDBUF
4937 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004938#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004939#ifdef SO_RCVBUF
4940 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004941#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004942#ifdef SO_SNDLOWAT
4943 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004944#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004945#ifdef SO_RCVLOWAT
4946 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004947#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004948#ifdef SO_SNDTIMEO
4949 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004950#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004951#ifdef SO_RCVTIMEO
4952 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004953#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004954#ifdef SO_ERROR
4955 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004956#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004957#ifdef SO_TYPE
4958 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004959#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004960#ifdef SO_SETFIB
4961 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4962#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004963
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004964 /* Maximum number of connections for "listen" */
4965#ifdef SOMAXCONN
4966 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004967#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004968 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004969#endif
4970
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004971 /* Flags for send, recv */
4972#ifdef MSG_OOB
4973 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004974#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004975#ifdef MSG_PEEK
4976 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004977#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004978#ifdef MSG_DONTROUTE
4979 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004980#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004981#ifdef MSG_DONTWAIT
4982 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004983#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004984#ifdef MSG_EOR
4985 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004986#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004987#ifdef MSG_TRUNC
4988 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004989#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004990#ifdef MSG_CTRUNC
4991 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004992#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004993#ifdef MSG_WAITALL
4994 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004995#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004996#ifdef MSG_BTAG
4997 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004998#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004999#ifdef MSG_ETAG
5000 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005001#endif
5002
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005003 /* Protocol level and numbers, usable for [gs]etsockopt */
5004#ifdef SOL_SOCKET
5005 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005006#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005007#ifdef SOL_IP
5008 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005009#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005010 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005011#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005012#ifdef SOL_IPX
5013 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005014#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005015#ifdef SOL_AX25
5016 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005017#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005018#ifdef SOL_ATALK
5019 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005020#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005021#ifdef SOL_NETROM
5022 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005023#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005024#ifdef SOL_ROSE
5025 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005026#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005027#ifdef SOL_TCP
5028 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005029#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005030 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005031#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005032#ifdef SOL_UDP
5033 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005034#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005035 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005036#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005037#ifdef IPPROTO_IP
5038 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005039#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005040 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005041#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005042#ifdef IPPROTO_HOPOPTS
5043 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005044#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005045#ifdef IPPROTO_ICMP
5046 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005047#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005048 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005049#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005050#ifdef IPPROTO_IGMP
5051 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005052#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005053#ifdef IPPROTO_GGP
5054 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005055#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005056#ifdef IPPROTO_IPV4
5057 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005058#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005059#ifdef IPPROTO_IPV6
5060 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005062#ifdef IPPROTO_IPIP
5063 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005064#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005065#ifdef IPPROTO_TCP
5066 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005067#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005068 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005069#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005070#ifdef IPPROTO_EGP
5071 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005072#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005073#ifdef IPPROTO_PUP
5074 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005075#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005076#ifdef IPPROTO_UDP
5077 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005078#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005079 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005081#ifdef IPPROTO_IDP
5082 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005083#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005084#ifdef IPPROTO_HELLO
5085 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005086#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005087#ifdef IPPROTO_ND
5088 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005090#ifdef IPPROTO_TP
5091 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005092#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005093#ifdef IPPROTO_IPV6
5094 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005095#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005096#ifdef IPPROTO_ROUTING
5097 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005098#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005099#ifdef IPPROTO_FRAGMENT
5100 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005101#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005102#ifdef IPPROTO_RSVP
5103 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005104#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005105#ifdef IPPROTO_GRE
5106 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005107#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005108#ifdef IPPROTO_ESP
5109 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005110#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005111#ifdef IPPROTO_AH
5112 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005113#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005114#ifdef IPPROTO_MOBILE
5115 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005116#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005117#ifdef IPPROTO_ICMPV6
5118 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005119#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005120#ifdef IPPROTO_NONE
5121 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005122#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005123#ifdef IPPROTO_DSTOPTS
5124 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005125#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005126#ifdef IPPROTO_XTP
5127 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005128#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005129#ifdef IPPROTO_EON
5130 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005131#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005132#ifdef IPPROTO_PIM
5133 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005135#ifdef IPPROTO_IPCOMP
5136 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005137#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005138#ifdef IPPROTO_VRRP
5139 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005140#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005141#ifdef IPPROTO_BIP
5142 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005143#endif
5144/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005145#ifdef IPPROTO_RAW
5146 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005147#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005148 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005149#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005150#ifdef IPPROTO_MAX
5151 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005152#endif
5153
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005154 /* Some port configuration */
5155#ifdef IPPORT_RESERVED
5156 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005157#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005158 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005159#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005160#ifdef IPPORT_USERRESERVED
5161 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005162#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005163 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005164#endif
5165
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005166 /* Some reserved IP v.4 addresses */
5167#ifdef INADDR_ANY
5168 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005169#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005170 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005171#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005172#ifdef INADDR_BROADCAST
5173 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005174#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005175 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005176#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005177#ifdef INADDR_LOOPBACK
5178 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005179#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005180 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005181#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005182#ifdef INADDR_UNSPEC_GROUP
5183 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005184#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005185 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005186#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005187#ifdef INADDR_ALLHOSTS_GROUP
5188 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5189 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005190#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005191 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005192#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005193#ifdef INADDR_MAX_LOCAL_GROUP
5194 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5195 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005196#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005197 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005198#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005199#ifdef INADDR_NONE
5200 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005201#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005202 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005203#endif
5204
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005205 /* IPv4 [gs]etsockopt options */
5206#ifdef IP_OPTIONS
5207 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005208#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005209#ifdef IP_HDRINCL
5210 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005211#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005212#ifdef IP_TOS
5213 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005214#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005215#ifdef IP_TTL
5216 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005217#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005218#ifdef IP_RECVOPTS
5219 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005220#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005221#ifdef IP_RECVRETOPTS
5222 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005223#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005224#ifdef IP_RECVDSTADDR
5225 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005226#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005227#ifdef IP_RETOPTS
5228 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005229#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005230#ifdef IP_MULTICAST_IF
5231 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005232#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005233#ifdef IP_MULTICAST_TTL
5234 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005235#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005236#ifdef IP_MULTICAST_LOOP
5237 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005238#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005239#ifdef IP_ADD_MEMBERSHIP
5240 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005241#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005242#ifdef IP_DROP_MEMBERSHIP
5243 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005244#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005245#ifdef IP_DEFAULT_MULTICAST_TTL
5246 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5247 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005248#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005249#ifdef IP_DEFAULT_MULTICAST_LOOP
5250 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5251 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005252#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005253#ifdef IP_MAX_MEMBERSHIPS
5254 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005255#endif
5256
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005257 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5258#ifdef IPV6_JOIN_GROUP
5259 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005260#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005261#ifdef IPV6_LEAVE_GROUP
5262 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005263#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005264#ifdef IPV6_MULTICAST_HOPS
5265 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005266#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005267#ifdef IPV6_MULTICAST_IF
5268 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005269#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005270#ifdef IPV6_MULTICAST_LOOP
5271 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005272#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005273#ifdef IPV6_UNICAST_HOPS
5274 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005275#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005276 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005277#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005278 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005279#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005280 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005281#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005282 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005283#endif
5284#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005285 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005286#endif
5287#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005288 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005289#endif
5290#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005291 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005292#endif
5293#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005294 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005295#endif
5296#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005297 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005298#endif
5299#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005300 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005301#endif
5302#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005303 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005304#endif
5305#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005306 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005307#endif
5308#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005309 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005310#endif
5311#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005312 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005313#endif
5314#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005315 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005316#endif
5317#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005318 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005319#endif
5320#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005321 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005322#endif
5323#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005324 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005325#endif
5326#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005327 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005328#endif
5329#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005330 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005331#endif
5332#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005333 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005334#endif
5335#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005336 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005337#endif
5338#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005339 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005340#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005341
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005342 /* TCP options */
5343#ifdef TCP_NODELAY
5344 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005345#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005346#ifdef TCP_MAXSEG
5347 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005348#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005349#ifdef TCP_CORK
5350 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005351#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005352#ifdef TCP_KEEPIDLE
5353 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005354#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005355#ifdef TCP_KEEPINTVL
5356 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005357#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005358#ifdef TCP_KEEPCNT
5359 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005360#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005361#ifdef TCP_SYNCNT
5362 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005363#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005364#ifdef TCP_LINGER2
5365 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005366#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005367#ifdef TCP_DEFER_ACCEPT
5368 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005369#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005370#ifdef TCP_WINDOW_CLAMP
5371 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005372#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005373#ifdef TCP_INFO
5374 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005375#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005376#ifdef TCP_QUICKACK
5377 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005378#endif
5379
Guido van Rossum09be4091999-08-09 14:40:40 +00005380
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005381 /* IPX options */
5382#ifdef IPX_TYPE
5383 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005384#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005385
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005386 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005387#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005388 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005389#endif
5390#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005391 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005392#endif
5393#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005394 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005395#endif
5396#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005397 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005398#endif
5399#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005400 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005401#endif
5402#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005403 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005404#endif
5405#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005406 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005407#endif
5408#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005409 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005410#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005411#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005412 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005413#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005414#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005415 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005416#endif
5417#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005418 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419#endif
5420#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005421 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005422#endif
5423#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005424 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005425#endif
5426#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005427 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428#endif
5429#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005430 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431#endif
5432#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005433 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005434#endif
5435#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005436 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437#endif
5438#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005439 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005441#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005442 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005443#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005444#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005445 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005446#endif
5447#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005448 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
5450#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005451 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452#endif
5453#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005454 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005455#endif
5456#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005457 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458#endif
5459#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005460 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005461#endif
5462#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005463 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005464#endif
5465#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005466 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005467#endif
5468#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005469 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005470#endif
5471#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005472 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005473#endif
5474#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005475 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005476#endif
5477#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005478 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005479#endif
5480#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005481 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482#endif
5483
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005484 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005485#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005486 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005487#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005488 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005489#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005490 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005491#endif
5492#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005493 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005494#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005495 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005496#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005497 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005498#endif
5499#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005500 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005501#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005502 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005503#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005504 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005505#endif
5506
Christian Heimes04ae9162008-01-04 15:23:30 +00005507#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005508 {
5509 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5510 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5511 int i;
5512 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5513 PyObject *tmp;
5514 tmp = PyLong_FromUnsignedLong(codes[i]);
5515 if (tmp == NULL)
5516 return;
5517 PyModule_AddObject(m, names[i], tmp);
5518 }
5519 }
5520 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5521 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5522 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005523#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005524 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005525#endif
5526#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005527 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005528#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005529#endif /* _MSTCPIP_ */
5530
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005531 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005532#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005533 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005534#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005535}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005537
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005538#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005539#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005540
5541/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005542/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005543
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005544int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005545inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005546{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005547 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005548#if (SIZEOF_INT != 4)
5549#error "Not sure if in_addr_t exists and int is not 32-bits."
5550#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005551 unsigned int packed_addr;
5552 packed_addr = inet_addr(src);
5553 if (packed_addr == INADDR_NONE)
5554 return 0;
5555 memcpy(dst, &packed_addr, 4);
5556 return 1;
5557 }
5558 /* Should set errno to EAFNOSUPPORT */
5559 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005560}
5561
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005562const char *
5563inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005564{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005565 if (af == AF_INET) {
5566 struct in_addr packed_addr;
5567 if (size < 16)
5568 /* Should set errno to ENOSPC. */
5569 return NULL;
5570 memcpy(&packed_addr, src, sizeof(packed_addr));
5571 return strncpy(dst, inet_ntoa(packed_addr), size);
5572 }
5573 /* Should set errno to EAFNOSUPPORT */
5574 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005575}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005576
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005577#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005578#endif