blob: 75e07c1dc894375573ca04d8645e8bb64ff58edd [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 Panterca56dd42016-09-17 07:54:55 +00001640
Martin v. Löwis11017b12006-01-14 18:12:57 +00001641#if defined(AF_NETLINK)
Martin Panterca56dd42016-09-17 07:54:55 +00001642 case AF_NETLINK:
1643 {
1644 *len_ret = sizeof (struct sockaddr_nl);
1645 return 1;
1646 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001647#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 case AF_INET:
1650 {
1651 *len_ret = sizeof (struct sockaddr_in);
1652 return 1;
1653 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001654
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001655#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001656 case AF_INET6:
1657 {
1658 *len_ret = sizeof (struct sockaddr_in6);
1659 return 1;
1660 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001661#endif
1662
Hye-Shik Chang81268602004-02-02 06:05:24 +00001663#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001664 case AF_BLUETOOTH:
1665 {
1666 switch(s->sock_proto)
1667 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001668
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001669 case BTPROTO_L2CAP:
1670 *len_ret = sizeof (struct sockaddr_l2);
1671 return 1;
1672 case BTPROTO_RFCOMM:
1673 *len_ret = sizeof (struct sockaddr_rc);
1674 return 1;
1675 case BTPROTO_HCI:
1676 *len_ret = sizeof (struct sockaddr_hci);
1677 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001678#if !defined(__FreeBSD__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001679 case BTPROTO_SCO:
1680 *len_ret = sizeof (struct sockaddr_sco);
1681 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001682#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001683 default:
1684 PyErr_SetString(socket_error, "getsockaddrlen: "
1685 "unknown BT protocol");
1686 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001687
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001688 }
1689 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001690#endif
1691
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001692#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001693 case AF_PACKET:
1694 {
1695 *len_ret = sizeof (struct sockaddr_ll);
1696 return 1;
1697 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001698#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001699
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001700#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001701 case AF_TIPC:
1702 {
1703 *len_ret = sizeof (struct sockaddr_tipc);
1704 return 1;
1705 }
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001706#endif
1707
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001708 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001709
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001710 default:
1711 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1712 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001713
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001715}
1716
1717
Guido van Rossum30a685f1991-06-27 15:51:29 +00001718/* s.accept() method */
1719
Guido van Rossum73624e91994-10-10 17:59:00 +00001720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001721sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001722{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001723 sock_addr_t addrbuf;
1724 SOCKET_T newfd;
1725 socklen_t addrlen;
1726 PyObject *sock = NULL;
1727 PyObject *addr = NULL;
1728 PyObject *res = NULL;
1729 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001731 if (!getsockaddrlen(s, &addrlen))
1732 return NULL;
1733 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001735 newfd = INVALID_SOCKET;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001736
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001737 if (!IS_SELECTABLE(s))
1738 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001739
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001740 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001741 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001742 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001743 if (!timeout)
1744 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1745 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001747 if (timeout == 1) {
1748 PyErr_SetString(socket_timeout, "timed out");
1749 return NULL;
1750 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07001751 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001753 if (newfd == INVALID_SOCKET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001754 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001755
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 /* Create the new object with unspecified family,
1757 to avoid calls to bind() etc. on it. */
1758 sock = (PyObject *) new_sockobject(newfd,
1759 s->sock_family,
1760 s->sock_type,
1761 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001762
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001763 if (sock == NULL) {
1764 SOCKETCLOSE(newfd);
1765 goto finally;
1766 }
1767 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1768 addrlen, s->sock_proto);
1769 if (addr == NULL)
1770 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00001771
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001772 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001773
Guido van Rossum67f7a382002-06-06 21:08:16 +00001774finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001775 Py_XDECREF(sock);
1776 Py_XDECREF(addr);
1777 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001778}
1779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781"accept() -> (socket object, address info)\n\
1782\n\
1783Wait for an incoming connection. Return a new socket representing the\n\
1784connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001785info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786
Guido van Rossum11ba0942002-06-13 15:07:44 +00001787/* s.setblocking(flag) method. Argument:
1788 False -- non-blocking mode; same as settimeout(0)
1789 True -- blocking mode; same as settimeout(None)
1790*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001791
Guido van Rossum73624e91994-10-10 17:59:00 +00001792static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001793sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001794{
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02001795 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001796
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797 block = PyInt_AsLong(arg);
1798 if (block == -1 && PyErr_Occurred())
1799 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001800
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001801 s->sock_timeout = block ? -1.0 : 0.0;
1802 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001803
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001804 Py_INCREF(Py_None);
1805 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001806}
Guido van Rossume4485b01994-09-07 14:32:49 +00001807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001809"setblocking(flag)\n\
1810\n\
1811Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001812setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001813setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001814
Guido van Rossum11ba0942002-06-13 15:07:44 +00001815/* s.settimeout(timeout) method. Argument:
1816 None -- no timeout, blocking mode; same as setblocking(True)
1817 0.0 -- non-blocking mode; same as setblocking(False)
1818 > 0 -- timeout mode; operations time out after timeout seconds
1819 < 0 -- illegal; raises an exception
1820*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001821static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001822sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001823{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001824 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001825
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 if (arg == Py_None)
1827 timeout = -1.0;
1828 else {
1829 timeout = PyFloat_AsDouble(arg);
1830 if (timeout < 0.0) {
1831 if (!PyErr_Occurred())
1832 PyErr_SetString(PyExc_ValueError,
1833 "Timeout value out of range");
1834 return NULL;
1835 }
1836 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001837
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001838 s->sock_timeout = timeout;
1839 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001840
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001841 Py_INCREF(Py_None);
1842 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001843}
1844
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001845PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001846"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001847\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001848Set a timeout on socket operations. 'timeout' can be a float,\n\
1849giving in seconds, or None. Setting a timeout of None disables\n\
1850the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001851Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001852
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001853/* s.gettimeout() method.
1854 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001855static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001856sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001857{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001858 if (s->sock_timeout < 0.0) {
1859 Py_INCREF(Py_None);
1860 return Py_None;
1861 }
1862 else
1863 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001864}
1865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001866PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001867"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001868\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03001869Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001870operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001872
Guido van Rossum48a680c2001-03-02 06:34:14 +00001873#ifdef RISCOS
1874/* s.sleeptaskw(1 | 0) method */
1875
1876static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001877sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001878{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001879 int block;
1880 block = PyInt_AsLong(arg);
1881 if (block == -1 && PyErr_Occurred())
1882 return NULL;
1883 Py_BEGIN_ALLOW_THREADS
1884 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1885 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001886
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001887 Py_INCREF(Py_None);
1888 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001889}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001890PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001891"sleeptaskw(flag)\n\
1892\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001893Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001894#endif
1895
1896
Guido van Rossumaee08791992-09-08 09:05:33 +00001897/* s.setsockopt() method.
1898 With an integer third argument, sets an integer option.
1899 With a string third argument, sets an option from a buffer;
1900 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001901
Guido van Rossum73624e91994-10-10 17:59:00 +00001902static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001903sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001904{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001905 int level;
1906 int optname;
1907 int res;
1908 char *buf;
1909 int buflen;
1910 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001911
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001912 if (PyArg_ParseTuple(args, "iii:setsockopt",
1913 &level, &optname, &flag)) {
1914 buf = (char *) &flag;
1915 buflen = sizeof flag;
1916 }
1917 else {
1918 PyErr_Clear();
1919 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1920 &level, &optname, &buf, &buflen))
1921 return NULL;
1922 }
1923 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1924 if (res < 0)
1925 return s->errorhandler();
1926 Py_INCREF(Py_None);
1927 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001928}
1929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001930PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001931"setsockopt(level, option, value)\n\
1932\n\
1933Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001934The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001935
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001936
Guido van Rossumaee08791992-09-08 09:05:33 +00001937/* s.getsockopt() method.
1938 With two arguments, retrieves an integer option.
1939 With a third integer argument, retrieves a string buffer of that size;
1940 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001941
Guido van Rossum73624e91994-10-10 17:59:00 +00001942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001943sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001944{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001945 int level;
1946 int optname;
1947 int res;
1948 PyObject *buf;
1949 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001950
Guido van Rossumbcc20741998-08-04 22:53:56 +00001951#ifdef __BEOS__
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001952 /* We have incomplete socket support. */
1953 PyErr_SetString(socket_error, "getsockopt not supported");
1954 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001955#else
1956
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001957 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1958 &level, &optname, &buflen))
1959 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001960
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001961 if (buflen == 0) {
1962 int flag = 0;
1963 socklen_t flagsize = sizeof flag;
1964 res = getsockopt(s->sock_fd, level, optname,
1965 (void *)&flag, &flagsize);
1966 if (res < 0)
1967 return s->errorhandler();
1968 return PyInt_FromLong(flag);
1969 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001970#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001971 /* socklen_t is unsigned so no negative test is needed,
1972 test buflen == 0 is previously done */
1973 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001974#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001975 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001976#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001977 PyErr_SetString(socket_error,
1978 "getsockopt buflen out of range");
1979 return NULL;
1980 }
1981 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1982 if (buf == NULL)
1983 return NULL;
1984 res = getsockopt(s->sock_fd, level, optname,
1985 (void *)PyString_AS_STRING(buf), &buflen);
1986 if (res < 0) {
1987 Py_DECREF(buf);
1988 return s->errorhandler();
1989 }
1990 _PyString_Resize(&buf, buflen);
1991 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001992#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001993}
1994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001995PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001996"getsockopt(level, option[, buffersize]) -> value\n\
1997\n\
1998Get a socket option. See the Unix manual for level and option.\n\
1999If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002000string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002001
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002002
Fred Drake728819a2000-07-01 03:40:12 +00002003/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002004
Guido van Rossum73624e91994-10-10 17:59:00 +00002005static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002006sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002007{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002008 sock_addr_t addrbuf;
2009 int addrlen;
2010 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002011
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002012 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2013 return NULL;
2014 Py_BEGIN_ALLOW_THREADS
2015 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2016 Py_END_ALLOW_THREADS
2017 if (res < 0)
2018 return s->errorhandler();
2019 Py_INCREF(Py_None);
2020 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002021}
2022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002023PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002024"bind(address)\n\
2025\n\
2026Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002027pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002028sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002029
Guido van Rossum30a685f1991-06-27 15:51:29 +00002030
2031/* s.close() method.
2032 Set the file descriptor to -1 so operations tried subsequently
2033 will surely fail. */
2034
Guido van Rossum73624e91994-10-10 17:59:00 +00002035static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002036sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002037{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002038 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002040 if ((fd = s->sock_fd) != -1) {
2041 s->sock_fd = -1;
2042 Py_BEGIN_ALLOW_THREADS
2043 (void) SOCKETCLOSE(fd);
2044 Py_END_ALLOW_THREADS
2045 }
2046 Py_INCREF(Py_None);
2047 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002048}
2049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002050PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002051"close()\n\
2052\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002053Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002054
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002055static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002056internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002057 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002058{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002059 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002060
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002061 timeout = 0;
2062 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002063
2064#ifdef MS_WINDOWS
2065
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002066 if (s->sock_timeout > 0.0) {
2067 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2068 IS_SELECTABLE(s)) {
2069 /* This is a mess. Best solution: trust select */
2070 fd_set fds;
2071 fd_set fds_exc;
2072 struct timeval tv;
2073 tv.tv_sec = (int)s->sock_timeout;
2074 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2075 FD_ZERO(&fds);
2076 FD_SET(s->sock_fd, &fds);
2077 FD_ZERO(&fds_exc);
2078 FD_SET(s->sock_fd, &fds_exc);
2079 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2080 if (res == 0) {
2081 res = WSAEWOULDBLOCK;
2082 timeout = 1;
2083 } else if (res > 0) {
2084 if (FD_ISSET(s->sock_fd, &fds))
2085 /* The socket is in the writeable set - this
2086 means connected */
2087 res = 0;
2088 else {
2089 /* As per MS docs, we need to call getsockopt()
2090 to get the underlying error */
2091 int res_size = sizeof res;
2092 /* It must be in the exception set */
2093 assert(FD_ISSET(s->sock_fd, &fds_exc));
2094 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2095 (char *)&res, &res_size))
2096 /* getsockopt also clears WSAGetLastError,
2097 so reset it back. */
2098 WSASetLastError(res);
2099 else
2100 res = WSAGetLastError();
2101 }
2102 }
2103 /* else if (res < 0) an error occurred */
2104 }
2105 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002106
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002107 if (res < 0)
2108 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002109
2110#else
2111
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002112 if (s->sock_timeout > 0.0) {
2113 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2114 timeout = internal_select(s, 1);
2115 if (timeout == 0) {
2116 /* Bug #1019808: in case of an EINPROGRESS,
2117 use getsockopt(SO_ERROR) to get the real
2118 error. */
2119 socklen_t res_size = sizeof res;
2120 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2121 SO_ERROR, &res, &res_size);
2122 if (res == EISCONN)
2123 res = 0;
2124 errno = res;
2125 }
2126 else if (timeout == -1) {
2127 res = errno; /* had error */
2128 }
2129 else
2130 res = EWOULDBLOCK; /* timed out */
2131 }
2132 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002133
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002134 if (res < 0)
2135 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002136
2137#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002138 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002139
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002140 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002141}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002142
Fred Drake728819a2000-07-01 03:40:12 +00002143/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144
Guido van Rossum73624e91994-10-10 17:59:00 +00002145static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002146sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002147{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002148 sock_addr_t addrbuf;
2149 int addrlen;
2150 int res;
2151 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002152
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002153 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2154 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002155
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002156 Py_BEGIN_ALLOW_THREADS
2157 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2158 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002159
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002160 if (timeout == 1) {
2161 PyErr_SetString(socket_timeout, "timed out");
2162 return NULL;
2163 }
2164 if (res != 0)
2165 return s->errorhandler();
2166 Py_INCREF(Py_None);
2167 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002168}
2169
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002170PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002171"connect(address)\n\
2172\n\
2173Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002174is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002175
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176
Fred Drake728819a2000-07-01 03:40:12 +00002177/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002178
2179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002180sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002181{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002182 sock_addr_t addrbuf;
2183 int addrlen;
2184 int res;
2185 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002186
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002187 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2188 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002189
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002190 Py_BEGIN_ALLOW_THREADS
2191 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2192 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002193
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002194 /* Signals are not errors (though they may raise exceptions). Adapted
2195 from PyErr_SetFromErrnoWithFilenameObject(). */
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002196#ifdef EINTR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002197 if (res == EINTR && PyErr_CheckSignals())
2198 return NULL;
Neal Norwitz9b0ca792006-08-02 06:46:21 +00002199#endif
2200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002201 return PyInt_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002202}
2203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002204PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002205"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002206\n\
2207This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002208instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002209
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002210
Guido van Rossumed233a51992-06-23 09:07:03 +00002211/* s.fileno() method */
2212
Guido van Rossum73624e91994-10-10 17:59:00 +00002213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002214sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002215{
Fred Drakea04eaad2000-06-30 02:46:07 +00002216#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002217 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002218#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002219 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00002220#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00002221}
2222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002223PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002224"fileno() -> integer\n\
2225\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227
Guido van Rossumed233a51992-06-23 09:07:03 +00002228
Guido van Rossumbe32c891996-06-20 16:25:29 +00002229#ifndef NO_DUP
2230/* s.dup() method */
2231
2232static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002233sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002234{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002235 SOCKET_T newfd;
2236 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002237
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002238 newfd = dup(s->sock_fd);
2239 if (newfd < 0)
2240 return s->errorhandler();
2241 sock = (PyObject *) new_sockobject(newfd,
2242 s->sock_family,
2243 s->sock_type,
2244 s->sock_proto);
2245 if (sock == NULL)
2246 SOCKETCLOSE(newfd);
2247 return sock;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002248}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002249
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002250PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002251"dup() -> socket object\n\
2252\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002253Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002254
Guido van Rossumbe32c891996-06-20 16:25:29 +00002255#endif
2256
2257
Guido van Rossumc89705d1992-11-26 08:54:07 +00002258/* s.getsockname() method */
2259
Guido van Rossum73624e91994-10-10 17:59:00 +00002260static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002261sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002262{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002263 sock_addr_t addrbuf;
2264 int res;
2265 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002266
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002267 if (!getsockaddrlen(s, &addrlen))
2268 return NULL;
2269 memset(&addrbuf, 0, addrlen);
2270 Py_BEGIN_ALLOW_THREADS
2271 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2272 Py_END_ALLOW_THREADS
2273 if (res < 0)
2274 return s->errorhandler();
2275 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2276 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002277}
2278
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002279PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002280"getsockname() -> address info\n\
2281\n\
2282Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002283info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002284
Guido van Rossumc89705d1992-11-26 08:54:07 +00002285
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002286#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002287/* s.getpeername() method */
2288
Guido van Rossum73624e91994-10-10 17:59:00 +00002289static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002290sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002291{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002292 sock_addr_t addrbuf;
2293 int res;
2294 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002295
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002296 if (!getsockaddrlen(s, &addrlen))
2297 return NULL;
2298 memset(&addrbuf, 0, addrlen);
2299 Py_BEGIN_ALLOW_THREADS
2300 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2301 Py_END_ALLOW_THREADS
2302 if (res < 0)
2303 return s->errorhandler();
2304 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2305 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002306}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002307
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002308PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002309"getpeername() -> address info\n\
2310\n\
2311Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002312info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313
Guido van Rossumb6775db1994-08-01 11:34:53 +00002314#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002315
2316
Guido van Rossum30a685f1991-06-27 15:51:29 +00002317/* s.listen(n) method */
2318
Guido van Rossum73624e91994-10-10 17:59:00 +00002319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002320sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002321{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002322 int backlog;
2323 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002324
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002325 backlog = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002326 if (backlog == -1 && PyErr_Occurred())
2327 return NULL;
2328 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002329 /* To avoid problems on systems that don't allow a negative backlog
2330 * (which doesn't make sense anyway) we force a minimum value of 0. */
2331 if (backlog < 0)
2332 backlog = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002333 res = listen(s->sock_fd, backlog);
2334 Py_END_ALLOW_THREADS
2335 if (res < 0)
2336 return s->errorhandler();
2337 Py_INCREF(Py_None);
2338 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002339}
2340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002341PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342"listen(backlog)\n\
2343\n\
2344Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +02002345least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2346unaccepted connections that the system will allow before refusing new\n\
2347connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002348
2349
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002350#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002351/* s.makefile(mode) method.
2352 Create a new open file object referring to a dupped version of
2353 the socket's file descriptor. (The dup() call is necessary so
2354 that the open file and socket objects may be closed independent
2355 of each other.)
2356 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2357
Guido van Rossum73624e91994-10-10 17:59:00 +00002358static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002360{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002361 extern int fclose(FILE *);
2362 char *mode = "r";
2363 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002364#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002365 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002366#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002367 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002369 FILE *fp;
2370 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002371#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002372 char *mode_r = "r";
2373 char *mode_w = "w";
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002374#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002375
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002376 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2377 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002378#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002379 if (strcmp(mode,"rb") == 0) {
2380 mode = mode_r;
2381 }
2382 else {
2383 if (strcmp(mode,"wb") == 0) {
2384 mode = mode_w;
2385 }
2386 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002387#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002388#ifdef MS_WIN32
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002389 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2390 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002391#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002392 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002393#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002394 {
2395 if (fd >= 0)
2396 SOCKETCLOSE(fd);
2397 return s->errorhandler();
2398 }
2399 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2400 if (f != NULL)
2401 PyFile_SetBufSize(f, bufsize);
2402 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002403}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002405PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002406"makefile([mode[, buffersize]]) -> file object\n\
2407\n\
2408Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002409The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002410
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002411#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002412
Martin Blais2856e5f2006-05-26 12:03:27 +00002413/*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002414 * This is the guts of the recv() and recv_into() methods, which reads into a
Andrew M. Kuchling8d0baae2006-12-19 14:29:04 +00002415 * char buffer. If you have any inc/dec ref to do to the objects that contain
Martin Blais2856e5f2006-05-26 12:03:27 +00002416 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melottic2077b02011-03-16 12:34:31 +02002417 * successfully read. If there was an error, it returns -1. Note that it is
Martin Blais2856e5f2006-05-26 12:03:27 +00002418 * also possible that we return a number of bytes smaller than the request
2419 * bytes.
2420 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002421static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002422sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2423{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002424 ssize_t outlen = -1;
2425 int timeout;
Martin Blais2856e5f2006-05-26 12:03:27 +00002426#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002427 int remaining;
2428 char *read_buf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002429#endif
2430
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002431 if (!IS_SELECTABLE(s)) {
2432 select_error();
2433 return -1;
2434 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002435
2436#ifndef __VMS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002437 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002438 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002439 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002440 if (!timeout)
2441 outlen = recv(s->sock_fd, cbuf, len, flags);
2442 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002443
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002444 if (timeout == 1) {
2445 PyErr_SetString(socket_timeout, "timed out");
2446 return -1;
2447 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002448 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002449 if (outlen < 0) {
2450 /* Note: the call to errorhandler() ALWAYS indirectly returned
2451 NULL, so ignore its return value */
2452 s->errorhandler();
2453 return -1;
2454 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002455#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002456 read_buf = cbuf;
2457 remaining = len;
2458 while (remaining != 0) {
2459 unsigned int segment;
2460 int nread = -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002461
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002462 segment = remaining /SEGMENT_SIZE;
2463 if (segment != 0) {
2464 segment = SEGMENT_SIZE;
2465 }
2466 else {
2467 segment = remaining;
2468 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002469
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002470 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002471 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002472 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002473 if (!timeout)
2474 nread = recv(s->sock_fd, read_buf, segment, flags);
2475 Py_END_ALLOW_THREADS
Martin Blais2856e5f2006-05-26 12:03:27 +00002476
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002477 if (timeout == 1) {
2478 PyErr_SetString(socket_timeout, "timed out");
2479 return -1;
2480 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002481 END_SELECT_LOOP(s)
2482
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002483 if (nread < 0) {
2484 s->errorhandler();
2485 return -1;
2486 }
2487 if (nread != remaining) {
2488 read_buf += nread;
2489 break;
2490 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002491
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002492 remaining -= segment;
2493 read_buf += segment;
2494 }
2495 outlen = read_buf - cbuf;
Martin Blais2856e5f2006-05-26 12:03:27 +00002496#endif /* !__VMS */
2497
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002498 return outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002499}
2500
Guido van Rossum48a680c2001-03-02 06:34:14 +00002501
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002502/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002503
Guido van Rossum73624e91994-10-10 17:59:00 +00002504static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002505sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002506{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002507 int recvlen, flags = 0;
2508 ssize_t outlen;
2509 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002511 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2512 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002514 if (recvlen < 0) {
2515 PyErr_SetString(PyExc_ValueError,
2516 "negative buffersize in recv");
2517 return NULL;
2518 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002519
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002520 /* Allocate a new string. */
2521 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2522 if (buf == NULL)
2523 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002524
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002525 /* Call the guts */
2526 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2527 if (outlen < 0) {
2528 /* An error occurred, release the string and return an
2529 error. */
2530 Py_DECREF(buf);
2531 return NULL;
2532 }
2533 if (outlen != recvlen) {
2534 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002535 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002536 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002537 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002538 return NULL;
2539 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002540
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002542}
2543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545"recv(buffersize[, flags]) -> data\n\
2546\n\
2547Receive up to buffersize bytes from the socket. For the optional flags\n\
2548argument, see the Unix manual. When no data is available, block until\n\
2549at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002550the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002551
Guido van Rossum30a685f1991-06-27 15:51:29 +00002552
Martin Blaisaf2ae722006-06-04 13:49:49 +00002553/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002554
Martin Blais2856e5f2006-05-26 12:03:27 +00002555static PyObject*
Martin Blaisaf2ae722006-06-04 13:49:49 +00002556sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002557{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002558 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002559
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002560 int recvlen = 0, flags = 0;
2561 ssize_t readlen;
2562 Py_buffer buf;
2563 Py_ssize_t buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002564
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002565 /* Get the buffer's memory */
2566 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2567 &buf, &recvlen, &flags))
2568 return NULL;
2569 buflen = buf.len;
2570 assert(buf.buf != 0 && buflen > 0);
Martin Blais2856e5f2006-05-26 12:03:27 +00002571
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002572 if (recvlen < 0) {
2573 PyErr_SetString(PyExc_ValueError,
2574 "negative buffersize in recv_into");
2575 goto error;
2576 }
2577 if (recvlen == 0) {
2578 /* If nbytes was not specified, use the buffer's length */
2579 recvlen = buflen;
2580 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002582 /* Check if the buffer is large enough */
2583 if (buflen < recvlen) {
2584 PyErr_SetString(PyExc_ValueError,
2585 "buffer too small for requested bytes");
2586 goto error;
2587 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002588
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002589 /* Call the guts */
2590 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2591 if (readlen < 0) {
2592 /* Return an error. */
2593 goto error;
2594 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002595
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002596 PyBuffer_Release(&buf);
2597 /* Return the number of bytes read. Note that we do not do anything
2598 special here in the case that readlen < recvlen. */
2599 return PyInt_FromSsize_t(readlen);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002600
2601error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 PyBuffer_Release(&buf);
2603 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002604}
2605
Martin Blaisaf2ae722006-06-04 13:49:49 +00002606PyDoc_STRVAR(recv_into_doc,
2607"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002608\n\
2609A version of recv() that stores its data into a buffer rather than creating \n\
2610a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2611is not specified (or 0), receive up to the size available in the given buffer.\n\
2612\n\
2613See recv() for documentation about the flags.");
2614
2615
2616/*
Guido van Rossum3c887b22007-12-18 20:10:42 +00002617 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2618 * into a char buffer. If you have any inc/def ref to do to the objects that
2619 * contain the buffer, do it in the caller. This function returns the number
Ezio Melottic2077b02011-03-16 12:34:31 +02002620 * of bytes successfully read. If there was an error, it returns -1. Note
Guido van Rossum3c887b22007-12-18 20:10:42 +00002621 * that it is also possible that we return a number of bytes smaller than the
2622 * request bytes.
Martin Blais2856e5f2006-05-26 12:03:27 +00002623 *
2624 * 'addr' is a return value for the address object. Note that you must decref
2625 * it yourself.
2626 */
Martin Blaisaf2ae722006-06-04 13:49:49 +00002627static ssize_t
Martin Blais2856e5f2006-05-26 12:03:27 +00002628sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002629 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002630{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002631 sock_addr_t addrbuf;
2632 int timeout;
2633 ssize_t n = -1;
2634 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002636 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002638 if (!getsockaddrlen(s, &addrlen))
2639 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002641 if (!IS_SELECTABLE(s)) {
2642 select_error();
2643 return -1;
2644 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002645
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002646 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002647 Py_BEGIN_ALLOW_THREADS
2648 memset(&addrbuf, 0, addrlen);
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002649 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002650 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002651#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002652#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 n = recvfrom(s->sock_fd, cbuf, len, flags,
2654 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002655#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 n = recvfrom(s->sock_fd, cbuf, len, flags,
2657 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002658#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002659#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002660 n = recvfrom(s->sock_fd, cbuf, len, flags,
2661 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002662#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002663 }
2664 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002666 if (timeout == 1) {
2667 PyErr_SetString(socket_timeout, "timed out");
2668 return -1;
2669 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002670 END_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002671 if (n < 0) {
2672 s->errorhandler();
2673 return -1;
2674 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002675
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002676 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2677 addrlen, s->sock_proto)))
2678 return -1;
Martin Blais2856e5f2006-05-26 12:03:27 +00002679
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002680 return n;
Martin Blais2856e5f2006-05-26 12:03:27 +00002681}
2682
2683/* s.recvfrom(nbytes [,flags]) method */
2684
2685static PyObject *
2686sock_recvfrom(PySocketSockObject *s, PyObject *args)
2687{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002688 PyObject *buf = NULL;
2689 PyObject *addr = NULL;
2690 PyObject *ret = NULL;
2691 int recvlen, flags = 0;
2692 ssize_t outlen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002693
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002694 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2695 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002696
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002697 if (recvlen < 0) {
2698 PyErr_SetString(PyExc_ValueError,
2699 "negative buffersize in recvfrom");
2700 return NULL;
2701 }
Facundo Batista1fe9f962007-03-28 03:45:20 +00002702
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002703 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2704 if (buf == NULL)
2705 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002706
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002707 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2708 recvlen, flags, &addr);
2709 if (outlen < 0) {
2710 goto finally;
2711 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002712
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002713 if (outlen != recvlen) {
2714 /* We did not read as many bytes as we anticipated, resize the
Ezio Melottic2077b02011-03-16 12:34:31 +02002715 string if possible and be successful. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002716 if (_PyString_Resize(&buf, outlen) < 0)
Ezio Melottic2077b02011-03-16 12:34:31 +02002717 /* Oopsy, not so successful after all. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002718 goto finally;
2719 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002720
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002721 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722
2723finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002724 Py_XDECREF(buf);
2725 Py_XDECREF(addr);
2726 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002727}
2728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002729PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002730"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2731\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002732Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002733
Martin Blais2856e5f2006-05-26 12:03:27 +00002734
Martin Blaisaf2ae722006-06-04 13:49:49 +00002735/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Martin Blais2856e5f2006-05-26 12:03:27 +00002736
2737static PyObject *
Martin Blaisaf2ae722006-06-04 13:49:49 +00002738sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Martin Blais2856e5f2006-05-26 12:03:27 +00002739{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002740 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Martin Blais2856e5f2006-05-26 12:03:27 +00002741
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002742 int recvlen = 0, flags = 0;
2743 ssize_t readlen;
2744 Py_buffer buf;
2745 int buflen;
Martin Blais2856e5f2006-05-26 12:03:27 +00002746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002747 PyObject *addr = NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002749 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2750 kwlist, &buf,
2751 &recvlen, &flags))
2752 return NULL;
2753 buflen = buf.len;
Martin Blais2856e5f2006-05-26 12:03:27 +00002754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002755 if (recvlen < 0) {
2756 PyErr_SetString(PyExc_ValueError,
2757 "negative buffersize in recvfrom_into");
2758 goto error;
2759 }
2760 if (recvlen == 0) {
2761 /* If nbytes was not specified, use the buffer's length */
2762 recvlen = buflen;
Benjamin Peterson28cf3682014-01-13 22:59:38 -05002763 } else if (recvlen > buflen) {
2764 PyErr_SetString(PyExc_ValueError,
2765 "nbytes is greater than the length of the buffer");
2766 goto error;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002767 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002768
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002769 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2770 if (readlen < 0) {
2771 /* Return an error */
2772 goto error;
2773 }
Martin Blais2856e5f2006-05-26 12:03:27 +00002774
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002775 PyBuffer_Release(&buf);
2776 /* Return the number of bytes read and the address. Note that we do
2777 not do anything special here in the case that readlen < recvlen. */
2778 return Py_BuildValue("lN", readlen, addr);
Antoine Pitroud7b731d2010-03-17 22:45:39 +00002779
2780error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002781 Py_XDECREF(addr);
2782 PyBuffer_Release(&buf);
2783 return NULL;
Martin Blais2856e5f2006-05-26 12:03:27 +00002784}
2785
Martin Blaisaf2ae722006-06-04 13:49:49 +00002786PyDoc_STRVAR(recvfrom_into_doc,
2787"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Martin Blais2856e5f2006-05-26 12:03:27 +00002788\n\
Martin Blaisaf2ae722006-06-04 13:49:49 +00002789Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Martin Blais2856e5f2006-05-26 12:03:27 +00002790
2791
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002792/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002793
Guido van Rossum73624e91994-10-10 17:59:00 +00002794static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002795sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002796{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002797 char *buf;
2798 int len, n = -1, flags = 0, timeout;
2799 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002800
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002801 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2802 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002803
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002804 if (!IS_SELECTABLE(s)) {
2805 PyBuffer_Release(&pbuf);
2806 return select_error();
2807 }
2808 buf = pbuf.buf;
2809 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002810
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002811 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002812 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002813 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002814 if (!timeout)
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002815#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002816 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002817#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002818 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002819#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002820 Py_END_ALLOW_THREADS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002821 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002822 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002823 PyErr_SetString(socket_timeout, "timed out");
2824 return NULL;
2825 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002826 END_SELECT_LOOP(s)
2827
2828 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002829 if (n < 0)
2830 return s->errorhandler();
2831 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002832}
2833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002835"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002836\n\
2837Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002838argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002839sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002840
2841
2842/* s.sendall(data [,flags]) method */
2843
2844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002845sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002846{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002847 char *buf;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002848 int len, n = -1, flags = 0, timeout, saved_errno;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002849 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002850
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002851 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2852 return NULL;
2853 buf = pbuf.buf;
2854 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002855
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002856 if (!IS_SELECTABLE(s)) {
2857 PyBuffer_Release(&pbuf);
2858 return select_error();
2859 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002860
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002861 do {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002862 BEGIN_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002863 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002864 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002865 n = -1;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002866 if (!timeout) {
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002867#ifdef __VMS
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002868 n = sendsegmented(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002869#else
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002870 n = send(s->sock_fd, buf, len, flags);
Neal Norwitz2a30cd02006-07-10 01:18:57 +00002871#endif
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002872 }
2873 Py_END_ALLOW_THREADS
2874 if (timeout == 1) {
2875 PyBuffer_Release(&pbuf);
2876 PyErr_SetString(socket_timeout, "timed out");
2877 return NULL;
2878 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002879 END_SELECT_LOOP(s)
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002880 /* PyErr_CheckSignals() might change errno */
2881 saved_errno = errno;
2882 /* We must run our signal handlers before looping again.
2883 send() can return a successful partial write when it is
2884 interrupted, so we can't restrict ourselves to EINTR. */
2885 if (PyErr_CheckSignals()) {
2886 PyBuffer_Release(&pbuf);
2887 return NULL;
2888 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002889 if (n < 0) {
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002890 /* If interrupted, try again */
2891 if (saved_errno == EINTR)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002892 continue;
Antoine Pitrou66b5df62010-09-27 18:16:46 +00002893 else
2894 break;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002895 }
2896 buf += n;
2897 len -= n;
2898 } while (len > 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002899 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002900
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002901 if (n < 0)
2902 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002903
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002904 Py_INCREF(Py_None);
2905 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002909"sendall(data[, flags])\n\
2910\n\
2911Send a data string to the socket. For the optional flags\n\
2912argument, see the Unix manual. This calls send() repeatedly\n\
2913until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915
Guido van Rossum30a685f1991-06-27 15:51:29 +00002916
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002917/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002918
Guido van Rossum73624e91994-10-10 17:59:00 +00002919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002920sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002921{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002922 Py_buffer pbuf;
2923 PyObject *addro;
2924 char *buf;
2925 Py_ssize_t len;
2926 sock_addr_t addrbuf;
Victor Stinner31c7e4f2015-04-02 17:19:17 +02002927 int addrlen, flags, timeout;
2928 long n = -1;
Ezio Melotti0639be62011-05-07 19:21:22 +03002929 int arglen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002931 flags = 0;
Ezio Melotti0639be62011-05-07 19:21:22 +03002932 arglen = PyTuple_Size(args);
2933 switch(arglen) {
2934 case 2:
2935 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2936 break;
2937 case 3:
2938 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2939 break;
2940 default:
2941 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2942 " arguments (%d given)", arglen);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 }
Ezio Melotti0639be62011-05-07 19:21:22 +03002944 if (PyErr_Occurred())
2945 return NULL;
2946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002947 buf = pbuf.buf;
2948 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002949
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002950 if (!IS_SELECTABLE(s)) {
2951 PyBuffer_Release(&pbuf);
2952 return select_error();
2953 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002954
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002955 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2956 PyBuffer_Release(&pbuf);
2957 return NULL;
2958 }
Martin v. Löwis046c4d12006-12-03 11:23:45 +00002959
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002960 BEGIN_SELECT_LOOP(s)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002961 Py_BEGIN_ALLOW_THREADS
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002962 timeout = internal_select_ex(s, 1, interval);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002963 if (!timeout)
2964 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2965 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002967 if (timeout == 1) {
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002968 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002969 PyErr_SetString(socket_timeout, "timed out");
2970 return NULL;
2971 }
Kristján Valur Jónsson6ebc8f32013-03-19 10:58:59 -07002972 END_SELECT_LOOP(s)
2973 PyBuffer_Release(&pbuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002974 if (n < 0)
2975 return s->errorhandler();
2976 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002977}
2978
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002979PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002980"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002981\n\
2982Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002983For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002984
Guido van Rossum30a685f1991-06-27 15:51:29 +00002985
2986/* s.shutdown(how) method */
2987
Guido van Rossum73624e91994-10-10 17:59:00 +00002988static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002990{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002991 int how;
2992 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002993
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02002994 how = _PyInt_AsInt(arg);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002995 if (how == -1 && PyErr_Occurred())
2996 return NULL;
2997 Py_BEGIN_ALLOW_THREADS
2998 res = shutdown(s->sock_fd, how);
2999 Py_END_ALLOW_THREADS
3000 if (res < 0)
3001 return s->errorhandler();
3002 Py_INCREF(Py_None);
3003 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003004}
3005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007"shutdown(flag)\n\
3008\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003009Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3010of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003011
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003012#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimes04ae9162008-01-04 15:23:30 +00003013static PyObject*
3014sock_ioctl(PySocketSockObject *s, PyObject *arg)
3015{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003016 unsigned long cmd = SIO_RCVALL;
3017 PyObject *argO;
3018 DWORD recv;
Christian Heimes04ae9162008-01-04 15:23:30 +00003019
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003020 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3021 return NULL;
Christian Heimes04ae9162008-01-04 15:23:30 +00003022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003023 switch (cmd) {
3024 case SIO_RCVALL: {
3025 unsigned int option = RCVALL_ON;
3026 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3027 return NULL;
3028 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3029 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3030 return set_error();
3031 }
3032 return PyLong_FromUnsignedLong(recv); }
3033 case SIO_KEEPALIVE_VALS: {
3034 struct tcp_keepalive ka;
3035 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3036 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3037 return NULL;
3038 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3039 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3040 return set_error();
3041 }
3042 return PyLong_FromUnsignedLong(recv); }
3043 default:
3044 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3045 return NULL;
3046 }
Christian Heimes04ae9162008-01-04 15:23:30 +00003047}
3048PyDoc_STRVAR(sock_ioctl_doc,
3049"ioctl(cmd, option) -> long\n\
3050\n\
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +00003051Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3052SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3053SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Christian Heimes04ae9162008-01-04 15:23:30 +00003054
3055#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003056
3057/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003058
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003059static PyMethodDef sock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003060 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
3061 accept_doc},
3062 {"bind", (PyCFunction)sock_bind, METH_O,
3063 bind_doc},
3064 {"close", (PyCFunction)sock_close, METH_NOARGS,
3065 close_doc},
3066 {"connect", (PyCFunction)sock_connect, METH_O,
3067 connect_doc},
3068 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3069 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003070#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003071 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
3072 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00003073#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003074 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3075 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003076#ifdef HAVE_GETPEERNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003077 {"getpeername", (PyCFunction)sock_getpeername,
3078 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003079#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003080 {"getsockname", (PyCFunction)sock_getsockname,
3081 METH_NOARGS, getsockname_doc},
3082 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3083 getsockopt_doc},
Amaury Forgeot d'Arca4dd2e22008-06-13 00:42:22 +00003084#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003085 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3086 sock_ioctl_doc},
Christian Heimes04ae9162008-01-04 15:23:30 +00003087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003088 {"listen", (PyCFunction)sock_listen, METH_O,
3089 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003090#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003091 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
3092 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003093#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003094 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3095 recv_doc},
3096 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3097 recv_into_doc},
3098 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3099 recvfrom_doc},
3100 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3101 recvfrom_into_doc},
3102 {"send", (PyCFunction)sock_send, METH_VARARGS,
3103 send_doc},
3104 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3105 sendall_doc},
3106 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3107 sendto_doc},
3108 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3109 setblocking_doc},
3110 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3111 settimeout_doc},
3112 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3113 gettimeout_doc},
3114 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3115 setsockopt_doc},
3116 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3117 shutdown_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003118#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003119 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3120 sleeptaskw_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00003121#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003122 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003123};
3124
Georg Brandlbc45a3f2006-03-17 19:17:34 +00003125/* SockObject members */
3126static PyMemberDef sock_memberlist[] = {
3127 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3128 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3129 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3130 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3131 {0},
3132};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003133
Guido van Rossum73624e91994-10-10 17:59:00 +00003134/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003135 First close the file description. */
3136
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003137static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003138sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003139{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003140 if (s->sock_fd != -1)
3141 (void) SOCKETCLOSE(s->sock_fd);
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003142 if (s->weakreflist != NULL)
3143 PyObject_ClearWeakRefs((PyObject *)s);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003144 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003145}
3146
Guido van Rossum30a685f1991-06-27 15:51:29 +00003147
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003149sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003150{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003151 char buf[512];
Victor Stinner0a649c72014-07-26 14:52:55 +02003152 long sock_fd;
3153 /* On Windows, this test is needed because SOCKET_T is unsigned */
3154 if (s->sock_fd == INVALID_SOCKET) {
3155 sock_fd = -1;
3156 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003157#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinner0a649c72014-07-26 14:52:55 +02003158 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003159 /* this can occur on Win64, and actually there is a special
3160 ugly printf formatter for decimal pointer length integer
3161 printing, only bother if necessary*/
3162 PyErr_SetString(PyExc_OverflowError,
3163 "no printf formatter to display "
3164 "the socket descriptor in decimal");
3165 return NULL;
3166 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003167#endif
Victor Stinner0a649c72014-07-26 14:52:55 +02003168 else
3169 sock_fd = (long)s->sock_fd;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003170 PyOS_snprintf(
3171 buf, sizeof(buf),
3172 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Victor Stinner0a649c72014-07-26 14:52:55 +02003173 sock_fd, s->sock_family,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003174 s->sock_type,
3175 s->sock_proto);
3176 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003177}
3178
3179
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003180/* Create a new, uninitialized socket object. */
3181
3182static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003183sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003184{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003185 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003186
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003187 new = type->tp_alloc(type, 0);
3188 if (new != NULL) {
3189 ((PySocketSockObject *)new)->sock_fd = -1;
3190 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3191 ((PySocketSockObject *)new)->errorhandler = &set_error;
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003192 ((PySocketSockObject *)new)->weakreflist = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003193 }
3194 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003195}
3196
3197
3198/* Initialize a new socket object. */
3199
3200/*ARGSUSED*/
3201static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003202sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003203{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003204 PySocketSockObject *s = (PySocketSockObject *)self;
3205 SOCKET_T fd;
3206 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3207 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003208
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003209 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3210 "|iii:socket", keywords,
3211 &family, &type, &proto))
3212 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003213
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003214 Py_BEGIN_ALLOW_THREADS
3215 fd = socket(family, type, proto);
3216 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003217
Victor Stinner465db3c2014-07-26 14:47:56 +02003218 if (fd == INVALID_SOCKET) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003219 set_error();
3220 return -1;
3221 }
3222 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003223
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003224 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003225
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003226}
3227
3228
Guido van Rossumb6775db1994-08-01 11:34:53 +00003229/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003230
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003231static PyTypeObject sock_type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003232 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3233 "_socket.socket", /* tp_name */
3234 sizeof(PySocketSockObject), /* tp_basicsize */
3235 0, /* tp_itemsize */
3236 (destructor)sock_dealloc, /* tp_dealloc */
3237 0, /* tp_print */
3238 0, /* tp_getattr */
3239 0, /* tp_setattr */
3240 0, /* tp_compare */
3241 (reprfunc)sock_repr, /* tp_repr */
3242 0, /* tp_as_number */
3243 0, /* tp_as_sequence */
3244 0, /* tp_as_mapping */
3245 0, /* tp_hash */
3246 0, /* tp_call */
3247 0, /* tp_str */
3248 PyObject_GenericGetAttr, /* tp_getattro */
3249 0, /* tp_setattro */
3250 0, /* tp_as_buffer */
3251 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3252 sock_doc, /* tp_doc */
3253 0, /* tp_traverse */
3254 0, /* tp_clear */
3255 0, /* tp_richcompare */
Benjamin Peterson3d1f2d32014-10-06 14:38:20 -04003256 offsetof(PySocketSockObject, weakreflist), /* tp_weaklistoffset */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003257 0, /* tp_iter */
3258 0, /* tp_iternext */
3259 sock_methods, /* tp_methods */
3260 sock_memberlist, /* tp_members */
3261 0, /* tp_getset */
3262 0, /* tp_base */
3263 0, /* tp_dict */
3264 0, /* tp_descr_get */
3265 0, /* tp_descr_set */
3266 0, /* tp_dictoffset */
3267 sock_initobj, /* tp_init */
3268 PyType_GenericAlloc, /* tp_alloc */
3269 sock_new, /* tp_new */
3270 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003271};
3272
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273
Guido van Rossum81194471991-07-27 21:42:02 +00003274/* Python interface to gethostname(). */
3275
3276/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003277static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00003278socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00003279{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003280 char buf[1024];
3281 int res;
3282 Py_BEGIN_ALLOW_THREADS
3283 res = gethostname(buf, (int) sizeof buf - 1);
3284 Py_END_ALLOW_THREADS
3285 if (res < 0)
3286 return set_error();
3287 buf[sizeof buf - 1] = '\0';
3288 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00003289}
Guido van Rossumff4949e1992-08-05 19:58:53 +00003290
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003291PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003292"gethostname() -> string\n\
3293\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003294Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003295
Guido van Rossumff4949e1992-08-05 19:58:53 +00003296
Guido van Rossum30a685f1991-06-27 15:51:29 +00003297/* Python interface to gethostbyname(name). */
3298
3299/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003301socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003303 char *name;
3304 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003305
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003306 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3307 return NULL;
3308 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3309 return NULL;
3310 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003311}
3312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003313PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003314"gethostbyname(host) -> address\n\
3315\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003316Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003317
3318
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003319/* Convenience function common to gethostbyname_ex and gethostbyaddr */
3320
3321static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003322gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003323{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 char **pch;
3325 PyObject *rtn_tuple = (PyObject *)NULL;
3326 PyObject *name_list = (PyObject *)NULL;
3327 PyObject *addr_list = (PyObject *)NULL;
3328 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003329
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003330 if (h == NULL) {
3331 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003332#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003333 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003334#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003335 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003336#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003337 return NULL;
3338 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003339
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003340 if (h->h_addrtype != af) {
3341 /* Let's get real error message to return */
3342 PyErr_SetString(socket_error,
3343 (char *)strerror(EAFNOSUPPORT));
Brett Cannon10ed0f52008-03-18 15:35:58 +00003344
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003345 return NULL;
3346 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003347
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003348 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003350 case AF_INET:
3351 if (alen < sizeof(struct sockaddr_in))
3352 return NULL;
3353 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003355#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003356 case AF_INET6:
3357 if (alen < sizeof(struct sockaddr_in6))
3358 return NULL;
3359 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003360#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003361
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003364 if ((name_list = PyList_New(0)) == NULL)
3365 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003366
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003367 if ((addr_list = PyList_New(0)) == NULL)
3368 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003369
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003370 /* SF #1511317: h_aliases can be NULL */
3371 if (h->h_aliases) {
3372 for (pch = h->h_aliases; *pch != NULL; pch++) {
3373 int status;
3374 tmp = PyString_FromString(*pch);
3375 if (tmp == NULL)
3376 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003377
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003378 status = PyList_Append(name_list, tmp);
3379 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003380
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003381 if (status)
3382 goto err;
3383 }
3384 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003385
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003386 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3387 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003389 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00003390
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003391 case AF_INET:
3392 {
3393 struct sockaddr_in sin;
3394 memset(&sin, 0, sizeof(sin));
3395 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003396#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003397 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003398#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003399 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3400 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003402 if (pch == h->h_addr_list && alen >= sizeof(sin))
3403 memcpy((char *) addr, &sin, sizeof(sin));
3404 break;
3405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003406
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003407#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003408 case AF_INET6:
3409 {
3410 struct sockaddr_in6 sin6;
3411 memset(&sin6, 0, sizeof(sin6));
3412 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003413#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003414 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003415#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003416 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3417 tmp = makeipaddr((struct sockaddr *)&sin6,
3418 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003420 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3421 memcpy((char *) addr, &sin6, sizeof(sin6));
3422 break;
3423 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003424#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00003425
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003426 default: /* can't happen */
3427 PyErr_SetString(socket_error,
3428 "unsupported address family");
3429 return NULL;
3430 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003431
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003432 if (tmp == NULL)
3433 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003435 status = PyList_Append(addr_list, tmp);
3436 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003437
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003438 if (status)
3439 goto err;
3440 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003441
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003442 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003443
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003444 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003445 Py_XDECREF(name_list);
3446 Py_XDECREF(addr_list);
3447 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003448}
3449
3450
3451/* Python interface to gethostbyname_ex(name). */
3452
3453/*ARGSUSED*/
3454static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003455socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003456{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003457 char *name;
3458 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003459#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003460 struct sockaddr_storage addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003461#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003462 struct sockaddr_in addr;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003463#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003464 struct sockaddr *sa;
3465 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003466#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003467 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003468#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003469 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003470#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003471 char buf[16384];
3472 int buf_len = (sizeof buf) - 1;
3473 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003474#endif
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003475#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003476 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003477#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003478#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003479
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003480 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3481 return NULL;
3482 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3483 return NULL;
3484 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003485#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003486#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003487 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003488 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003489#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003490 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003491#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003492 memset((void *) &data, '\0', sizeof(data));
3493 result = gethostbyname_r(name, &hp_allocated, &data);
3494 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003495#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003496#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003497#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003498 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003499#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003500 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003501#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003502 Py_END_ALLOW_THREADS
3503 /* Some C libraries would require addr.__ss_family instead of
3504 addr.ss_family.
3505 Therefore, we cast the sockaddr_storage into sockaddr to
3506 access sa_family. */
3507 sa = (struct sockaddr*)&addr;
3508 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3509 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003510#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003511 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003512#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003513 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003514}
3515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003516PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003517"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3518\n\
3519Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003521
3522
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003523/* Python interface to gethostbyaddr(IP). */
3524
3525/*ARGSUSED*/
3526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003527socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003528{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003529#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003530 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003531#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003532 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003533#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003534 struct sockaddr *sa = (struct sockaddr *)&addr;
3535 char *ip_num;
3536 struct hostent *h;
3537 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003538#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003539 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003540#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003541 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003542#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003543 /* glibcs up to 2.10 assume that the buf argument to
3544 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3545 does not ensure. The attribute below instructs the compiler
3546 to maintain this alignment. */
3547 char buf[16384] Py_ALIGNED(8);
3548 int buf_len = (sizeof buf) - 1;
3549 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003550#endif
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003551#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003552 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003553#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003554#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003555 char *ap;
3556 int al;
3557 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003558
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003559 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3560 return NULL;
3561 af = AF_UNSPEC;
3562 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3563 return NULL;
3564 af = sa->sa_family;
3565 ap = NULL;
3566 switch (af) {
3567 case AF_INET:
3568 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3569 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3570 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003571#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003572 case AF_INET6:
3573 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3574 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3575 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003576#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003577 default:
3578 PyErr_SetString(socket_error, "unsupported address family");
3579 return NULL;
3580 }
3581 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003582#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003583#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Serhiy Storchaka6a35bf62016-10-08 09:58:08 +03003584 gethostbyaddr_r(ap, al, af,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003585 &hp_allocated, buf, buf_len,
3586 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003587#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003588 h = gethostbyaddr_r(ap, al, af,
3589 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003590#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003591 memset((void *) &data, '\0', sizeof(data));
3592 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3593 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003594#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003595#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003596#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003597 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003598#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003599 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003600#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003601 Py_END_ALLOW_THREADS
3602 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003603#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003604 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003605#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003606 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003607}
3608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003609PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003610"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3611\n\
3612Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003613for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003614
Guido van Rossum30a685f1991-06-27 15:51:29 +00003615
3616/* Python interface to getservbyname(name).
3617 This only returns the port number, since the other info is already
3618 known or not useful (like the list of aliases). */
3619
3620/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003621static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003622socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003623{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003624 char *name, *proto=NULL;
3625 struct servent *sp;
3626 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3627 return NULL;
3628 Py_BEGIN_ALLOW_THREADS
3629 sp = getservbyname(name, proto);
3630 Py_END_ALLOW_THREADS
3631 if (sp == NULL) {
3632 PyErr_SetString(socket_error, "service/proto not found");
3633 return NULL;
3634 }
3635 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003636}
3637
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003638PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003639"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003640\n\
3641Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003642The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3643otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003644
Guido van Rossum30a685f1991-06-27 15:51:29 +00003645
Barry Warsaw11b91a02004-06-28 00:50:43 +00003646/* Python interface to getservbyport(port).
3647 This only returns the service name, since the other info is already
3648 known or not useful (like the list of aliases). */
3649
3650/*ARGSUSED*/
3651static PyObject *
3652socket_getservbyport(PyObject *self, PyObject *args)
3653{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003654 int port;
3655 char *proto=NULL;
3656 struct servent *sp;
3657 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3658 return NULL;
3659 if (port < 0 || port > 0xffff) {
3660 PyErr_SetString(
3661 PyExc_OverflowError,
3662 "getservbyport: port must be 0-65535.");
3663 return NULL;
3664 }
3665 Py_BEGIN_ALLOW_THREADS
3666 sp = getservbyport(htons((short)port), proto);
3667 Py_END_ALLOW_THREADS
3668 if (sp == NULL) {
3669 PyErr_SetString(socket_error, "port/proto not found");
3670 return NULL;
3671 }
3672 return PyString_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003673}
3674
3675PyDoc_STRVAR(getservbyport_doc,
3676"getservbyport(port[, protocolname]) -> string\n\
3677\n\
3678Return the service name from a port number and protocol name.\n\
3679The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3680otherwise any protocol will match.");
3681
Guido van Rossum3901d851996-12-19 16:35:04 +00003682/* Python interface to getprotobyname(name).
3683 This only returns the protocol number, since the other info is
3684 already known or not useful (like the list of aliases). */
3685
3686/*ARGSUSED*/
3687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003688socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003689{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003690 char *name;
3691 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003692#ifdef __BEOS__
3693/* Not available in BeOS yet. - [cjh] */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003694 PyErr_SetString(socket_error, "getprotobyname not supported");
3695 return NULL;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003696#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003697 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3698 return NULL;
3699 Py_BEGIN_ALLOW_THREADS
3700 sp = getprotobyname(name);
3701 Py_END_ALLOW_THREADS
3702 if (sp == NULL) {
3703 PyErr_SetString(socket_error, "protocol not found");
3704 return NULL;
3705 }
3706 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003707#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003708}
3709
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003710PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003711"getprotobyname(name) -> integer\n\
3712\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003713Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003714
Guido van Rossum3901d851996-12-19 16:35:04 +00003715
Dave Cole331708b2004-08-09 04:51:41 +00003716#ifdef HAVE_SOCKETPAIR
3717/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003718 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003719 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003720
3721/*ARGSUSED*/
3722static PyObject *
3723socket_socketpair(PyObject *self, PyObject *args)
3724{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003725 PySocketSockObject *s0 = NULL, *s1 = NULL;
3726 SOCKET_T sv[2];
3727 int family, type = SOCK_STREAM, proto = 0;
3728 PyObject *res = NULL;
Dave Cole331708b2004-08-09 04:51:41 +00003729
3730#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003731 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00003732#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003733 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00003734#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003735 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3736 &family, &type, &proto))
3737 return NULL;
3738 /* Create a pair of socket fds */
3739 if (socketpair(family, type, proto, sv) < 0)
3740 return set_error();
3741 s0 = new_sockobject(sv[0], family, type, proto);
3742 if (s0 == NULL)
3743 goto finally;
3744 s1 = new_sockobject(sv[1], family, type, proto);
3745 if (s1 == NULL)
3746 goto finally;
3747 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00003748
3749finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003750 if (res == NULL) {
3751 if (s0 == NULL)
3752 SOCKETCLOSE(sv[0]);
3753 if (s1 == NULL)
3754 SOCKETCLOSE(sv[1]);
3755 }
3756 Py_XDECREF(s0);
3757 Py_XDECREF(s1);
3758 return res;
Dave Cole331708b2004-08-09 04:51:41 +00003759}
3760
3761PyDoc_STRVAR(socketpair_doc,
3762"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3763\n\
3764Create a pair of socket objects from the sockets returned by the platform\n\
3765socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003766The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003767AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003768
3769#endif /* HAVE_SOCKETPAIR */
3770
3771
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003772#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003773/* Create a socket object from a numeric file description.
3774 Useful e.g. if stdin is a socket.
3775 Additional arguments as for socket(). */
3776
3777/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003778static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003779socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003780{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003781 PySocketSockObject *s;
3782 SOCKET_T fd;
3783 int family, type, proto = 0;
3784 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3785 &fd, &family, &type, &proto))
3786 return NULL;
3787 /* Dup the fd so it and the socket can be closed independently */
3788 fd = dup(fd);
3789 if (fd < 0)
3790 return set_error();
3791 s = new_sockobject(fd, family, type, proto);
3792 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003793}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003795PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003796"fromfd(fd, family, type[, proto]) -> socket object\n\
3797\n\
Georg Brandldcfdae72006-04-01 07:33:08 +00003798Create a socket object from a duplicate of the given\n\
3799file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003800The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003801
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003802#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003803
Guido van Rossum82a5c661998-07-07 20:45:43 +00003804
Guido van Rossum006bf911996-06-12 04:04:55 +00003805static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003806socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003807{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003808 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003809
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003810 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3811 return NULL;
3812 }
3813 if (x1 < 0) {
3814 PyErr_SetString(PyExc_OverflowError,
3815 "can't convert negative number to unsigned long");
3816 return NULL;
3817 }
3818 x2 = (unsigned int)ntohs((unsigned short)x1);
3819 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003820}
3821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003822PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003823"ntohs(integer) -> integer\n\
3824\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003825Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003826
3827
Guido van Rossum006bf911996-06-12 04:04:55 +00003828static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003829socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003830{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003831 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003832
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003833 if (PyInt_Check(arg)) {
3834 x = PyInt_AS_LONG(arg);
3835 if (x == (unsigned long) -1 && PyErr_Occurred())
3836 return NULL;
3837 if ((long)x < 0) {
3838 PyErr_SetString(PyExc_OverflowError,
3839 "can't convert negative number to unsigned long");
3840 return NULL;
3841 }
3842 }
3843 else if (PyLong_Check(arg)) {
3844 x = PyLong_AsUnsignedLong(arg);
3845 if (x == (unsigned long) -1 && PyErr_Occurred())
3846 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003847#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003848 {
3849 unsigned long y;
3850 /* only want the trailing 32 bits */
3851 y = x & 0xFFFFFFFFUL;
3852 if (y ^ x)
3853 return PyErr_Format(PyExc_OverflowError,
3854 "long int larger than 32 bits");
3855 x = y;
3856 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003857#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003858 }
3859 else
3860 return PyErr_Format(PyExc_TypeError,
3861 "expected int/long, %s found",
3862 Py_TYPE(arg)->tp_name);
3863 if (x == (unsigned long) -1 && PyErr_Occurred())
3864 return NULL;
3865 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003866}
3867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003868PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003869"ntohl(integer) -> integer\n\
3870\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003871Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003872
3873
Guido van Rossum006bf911996-06-12 04:04:55 +00003874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003875socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003876{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003877 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003878
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003879 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3880 return NULL;
3881 }
3882 if (x1 < 0) {
3883 PyErr_SetString(PyExc_OverflowError,
3884 "can't convert negative number to unsigned long");
3885 return NULL;
3886 }
3887 x2 = (unsigned int)htons((unsigned short)x1);
3888 return PyInt_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00003889}
3890
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003891PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003892"htons(integer) -> integer\n\
3893\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003894Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003895
3896
Guido van Rossum006bf911996-06-12 04:04:55 +00003897static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003898socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003899{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003900 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003901
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003902 if (PyInt_Check(arg)) {
3903 x = PyInt_AS_LONG(arg);
3904 if (x == (unsigned long) -1 && PyErr_Occurred())
3905 return NULL;
3906 if ((long)x < 0) {
3907 PyErr_SetString(PyExc_OverflowError,
3908 "can't convert negative number to unsigned long");
3909 return NULL;
3910 }
3911 }
3912 else if (PyLong_Check(arg)) {
3913 x = PyLong_AsUnsignedLong(arg);
3914 if (x == (unsigned long) -1 && PyErr_Occurred())
3915 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003916#if SIZEOF_LONG > 4
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003917 {
3918 unsigned long y;
3919 /* only want the trailing 32 bits */
3920 y = x & 0xFFFFFFFFUL;
3921 if (y ^ x)
3922 return PyErr_Format(PyExc_OverflowError,
3923 "long int larger than 32 bits");
3924 x = y;
3925 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003926#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003927 }
3928 else
3929 return PyErr_Format(PyExc_TypeError,
3930 "expected int/long, %s found",
3931 Py_TYPE(arg)->tp_name);
3932 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003933}
3934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003935PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003936"htonl(integer) -> integer\n\
3937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003938Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003939
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003940/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003941
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003942PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003943"inet_aton(string) -> packed 32-bit IP representation\n\
3944\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003945Convert 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 +00003946binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003947
3948static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003949socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003950{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003951#ifndef INADDR_NONE
3952#define INADDR_NONE (-1)
3953#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003954#ifdef HAVE_INET_ATON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003955 struct in_addr buf;
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003956#endif
3957
3958#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00003959#if (SIZEOF_INT != 4)
3960#error "Not sure if in_addr_t exists and int is not 32-bits."
3961#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003962 /* Have to use inet_addr() instead */
3963 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003964#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003965 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003967 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3968 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003969
Tim Peters1df9fdd2003-02-13 03:13:40 +00003970
3971#ifdef HAVE_INET_ATON
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003972
3973#ifdef USE_INET_ATON_WEAKLINK
3974 if (inet_aton != NULL) {
3975#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003976 if (inet_aton(ip_addr, &buf))
3977 return PyString_FromStringAndSize((char *)(&buf),
3978 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003979
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003980 PyErr_SetString(socket_error,
3981 "illegal IP address string passed to inet_aton");
3982 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003983
Ronald Oussorend06b6f22006-04-23 11:59:25 +00003984#ifdef USE_INET_ATON_WEAKLINK
3985 } else {
3986#endif
3987
3988#endif
3989
3990#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3991
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003992 /* special-case this address as inet_addr might return INADDR_NONE
3993 * for this */
3994 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3995 packed_addr = 0xFFFFFFFF;
3996 } else {
Martin Blais2856e5f2006-05-26 12:03:27 +00003997
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003998 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004000 if (packed_addr == INADDR_NONE) { /* invalid address */
4001 PyErr_SetString(socket_error,
4002 "illegal IP address string passed to inet_aton");
4003 return NULL;
4004 }
4005 }
4006 return PyString_FromStringAndSize((char *) &packed_addr,
4007 sizeof(packed_addr));
Ronald Oussorend06b6f22006-04-23 11:59:25 +00004008
4009#ifdef USE_INET_ATON_WEAKLINK
4010 }
4011#endif
4012
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004013#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004014}
4015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004016PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004017"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004018\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004019Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004020
4021static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004022socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004023{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004024 char *packed_str;
4025 int addr_len;
4026 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004027
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004028 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
4029 return NULL;
4030 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004031
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004032 if (addr_len != sizeof(packed_addr)) {
4033 PyErr_SetString(socket_error,
4034 "packed IP wrong length for inet_ntoa");
4035 return NULL;
4036 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004037
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004038 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004040 return PyString_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004041}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004042
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004043#ifdef HAVE_INET_PTON
4044
4045PyDoc_STRVAR(inet_pton_doc,
4046"inet_pton(af, ip) -> packed IP address string\n\
4047\n\
4048Convert an IP address from string format to a packed string suitable\n\
4049for use with low-level network functions.");
4050
4051static PyObject *
4052socket_inet_pton(PyObject *self, PyObject *args)
4053{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004054 int af;
4055 char* ip;
4056 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004057#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004058 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004059#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004060 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004061#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004062 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4063 return NULL;
4064 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004065
Martin v. Löwis04697e82004-06-02 12:35:29 +00004066#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004067 if(af == AF_INET6) {
4068 PyErr_SetString(socket_error,
4069 "can't use AF_INET6, IPv6 is disabled");
4070 return NULL;
4071 }
Martin Blais2856e5f2006-05-26 12:03:27 +00004072#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00004073
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004074 retval = inet_pton(af, ip, packed);
4075 if (retval < 0) {
4076 PyErr_SetFromErrno(socket_error);
4077 return NULL;
4078 } else if (retval == 0) {
4079 PyErr_SetString(socket_error,
4080 "illegal IP address string passed to inet_pton");
4081 return NULL;
4082 } else if (af == AF_INET) {
4083 return PyString_FromStringAndSize(packed,
4084 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004085#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004086 } else if (af == AF_INET6) {
4087 return PyString_FromStringAndSize(packed,
4088 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004089#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004090 } else {
4091 PyErr_SetString(socket_error, "unknown address family");
4092 return NULL;
4093 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004094}
Martin Blais2856e5f2006-05-26 12:03:27 +00004095
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004096PyDoc_STRVAR(inet_ntop_doc,
4097"inet_ntop(af, packed_ip) -> string formatted IP address\n\
4098\n\
4099Convert a packed IP address of the given family to string format.");
4100
4101static PyObject *
4102socket_inet_ntop(PyObject *self, PyObject *args)
4103{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004104 int af;
4105 char* packed;
4106 int len;
4107 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004108#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004109 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004110#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004111 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004112#endif
Martin Blais2856e5f2006-05-26 12:03:27 +00004113
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004114 /* Guarantee NUL-termination for PyString_FromString() below */
4115 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004116
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004117 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4118 return NULL;
4119 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004120
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004121 if (af == AF_INET) {
4122 if (len != sizeof(struct in_addr)) {
4123 PyErr_SetString(PyExc_ValueError,
4124 "invalid length of packed IP address string");
4125 return NULL;
4126 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004127#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004128 } else if (af == AF_INET6) {
4129 if (len != sizeof(struct in6_addr)) {
4130 PyErr_SetString(PyExc_ValueError,
4131 "invalid length of packed IP address string");
4132 return NULL;
4133 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004134#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004135 } else {
4136 PyErr_Format(PyExc_ValueError,
4137 "unknown address family %d", af);
4138 return NULL;
4139 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004140
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004141 retval = inet_ntop(af, packed, ip, sizeof(ip));
4142 if (!retval) {
4143 PyErr_SetFromErrno(socket_error);
4144 return NULL;
4145 } else {
4146 return PyString_FromString(retval);
4147 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004149 /* NOTREACHED */
4150 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4151 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004152}
4153
4154#endif /* HAVE_INET_PTON */
4155
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004156/* Python interface to getaddrinfo(host, port). */
4157
4158/*ARGSUSED*/
4159static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004160socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004161{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004162 struct addrinfo hints, *res;
4163 struct addrinfo *res0 = NULL;
4164 PyObject *hobj = NULL;
4165 PyObject *pobj = (PyObject *)NULL;
4166 char pbuf[30];
4167 char *hptr, *pptr;
4168 int family, socktype, protocol, flags;
4169 int error;
4170 PyObject *all = (PyObject *)NULL;
4171 PyObject *single = (PyObject *)NULL;
4172 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004173
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004174 family = socktype = protocol = flags = 0;
4175 family = AF_UNSPEC;
4176 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4177 &hobj, &pobj, &family, &socktype,
4178 &protocol, &flags)) {
4179 return NULL;
4180 }
4181 if (hobj == Py_None) {
4182 hptr = NULL;
4183 } else if (PyUnicode_Check(hobj)) {
Victor Stinner9a2326b2015-09-11 12:42:13 +02004184 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004185 if (!idna)
4186 return NULL;
4187 hptr = PyString_AsString(idna);
4188 } else if (PyString_Check(hobj)) {
4189 hptr = PyString_AsString(hobj);
4190 } else {
4191 PyErr_SetString(PyExc_TypeError,
4192 "getaddrinfo() argument 1 must be string or None");
4193 return NULL;
4194 }
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004195 if (PyInt_Check(pobj) || PyLong_Check(pobj)) {
4196 long value = PyLong_AsLong(pobj);
4197 if (value == -1 && PyErr_Occurred())
4198 return NULL;
4199 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004200 pptr = pbuf;
4201 } else if (PyString_Check(pobj)) {
4202 pptr = PyString_AsString(pobj);
4203 } else if (pobj == Py_None) {
4204 pptr = (char *)NULL;
4205 } else {
Petri Lehtinenab7dd182012-12-20 21:06:14 +02004206 PyErr_SetString(socket_error,
4207 "getaddrinfo() argument 2 must be integer or string");
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004208 goto err;
4209 }
Ronald Oussoren0e6283e2013-06-10 10:35:36 +02004210#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren16c52a32013-05-24 13:45:27 +02004211 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
4212 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
4213 * if AI_NUMERICSERV is set and the servname is NULL or "0".
4214 * This workaround avoids a segfault in libsystem.
4215 */
4216 pptr = "00";
4217 }
4218#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004219 memset(&hints, 0, sizeof(hints));
4220 hints.ai_family = family;
4221 hints.ai_socktype = socktype;
4222 hints.ai_protocol = protocol;
4223 hints.ai_flags = flags;
4224 Py_BEGIN_ALLOW_THREADS
4225 ACQUIRE_GETADDRINFO_LOCK
4226 error = getaddrinfo(hptr, pptr, &hints, &res0);
4227 Py_END_ALLOW_THREADS
4228 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4229 if (error) {
4230 set_gaierror(error);
4231 goto err;
4232 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004233
Benjamin Petersona5a44ab2015-04-01 11:16:40 -04004234 all = PyList_New(0);
4235 if (all == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004236 goto err;
4237 for (res = res0; res; res = res->ai_next) {
4238 PyObject *addr =
4239 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4240 if (addr == NULL)
4241 goto err;
4242 single = Py_BuildValue("iiisO", res->ai_family,
4243 res->ai_socktype, res->ai_protocol,
4244 res->ai_canonname ? res->ai_canonname : "",
4245 addr);
4246 Py_DECREF(addr);
4247 if (single == NULL)
4248 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004250 if (PyList_Append(all, single))
4251 goto err;
4252 Py_XDECREF(single);
4253 }
4254 Py_XDECREF(idna);
4255 if (res0)
4256 freeaddrinfo(res0);
4257 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004258 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004259 Py_XDECREF(single);
4260 Py_XDECREF(all);
4261 Py_XDECREF(idna);
4262 if (res0)
4263 freeaddrinfo(res0);
4264 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004265}
4266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004267PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004268"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4269 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004270\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004271Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004272
4273/* Python interface to getnameinfo(sa, flags). */
4274
4275/*ARGSUSED*/
4276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004277socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004279 PyObject *sa = (PyObject *)NULL;
4280 int flags;
4281 char *hostp;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004282 int port;
4283 unsigned int flowinfo, scope_id;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004284 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4285 struct addrinfo hints, *res = NULL;
4286 int error;
4287 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004288
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004289 flags = flowinfo = scope_id = 0;
4290 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4291 return NULL;
4292 if (!PyTuple_Check(sa)) {
4293 PyErr_SetString(PyExc_TypeError,
4294 "getnameinfo() argument 1 must be a tuple");
4295 return NULL;
4296 }
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004297 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004298 &hostp, &port, &flowinfo, &scope_id))
4299 return NULL;
Charles-François Natali65dd7452012-06-23 10:06:56 +02004300 if (flowinfo > 0xfffff) {
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004301 PyErr_SetString(PyExc_OverflowError,
4302 "getsockaddrarg: flowinfo must be 0-1048575.");
4303 return NULL;
4304 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004305 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4306 memset(&hints, 0, sizeof(hints));
4307 hints.ai_family = AF_UNSPEC;
4308 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4309 Py_BEGIN_ALLOW_THREADS
4310 ACQUIRE_GETADDRINFO_LOCK
4311 error = getaddrinfo(hostp, pbuf, &hints, &res);
4312 Py_END_ALLOW_THREADS
4313 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4314 if (error) {
4315 set_gaierror(error);
4316 goto fail;
4317 }
4318 if (res->ai_next) {
4319 PyErr_SetString(socket_error,
4320 "sockaddr resolved to multiple addresses");
4321 goto fail;
4322 }
4323 switch (res->ai_family) {
4324 case AF_INET:
4325 {
4326 if (PyTuple_GET_SIZE(sa) != 2) {
4327 PyErr_SetString(socket_error,
4328 "IPv4 sockaddr must be 2 tuple");
4329 goto fail;
4330 }
4331 break;
4332 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004333#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004334 case AF_INET6:
4335 {
4336 struct sockaddr_in6 *sin6;
4337 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali3aa59e32012-01-02 15:38:27 +01004338 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004339 sin6->sin6_scope_id = scope_id;
4340 break;
4341 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004342#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004343 }
4344 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4345 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4346 if (error) {
4347 set_gaierror(error);
4348 goto fail;
4349 }
4350 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004351
4352fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004353 if (res)
4354 freeaddrinfo(res);
4355 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004356}
4357
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004358PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004359"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004360\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004361Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004362
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004363
4364/* Python API to getting and setting the default timeout value. */
4365
4366static PyObject *
4367socket_getdefaulttimeout(PyObject *self)
4368{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004369 if (defaulttimeout < 0.0) {
4370 Py_INCREF(Py_None);
4371 return Py_None;
4372 }
4373 else
4374 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004375}
4376
4377PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004378"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004379\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004380Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004381A value of None indicates that new socket objects have no timeout.\n\
4382When the socket module is first imported, the default is None.");
4383
4384static PyObject *
4385socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4386{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004387 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004388
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004389 if (arg == Py_None)
4390 timeout = -1.0;
4391 else {
4392 timeout = PyFloat_AsDouble(arg);
4393 if (timeout < 0.0) {
4394 if (!PyErr_Occurred())
4395 PyErr_SetString(PyExc_ValueError,
4396 "Timeout value out of range");
4397 return NULL;
4398 }
4399 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004400
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004401 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004402
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004403 Py_INCREF(Py_None);
4404 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004405}
4406
4407PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004408"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004409\n\
Ezio Melottica5e9082011-08-14 08:27:36 +03004410Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00004411A value of None indicates that new socket objects have no timeout.\n\
4412When the socket module is first imported, the default is None.");
4413
4414
Guido van Rossum30a685f1991-06-27 15:51:29 +00004415/* List of functions exported by this module. */
4416
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004417static PyMethodDef socket_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004418 {"gethostbyname", socket_gethostbyname,
4419 METH_VARARGS, gethostbyname_doc},
4420 {"gethostbyname_ex", socket_gethostbyname_ex,
4421 METH_VARARGS, ghbn_ex_doc},
4422 {"gethostbyaddr", socket_gethostbyaddr,
4423 METH_VARARGS, gethostbyaddr_doc},
4424 {"gethostname", socket_gethostname,
4425 METH_NOARGS, gethostname_doc},
4426 {"getservbyname", socket_getservbyname,
4427 METH_VARARGS, getservbyname_doc},
4428 {"getservbyport", socket_getservbyport,
4429 METH_VARARGS, getservbyport_doc},
4430 {"getprotobyname", socket_getprotobyname,
4431 METH_VARARGS, getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004432#ifndef NO_DUP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004433 {"fromfd", socket_fromfd,
4434 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004435#endif
Dave Cole331708b2004-08-09 04:51:41 +00004436#ifdef HAVE_SOCKETPAIR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004437 {"socketpair", socket_socketpair,
4438 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00004439#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004440 {"ntohs", socket_ntohs,
4441 METH_VARARGS, ntohs_doc},
4442 {"ntohl", socket_ntohl,
4443 METH_O, ntohl_doc},
4444 {"htons", socket_htons,
4445 METH_VARARGS, htons_doc},
4446 {"htonl", socket_htonl,
4447 METH_O, htonl_doc},
4448 {"inet_aton", socket_inet_aton,
4449 METH_VARARGS, inet_aton_doc},
4450 {"inet_ntoa", socket_inet_ntoa,
4451 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004452#ifdef HAVE_INET_PTON
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004453 {"inet_pton", socket_inet_pton,
4454 METH_VARARGS, inet_pton_doc},
4455 {"inet_ntop", socket_inet_ntop,
4456 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004457#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004458 {"getaddrinfo", socket_getaddrinfo,
4459 METH_VARARGS, getaddrinfo_doc},
4460 {"getnameinfo", socket_getnameinfo,
4461 METH_VARARGS, getnameinfo_doc},
4462 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4463 METH_NOARGS, getdefaulttimeout_doc},
4464 {"setdefaulttimeout", socket_setdefaulttimeout,
4465 METH_O, setdefaulttimeout_doc},
4466 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004467};
4468
Guido van Rossum30a685f1991-06-27 15:51:29 +00004469
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004470#ifdef RISCOS
4471#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00004472
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004473static int
4474os_init(void)
4475{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004476 _kernel_swi_regs r;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004477
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004478 r.r[0] = 0;
4479 _kernel_swi(0x43380, &r, &r);
4480 taskwindow = r.r[0];
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004482 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004483}
4484
4485#endif /* RISCOS */
4486
4487
4488#ifdef MS_WINDOWS
4489#define OS_INIT_DEFINED
4490
4491/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004492
4493static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004494os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004495{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004496 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00004497}
4498
4499static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004500os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00004501{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004502 WSADATA WSAData;
4503 int ret;
4504 char buf[100];
4505 ret = WSAStartup(0x0101, &WSAData);
4506 switch (ret) {
4507 case 0: /* No error */
4508 Py_AtExit(os_cleanup);
4509 return 1; /* Success */
4510 case WSASYSNOTREADY:
4511 PyErr_SetString(PyExc_ImportError,
4512 "WSAStartup failed: network not ready");
4513 break;
4514 case WSAVERNOTSUPPORTED:
4515 case WSAEINVAL:
4516 PyErr_SetString(
4517 PyExc_ImportError,
4518 "WSAStartup failed: requested version not supported");
4519 break;
4520 default:
4521 PyOS_snprintf(buf, sizeof(buf),
4522 "WSAStartup failed: error code %d", ret);
4523 PyErr_SetString(PyExc_ImportError, buf);
4524 break;
4525 }
4526 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004527}
4528
Guido van Rossum8d665e61996-06-26 18:22:49 +00004529#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00004530
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004531
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004532#ifdef PYOS_OS2
4533#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004534
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004535/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004536
4537static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004538os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004539{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004540#ifndef PYCC_GCC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004541 char reason[64];
4542 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004543
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004544 if (rc == 0) {
4545 return 1; /* Success */
4546 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004547
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004548 PyOS_snprintf(reason, sizeof(reason),
4549 "OS/2 TCP/IP Error# %d", sock_errno());
4550 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004551
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004552 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004553#else
Ezio Melottic2077b02011-03-16 12:34:31 +02004554 /* No need to initialize sockets with GCC/EMX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004555 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004556#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004557}
4558
4559#endif /* PYOS_OS2 */
4560
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004561
4562#ifndef OS_INIT_DEFINED
4563static int
4564os_init(void)
4565{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004566 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004567}
4568#endif
4569
4570
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004571/* C API table - always add new things to the end for binary
4572 compatibility. */
4573static
4574PySocketModule_APIObject PySocketModuleAPI =
4575{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004576 &sock_type,
4577 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004578};
4579
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004580
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004581/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004582
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004583 This module is actually called "_socket", and there's a wrapper
4584 "socket.py" which implements some additional functionality. On some
4585 platforms (e.g. Windows and OS/2), socket.py also implements a
4586 wrapper for the socket type that provides missing functionality such
4587 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4588 with an ImportError exception if os-specific initialization fails.
4589 On Windows, this does WINSOCK initialization. When WINSOCK is
Ezio Melottic2077b02011-03-16 12:34:31 +02004590 initialized successfully, a call to WSACleanup() is scheduled to be
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004591 made at exit time.
4592*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004593
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004594PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004595"Implementation module for socket operations.\n\
4596\n\
4597See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004598
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004599PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004600init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004601{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004602 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004603
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004604 if (!os_init())
4605 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004606
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004607 Py_TYPE(&sock_type) = &PyType_Type;
4608 m = Py_InitModule3(PySocket_MODULE_NAME,
4609 socket_methods,
4610 socket_doc);
4611 if (m == NULL)
4612 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004614 socket_error = PyErr_NewException("socket.error",
4615 PyExc_IOError, NULL);
4616 if (socket_error == NULL)
4617 return;
4618 PySocketModuleAPI.error = socket_error;
4619 Py_INCREF(socket_error);
4620 PyModule_AddObject(m, "error", socket_error);
4621 socket_herror = PyErr_NewException("socket.herror",
4622 socket_error, NULL);
4623 if (socket_herror == NULL)
4624 return;
4625 Py_INCREF(socket_herror);
4626 PyModule_AddObject(m, "herror", socket_herror);
4627 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4628 NULL);
4629 if (socket_gaierror == NULL)
4630 return;
4631 Py_INCREF(socket_gaierror);
4632 PyModule_AddObject(m, "gaierror", socket_gaierror);
4633 socket_timeout = PyErr_NewException("socket.timeout",
4634 socket_error, NULL);
4635 if (socket_timeout == NULL)
4636 return;
4637 Py_INCREF(socket_timeout);
4638 PyModule_AddObject(m, "timeout", socket_timeout);
4639 Py_INCREF((PyObject *)&sock_type);
4640 if (PyModule_AddObject(m, "SocketType",
4641 (PyObject *)&sock_type) != 0)
4642 return;
4643 Py_INCREF((PyObject *)&sock_type);
4644 if (PyModule_AddObject(m, "socket",
4645 (PyObject *)&sock_type) != 0)
4646 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004647
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004648#ifdef ENABLE_IPV6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004649 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004650#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004651 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004652#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004653 Py_INCREF(has_ipv6);
4654 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004655
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004656 /* Export C API */
4657 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4658 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4659 ) != 0)
4660 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004662 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00004663#ifdef AF_UNSPEC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004664 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004665#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004666 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004667#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004668 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004669#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004670#if defined(AF_UNIX)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004671 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004672#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004673#ifdef AF_AX25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004674 /* Amateur Radio AX.25 */
4675 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004676#endif
4677#ifdef AF_IPX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004678 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004679#endif
4680#ifdef AF_APPLETALK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004681 /* Appletalk DDP */
4682 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004683#endif
4684#ifdef AF_NETROM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004685 /* Amateur radio NetROM */
4686 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004687#endif
4688#ifdef AF_BRIDGE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004689 /* Multiprotocol bridge */
4690 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004691#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004692#ifdef AF_ATMPVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004693 /* ATM PVCs */
4694 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004695#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004696#ifdef AF_AAL5
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004697 /* Reserved for Werner's ATM */
4698 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004699#endif
4700#ifdef AF_X25
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004701 /* Reserved for X.25 project */
4702 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004703#endif
4704#ifdef AF_INET6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004705 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004706#endif
4707#ifdef AF_ROSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004708 /* Amateur Radio X.25 PLP */
4709 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004710#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004711#ifdef AF_DECnet
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004712 /* Reserved for DECnet project */
4713 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004714#endif
4715#ifdef AF_NETBEUI
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004716 /* Reserved for 802.2LLC project */
4717 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004718#endif
4719#ifdef AF_SECURITY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004720 /* Security callback pseudo AF */
4721 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004722#endif
4723#ifdef AF_KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004724 /* PF_KEY key management API */
4725 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004726#endif
4727#ifdef AF_NETLINK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004728 /* */
4729 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4730 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004731#ifdef NETLINK_SKIP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004732 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004733#endif
4734#ifdef NETLINK_W1
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004735 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004736#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004737 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4738 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004739#ifdef NETLINK_TCPDIAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004740 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004741#endif
4742#ifdef NETLINK_NFLOG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004743 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004744#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004745#ifdef NETLINK_XFRM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004746 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004747#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004748#ifdef NETLINK_ARPD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004749 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004750#endif
4751#ifdef NETLINK_ROUTE6
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004752 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004753#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004754 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Martin v. Löwisb1cc1d42007-02-13 12:14:19 +00004755#ifdef NETLINK_DNRTMSG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004756 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4757#endif
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004758#ifdef NETLINK_TAPBASE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004759 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis5fe60e72006-04-06 22:29:33 +00004760#endif
Georg Brandldcfdae72006-04-01 07:33:08 +00004761#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004762#ifdef AF_ROUTE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004763 /* Alias to emulate 4.4BSD */
4764 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004765#endif
4766#ifdef AF_ASH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004767 /* Ash */
4768 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004769#endif
4770#ifdef AF_ECONET
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004771 /* Acorn Econet */
4772 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004773#endif
4774#ifdef AF_ATMSVC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004775 /* ATM SVCs */
4776 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004777#endif
4778#ifdef AF_SNA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004779 /* Linux SNA Project (nutters!) */
4780 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004781#endif
4782#ifdef AF_IRDA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004783 /* IRDA sockets */
4784 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004785#endif
4786#ifdef AF_PPPOX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004787 /* PPPoX sockets */
4788 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004789#endif
4790#ifdef AF_WANPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004791 /* Wanpipe API Sockets */
4792 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004793#endif
4794#ifdef AF_LLC
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004795 /* Linux LLC */
4796 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004797#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004798
Hye-Shik Chang81268602004-02-02 06:05:24 +00004799#ifdef USE_BLUETOOTH
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004800 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4801 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4802 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4803 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004804#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004805 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004806#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00004807#if !defined(__FreeBSD__)
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004808#if !defined(__NetBSD__) && !defined(__DragonFly__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004809 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
Gregory P. Smith886a1cd2010-10-17 04:28:14 +00004810#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004811 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4812 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004813#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004814 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4815 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4816 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004817#endif
4818
Antoine Pitroue0c5f3c2010-10-27 20:35:26 +00004819#ifdef AF_PACKET
4820 PyModule_AddIntMacro(m, AF_PACKET);
4821#endif
4822#ifdef PF_PACKET
4823 PyModule_AddIntMacro(m, PF_PACKET);
4824#endif
4825#ifdef PACKET_HOST
4826 PyModule_AddIntMacro(m, PACKET_HOST);
4827#endif
4828#ifdef PACKET_BROADCAST
4829 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4830#endif
4831#ifdef PACKET_MULTICAST
4832 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4833#endif
4834#ifdef PACKET_OTHERHOST
4835 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4836#endif
4837#ifdef PACKET_OUTGOING
4838 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4839#endif
4840#ifdef PACKET_LOOPBACK
4841 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4842#endif
4843#ifdef PACKET_FASTROUTE
4844 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004845#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004846
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004847#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004848 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004850 /* for addresses */
4851 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4852 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4853 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004854
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004855 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4856 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4857 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004858
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004859 /* for setsockopt() */
4860 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4861 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4862 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4863 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4864 TIPC_DEST_DROPPABLE);
4865 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004866
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004867 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4868 TIPC_LOW_IMPORTANCE);
4869 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4870 TIPC_MEDIUM_IMPORTANCE);
4871 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4872 TIPC_HIGH_IMPORTANCE);
4873 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4874 TIPC_CRITICAL_IMPORTANCE);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004875
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004876 /* for subscriptions */
4877 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4878 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
Georg Brandlff15c862008-01-11 09:19:11 +00004879#ifdef TIPC_SUB_CANCEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004880 /* doesn't seem to be available everywhere */
4881 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
Georg Brandlff15c862008-01-11 09:19:11 +00004882#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004883 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4884 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4885 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4886 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4887 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4888 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
Christian Heimesfb2d25a2008-01-07 16:12:44 +00004889#endif
4890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004891 /* Socket types */
4892 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4893 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004894#ifndef __BEOS__
4895/* We have incomplete socket support. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004896 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4897 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004898#if defined(SOCK_RDM)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004899 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004900#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004901#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004902
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004903#ifdef SO_DEBUG
4904 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004905#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004906#ifdef SO_ACCEPTCONN
4907 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004909#ifdef SO_REUSEADDR
4910 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004911#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004912#ifdef SO_EXCLUSIVEADDRUSE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004913 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004914#endif
4915
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004916#ifdef SO_KEEPALIVE
4917 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004918#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004919#ifdef SO_DONTROUTE
4920 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004921#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004922#ifdef SO_BROADCAST
4923 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004924#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004925#ifdef SO_USELOOPBACK
4926 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004927#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004928#ifdef SO_LINGER
4929 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004930#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004931#ifdef SO_OOBINLINE
4932 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004933#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004934#ifdef SO_REUSEPORT
4935 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004936#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004937#ifdef SO_SNDBUF
4938 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004939#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004940#ifdef SO_RCVBUF
4941 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004942#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004943#ifdef SO_SNDLOWAT
4944 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004945#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004946#ifdef SO_RCVLOWAT
4947 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004948#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004949#ifdef SO_SNDTIMEO
4950 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004951#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004952#ifdef SO_RCVTIMEO
4953 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004954#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004955#ifdef SO_ERROR
4956 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004957#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004958#ifdef SO_TYPE
4959 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004960#endif
Larry Hastings3b958e32010-04-02 11:18:17 +00004961#ifdef SO_SETFIB
4962 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4963#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004965 /* Maximum number of connections for "listen" */
4966#ifdef SOMAXCONN
4967 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004968#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004969 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004970#endif
4971
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004972 /* Flags for send, recv */
4973#ifdef MSG_OOB
4974 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004975#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004976#ifdef MSG_PEEK
4977 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004978#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004979#ifdef MSG_DONTROUTE
4980 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004981#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004982#ifdef MSG_DONTWAIT
4983 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004984#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004985#ifdef MSG_EOR
4986 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004987#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004988#ifdef MSG_TRUNC
4989 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004990#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004991#ifdef MSG_CTRUNC
4992 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004993#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004994#ifdef MSG_WAITALL
4995 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004996#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004997#ifdef MSG_BTAG
4998 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004999#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005000#ifdef MSG_ETAG
5001 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005002#endif
5003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005004 /* Protocol level and numbers, usable for [gs]etsockopt */
5005#ifdef SOL_SOCKET
5006 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005007#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005008#ifdef SOL_IP
5009 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005010#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005011 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00005012#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005013#ifdef SOL_IPX
5014 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00005015#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005016#ifdef SOL_AX25
5017 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005018#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005019#ifdef SOL_ATALK
5020 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005021#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005022#ifdef SOL_NETROM
5023 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005024#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005025#ifdef SOL_ROSE
5026 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005027#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005028#ifdef SOL_TCP
5029 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005030#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005031 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00005032#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005033#ifdef SOL_UDP
5034 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005035#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005036 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00005037#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005038#ifdef IPPROTO_IP
5039 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00005040#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005041 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005042#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005043#ifdef IPPROTO_HOPOPTS
5044 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005045#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005046#ifdef IPPROTO_ICMP
5047 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00005048#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005049 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005050#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005051#ifdef IPPROTO_IGMP
5052 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005053#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005054#ifdef IPPROTO_GGP
5055 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005056#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005057#ifdef IPPROTO_IPV4
5058 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005059#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005060#ifdef IPPROTO_IPV6
5061 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00005062#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005063#ifdef IPPROTO_IPIP
5064 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005065#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005066#ifdef IPPROTO_TCP
5067 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00005068#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005069 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005070#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005071#ifdef IPPROTO_EGP
5072 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005073#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005074#ifdef IPPROTO_PUP
5075 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005076#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005077#ifdef IPPROTO_UDP
5078 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00005079#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005080 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005081#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005082#ifdef IPPROTO_IDP
5083 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005084#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005085#ifdef IPPROTO_HELLO
5086 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005087#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005088#ifdef IPPROTO_ND
5089 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005090#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005091#ifdef IPPROTO_TP
5092 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005093#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005094#ifdef IPPROTO_IPV6
5095 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005097#ifdef IPPROTO_ROUTING
5098 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005100#ifdef IPPROTO_FRAGMENT
5101 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005103#ifdef IPPROTO_RSVP
5104 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005105#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005106#ifdef IPPROTO_GRE
5107 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005108#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005109#ifdef IPPROTO_ESP
5110 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005111#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005112#ifdef IPPROTO_AH
5113 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005114#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005115#ifdef IPPROTO_MOBILE
5116 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005117#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005118#ifdef IPPROTO_ICMPV6
5119 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005120#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005121#ifdef IPPROTO_NONE
5122 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005123#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005124#ifdef IPPROTO_DSTOPTS
5125 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005126#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005127#ifdef IPPROTO_XTP
5128 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005129#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005130#ifdef IPPROTO_EON
5131 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005132#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005133#ifdef IPPROTO_PIM
5134 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005135#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005136#ifdef IPPROTO_IPCOMP
5137 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005138#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005139#ifdef IPPROTO_VRRP
5140 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005141#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005142#ifdef IPPROTO_BIP
5143 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005144#endif
5145/**/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005146#ifdef IPPROTO_RAW
5147 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00005148#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005149 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005150#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005151#ifdef IPPROTO_MAX
5152 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005153#endif
5154
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005155 /* Some port configuration */
5156#ifdef IPPORT_RESERVED
5157 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005158#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005159 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005160#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005161#ifdef IPPORT_USERRESERVED
5162 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005163#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005164 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005165#endif
5166
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005167 /* Some reserved IP v.4 addresses */
5168#ifdef INADDR_ANY
5169 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005170#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005171 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005172#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005173#ifdef INADDR_BROADCAST
5174 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005175#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005176 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005177#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005178#ifdef INADDR_LOOPBACK
5179 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005180#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005181 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005182#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005183#ifdef INADDR_UNSPEC_GROUP
5184 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005185#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005186 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005187#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005188#ifdef INADDR_ALLHOSTS_GROUP
5189 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5190 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005191#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005192 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005193#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005194#ifdef INADDR_MAX_LOCAL_GROUP
5195 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5196 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005197#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005198 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005199#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005200#ifdef INADDR_NONE
5201 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005202#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005203 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00005204#endif
5205
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005206 /* IPv4 [gs]etsockopt options */
5207#ifdef IP_OPTIONS
5208 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005209#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005210#ifdef IP_HDRINCL
5211 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005212#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005213#ifdef IP_TOS
5214 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005215#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005216#ifdef IP_TTL
5217 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005218#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005219#ifdef IP_RECVOPTS
5220 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005221#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005222#ifdef IP_RECVRETOPTS
5223 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005224#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005225#ifdef IP_RECVDSTADDR
5226 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005227#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005228#ifdef IP_RETOPTS
5229 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005230#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005231#ifdef IP_MULTICAST_IF
5232 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005233#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005234#ifdef IP_MULTICAST_TTL
5235 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005236#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005237#ifdef IP_MULTICAST_LOOP
5238 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005239#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005240#ifdef IP_ADD_MEMBERSHIP
5241 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005242#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005243#ifdef IP_DROP_MEMBERSHIP
5244 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00005245#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005246#ifdef IP_DEFAULT_MULTICAST_TTL
5247 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5248 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00005249#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005250#ifdef IP_DEFAULT_MULTICAST_LOOP
5251 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5252 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00005253#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005254#ifdef IP_MAX_MEMBERSHIPS
5255 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00005256#endif
5257
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005258 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5259#ifdef IPV6_JOIN_GROUP
5260 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005261#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005262#ifdef IPV6_LEAVE_GROUP
5263 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005264#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005265#ifdef IPV6_MULTICAST_HOPS
5266 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005267#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005268#ifdef IPV6_MULTICAST_IF
5269 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005270#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005271#ifdef IPV6_MULTICAST_LOOP
5272 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005273#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005274#ifdef IPV6_UNICAST_HOPS
5275 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005276#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005277 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005278#ifdef IPV6_V6ONLY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005279 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005280#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005281 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00005282#ifdef IPV6_CHECKSUM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005283 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005284#endif
5285#ifdef IPV6_DONTFRAG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005286 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005287#endif
5288#ifdef IPV6_DSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005289 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005290#endif
5291#ifdef IPV6_HOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005292 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005293#endif
5294#ifdef IPV6_HOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005295 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005296#endif
5297#ifdef IPV6_NEXTHOP
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005298 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005299#endif
5300#ifdef IPV6_PATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005301 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005302#endif
5303#ifdef IPV6_PKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005304 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005305#endif
5306#ifdef IPV6_RECVDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005307 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005308#endif
5309#ifdef IPV6_RECVHOPLIMIT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005310 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005311#endif
5312#ifdef IPV6_RECVHOPOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005313 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005314#endif
5315#ifdef IPV6_RECVPKTINFO
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005316 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005317#endif
5318#ifdef IPV6_RECVRTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005319 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005320#endif
5321#ifdef IPV6_RECVTCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005322 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005323#endif
5324#ifdef IPV6_RTHDR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005325 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005326#endif
5327#ifdef IPV6_RTHDRDSTOPTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005328 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005329#endif
5330#ifdef IPV6_RTHDR_TYPE_0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005331 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005332#endif
5333#ifdef IPV6_RECVPATHMTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005334 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005335#endif
5336#ifdef IPV6_TCLASS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005337 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005338#endif
5339#ifdef IPV6_USE_MIN_MTU
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005340 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005341#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00005342
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005343 /* TCP options */
5344#ifdef TCP_NODELAY
5345 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00005346#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005347#ifdef TCP_MAXSEG
5348 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00005349#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005350#ifdef TCP_CORK
5351 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005352#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005353#ifdef TCP_KEEPIDLE
5354 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005355#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005356#ifdef TCP_KEEPINTVL
5357 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005358#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005359#ifdef TCP_KEEPCNT
5360 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005361#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005362#ifdef TCP_SYNCNT
5363 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005364#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005365#ifdef TCP_LINGER2
5366 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005367#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005368#ifdef TCP_DEFER_ACCEPT
5369 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005370#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005371#ifdef TCP_WINDOW_CLAMP
5372 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005373#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005374#ifdef TCP_INFO
5375 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005376#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005377#ifdef TCP_QUICKACK
5378 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00005379#endif
5380
Guido van Rossum09be4091999-08-09 14:40:40 +00005381
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005382 /* IPX options */
5383#ifdef IPX_TYPE
5384 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005385#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005386
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005387 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005388#ifdef EAI_ADDRFAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005389 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005390#endif
5391#ifdef EAI_AGAIN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005392 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005393#endif
5394#ifdef EAI_BADFLAGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005395 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005396#endif
5397#ifdef EAI_FAIL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005398 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005399#endif
5400#ifdef EAI_FAMILY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005401 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005402#endif
5403#ifdef EAI_MEMORY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005404 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005405#endif
5406#ifdef EAI_NODATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005407 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005408#endif
5409#ifdef EAI_NONAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005410 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005411#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005412#ifdef EAI_OVERFLOW
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005413 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005414#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005415#ifdef EAI_SERVICE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005416 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005417#endif
5418#ifdef EAI_SOCKTYPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005419 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005420#endif
5421#ifdef EAI_SYSTEM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005422 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005423#endif
5424#ifdef EAI_BADHINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005425 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005426#endif
5427#ifdef EAI_PROTOCOL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005428 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005429#endif
5430#ifdef EAI_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005431 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005432#endif
5433#ifdef AI_PASSIVE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005434 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005435#endif
5436#ifdef AI_CANONNAME
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005437 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005438#endif
5439#ifdef AI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005440 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005441#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00005442#ifdef AI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005443 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00005444#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005445#ifdef AI_MASK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005446 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005447#endif
5448#ifdef AI_ALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005449 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005450#endif
5451#ifdef AI_V4MAPPED_CFG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005452 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005453#endif
5454#ifdef AI_ADDRCONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005455 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005456#endif
5457#ifdef AI_V4MAPPED
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005458 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005459#endif
5460#ifdef AI_DEFAULT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005461 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005462#endif
5463#ifdef NI_MAXHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005464 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005465#endif
5466#ifdef NI_MAXSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005467 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005468#endif
5469#ifdef NI_NOFQDN
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005470 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005471#endif
5472#ifdef NI_NUMERICHOST
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005473 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005474#endif
5475#ifdef NI_NAMEREQD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005476 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005477#endif
5478#ifdef NI_NUMERICSERV
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005479 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005480#endif
5481#ifdef NI_DGRAM
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005482 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005483#endif
5484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005485 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005486#ifdef SHUT_RD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005487 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005488#elif defined(SD_RECEIVE)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005489 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005490#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005491 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005492#endif
5493#ifdef SHUT_WR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005494 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005495#elif defined(SD_SEND)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005496 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005497#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005498 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005499#endif
5500#ifdef SHUT_RDWR
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005501 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005502#elif defined(SD_BOTH)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005503 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005504#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005505 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00005506#endif
5507
Christian Heimes04ae9162008-01-04 15:23:30 +00005508#ifdef SIO_RCVALL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005509 {
5510 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5511 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5512 int i;
5513 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5514 PyObject *tmp;
5515 tmp = PyLong_FromUnsignedLong(codes[i]);
5516 if (tmp == NULL)
5517 return;
5518 PyModule_AddObject(m, names[i], tmp);
5519 }
5520 }
5521 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5522 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5523 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005524#ifdef RCVALL_IPLEVEL
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005525 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005526#endif
5527#ifdef RCVALL_MAX
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005528 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
Amaury Forgeot d'Arc94eba712008-03-28 21:55:29 +00005529#endif
Christian Heimes04ae9162008-01-04 15:23:30 +00005530#endif /* _MSTCPIP_ */
5531
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005532 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00005533#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005534 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005535#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005536}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005537
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005538
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005539#ifndef HAVE_INET_PTON
Christian Heimese8954f82007-11-22 11:21:16 +00005540#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005541
5542/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005543/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005544
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005545int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005546inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005547{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005548 if (af == AF_INET) {
Gregory P. Smith3605b5c2009-02-11 23:45:25 +00005549#if (SIZEOF_INT != 4)
5550#error "Not sure if in_addr_t exists and int is not 32-bits."
5551#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005552 unsigned int packed_addr;
5553 packed_addr = inet_addr(src);
5554 if (packed_addr == INADDR_NONE)
5555 return 0;
5556 memcpy(dst, &packed_addr, 4);
5557 return 1;
5558 }
5559 /* Should set errno to EAFNOSUPPORT */
5560 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005561}
5562
Martin v. Löwisc925b1532001-07-21 09:42:15 +00005563const char *
5564inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005565{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00005566 if (af == AF_INET) {
5567 struct in_addr packed_addr;
5568 if (size < 16)
5569 /* Should set errno to ENOSPC. */
5570 return NULL;
5571 memcpy(&packed_addr, src, sizeof(packed_addr));
5572 return strncpy(dst, inet_ntoa(packed_addr), size);
5573 }
5574 /* Should set errno to EAFNOSUPPORT */
5575 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005576}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005577
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00005578#endif
Christian Heimese8954f82007-11-22 11:21:16 +00005579#endif