blob: 2074fe317c19962ef23fa7c875332feb2a66ede7 [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 Heimes043d6f62008-01-07 17:19:16 +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
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000171# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700175# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000177# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
178# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
180# undef HAVE_GETHOSTBYNAME_R
181# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#endif
183
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200184#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000186#endif
187
Ned Deilye1d4e582016-02-23 22:05:29 +1100188/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000189#ifdef HAVE_SYS_PARAM_H
190#include <sys/param.h>
191#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100193 (this includes the getaddrinfo emulation) protect access with a lock.
194
195 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
196 a mix of code including an unsafe implementation from an old BSD's
197 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
198 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100199 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100200
Ned Deilye1d4e582016-02-23 22:05:29 +1100201 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
202 http://www.openbsd.org/plus54.html
203
204 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
205
206http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100207 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200208#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100209 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000210 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
212 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100213 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000214#define USE_GETADDRINFO_LOCK
215#endif
216
217#ifdef USE_GETADDRINFO_LOCK
218#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
219#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
220#else
221#define ACQUIRE_GETADDRINFO_LOCK
222#define RELEASE_GETADDRINFO_LOCK
223#endif
224
225#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000227#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229
Erik Bray63ae0442017-10-27 12:01:17 +0200230#if defined(__APPLE__) || defined(__CYGWIN__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100231# include <sys/ioctl.h>
232#endif
233
234
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000235#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000236/* make sure that the reentrant (gethostbyaddr_r etc)
237 functions are declared correctly if compiling with
238 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239
Thomas Wouters477c8d52006-05-27 19:21:47 +0000240/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000241 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000242#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000245#undef _XOPEN_SOURCE
246#include <sys/socket.h>
247#include <sys/types.h>
248#include <netinet/in.h>
249#ifdef _SS_ALIGNSIZE
250#define HAVE_GETADDRINFO 1
251#define HAVE_GETNAMEINFO 1
252#endif
253
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000254#define HAVE_INET_PTON
255#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000256#endif
257
Benjamin Peterson06930632017-09-04 16:36:05 -0700258/* Solaris fails to define this variable at all. */
259#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000260#define INET_ADDRSTRLEN 16
261#endif
262
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000265#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000266#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700268#ifdef HAVE_SYS_SOCKET_H
269#include <sys/socket.h>
270#endif
271
272#ifdef HAVE_NET_IF_H
273#include <net/if.h>
274#endif
275
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000276/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000278#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
280/* Addressing includes */
281
Guido van Rossum6f489d91996-06-28 20:15:15 +0000282#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
284/* Non-MS WINDOWS includes */
285# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000286# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000287
Guido van Rossum9376b741999-09-15 22:01:40 +0000288/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000290
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000294
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000296# ifdef HAVE_FCNTL_H
297# include <fcntl.h>
298# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Steve Dower65e4cb12014-11-22 12:54:57 -0800300#if defined(_MSC_VER) && _MSC_VER >= 1800
301/* Provides the IsWindows7SP1OrGreater() function */
302#include <VersionHelpers.h>
303#endif
304
Jeremy Hylton22308652001-02-02 03:23:09 +0000305#endif
306
Skip Montanaro7befb992004-02-10 16:50:21 +0000307#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000308
Neal Norwitz39d22e52002-11-02 19:55:21 +0000309#ifndef O_NONBLOCK
310# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000311#endif
312
Trent Micka708d6e2004-09-07 17:48:26 +0000313/* include Python's addrinfo.h unless it causes trouble */
314#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
315 /* Do not include addinfo.h on some newer IRIX versions.
316 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
317 * for example, but not by 6.5.10.
318 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000319#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000320 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
321 * EAI_* constants are defined in (the already included) ws2tcpip.h.
322 */
323#else
324# include "addrinfo.h"
325#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000326
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000327#ifdef __APPLE__
328/* On OS X, getaddrinfo returns no error indication of lookup
329 failure, so we must use the emulation instead of the libinfo
330 implementation. Unfortunately, performing an autoconf test
331 for this bug would require DNS access for the machine performing
332 the configuration, which is not acceptable. Therefore, we
333 determine the bug just by checking for __APPLE__. If this bug
334 gets ever fixed, perhaps checking for sys/version.h would be
335 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600337/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000338 Find to check for Jaguar is that it has getnameinfo(), which
339 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000340#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000342
343#ifdef HAVE_INET_ATON
344#define USE_INET_ATON_WEAKLINK
345#endif
346
Jack Jansen84262fb2002-07-02 14:40:42 +0000347#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000351/* avoid clashes with the C library definition of the symbol. */
352#define getaddrinfo fake_getaddrinfo
353#define gai_strerror fake_gai_strerror
354#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000355#include "getaddrinfo.c"
356#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000359#include "getnameinfo.c"
360#endif
361
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000362#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000363#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000364#endif
365
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000366#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000367#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000368#define EAFNOSUPPORT WSAEAFNOSUPPORT
369#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000370#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000371
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000372#ifndef SOCKETCLOSE
373#define SOCKETCLOSE close
374#endif
375
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000376#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000377#define USE_BLUETOOTH 1
378#if defined(__FreeBSD__)
379#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
380#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000381#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000382#define SOL_HCI SOL_HCI_RAW
383#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define sockaddr_l2 sockaddr_l2cap
385#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000386#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000387#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
388#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000389#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000390#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define sockaddr_l2 sockaddr_bt
392#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000395#define SOL_HCI BTPROTO_HCI
396#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
398#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000399#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000401#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
403#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000404#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000405#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
406#endif
407#endif
408
Charles-François Natali8b759652011-12-23 16:44:51 +0100409/* Convert "sock_addr_t *" to "struct sockaddr *". */
410#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000411
Martin v. Löwise9416172003-05-03 10:12:45 +0000412/*
413 * Constants for getnameinfo()
414 */
415#if !defined(NI_MAXHOST)
416#define NI_MAXHOST 1025
417#endif
418#if !defined(NI_MAXSERV)
419#define NI_MAXSERV 32
420#endif
421
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000422#ifndef INVALID_SOCKET /* MS defines this */
423#define INVALID_SOCKET (-1)
424#endif
425
Charles-François Natali0cc86852013-09-13 19:53:08 +0200426#ifndef INADDR_NONE
427#define INADDR_NONE (-1)
428#endif
429
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000430/* XXX There's a problem here: *static* functions are not supposed to have
431 a Py prefix (or use CapitalizedWords). Later... */
432
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433/* Global variable holding the exception type for errors detected
434 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000435static PyObject *socket_herror;
436static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000437static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438
Tim Peters643a7fc2002-02-17 04:13:21 +0000439/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000440 The sock_type variable contains pointers to various functions,
441 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000442 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000443static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000444
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000445#if defined(HAVE_POLL_H)
446#include <poll.h>
447#elif defined(HAVE_SYS_POLL_H)
448#include <sys/poll.h>
449#endif
450
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451/* Largest value to try to store in a socklen_t (used when handling
452 ancillary data). POSIX requires socklen_t to hold at least
453 (2**31)-1 and recommends against storing larger values, but
454 socklen_t was originally int in the BSD interface, so to be on the
455 safe side we use the smaller of (2**31)-1 and INT_MAX. */
456#if INT_MAX > 0x7fffffff
457#define SOCKLEN_T_LIMIT 0x7fffffff
458#else
459#define SOCKLEN_T_LIMIT INT_MAX
460#endif
461
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200462#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463/* Instead of select(), we'll use poll() since poll() works on any fd. */
464#define IS_SELECTABLE(s) 1
465/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000466#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200467/* If there's no timeout left, we don't have to call select, so it's a safe,
468 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100469#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000470#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471
472static PyObject*
473select_error(void)
474{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200475 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000477}
478
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000479#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000480#ifndef WSAEAGAIN
481#define WSAEAGAIN WSAEWOULDBLOCK
482#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000483#define CHECK_ERRNO(expected) \
484 (WSAGetLastError() == WSA ## expected)
485#else
486#define CHECK_ERRNO(expected) \
487 (errno == expected)
488#endif
489
Victor Stinnerdaf45552013-08-28 00:53:59 +0200490#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200491# define GET_SOCK_ERROR WSAGetLastError()
492# define SET_SOCK_ERROR(err) WSASetLastError(err)
493# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
494# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300495# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200496#else
497# define GET_SOCK_ERROR errno
498# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
499# define SOCK_TIMEOUT_ERR EWOULDBLOCK
500# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300501# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200502#endif
503
504
505#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200506/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
507static int support_wsa_no_inherit = -1;
508#endif
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510/* Convenience function to raise an error according to errno
511 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512
Guido van Rossum73624e91994-10-10 17:59:00 +0000513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000514set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000515{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000516#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 int err_no = WSAGetLastError();
518 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
519 recognizes the error codes used by both GetLastError() and
520 WSAGetLastError */
521 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200522 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000523#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000524
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200525 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526}
527
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000530set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000533
534#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 if (v != NULL) {
540 PyErr_SetObject(socket_herror, v);
541 Py_DECREF(v);
542 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545}
546
547
548static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000549set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552
Martin v. Löwis272cb402002-03-01 08:31:07 +0000553#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* EAI_SYSTEM is not available on Windows XP. */
555 if (error == EAI_SYSTEM)
556 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000557#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000559#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 if (v != NULL) {
565 PyErr_SetObject(socket_gaierror, v);
566 Py_DECREF(v);
567 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570}
571
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000572/* Function to perform the setting of socket blocking mode
573 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000574static int
575internal_setblocking(PySocketSockObject *s, int block)
576{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400577 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200578#ifdef MS_WINDOWS
579 u_long arg;
580#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100581#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100582 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100583 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000585#ifdef SOCK_NONBLOCK
586 if (block)
587 s->sock_type &= (~SOCK_NONBLOCK);
588 else
589 s->sock_type |= SOCK_NONBLOCK;
590#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000593#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100594#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200596 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400597 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100598#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200600 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400601 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100603 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 else
Victor Stinner9a954832013-12-04 00:41:24 +0100605 new_delay_flag = delay_flag | O_NONBLOCK;
606 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200607 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400608 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100609#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200611 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200612 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400613 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400615
616 result = 0;
617
618 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000620
Yury Selivanovfa22b292016-10-18 16:03:52 -0400621 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200622#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400623 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200624#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400625 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200626#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400627 }
628
629 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630}
631
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000632static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200633internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
634 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100637#ifdef HAVE_POLL
638 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200639 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100640#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200641 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200642 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100643#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000644
Victor Stinnerb7df3142015-03-27 22:59:32 +0100645 /* must be called with the GIL held */
646 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100647
Victor Stinner416f2e62015-03-31 13:56:29 +0200648 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200649 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200652 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 /* Prefer poll, if available, since you can poll() any fd
656 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000657#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100658 pollfd.fd = s->sock_fd;
659 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200660 if (connect) {
661 /* On Windows, the socket becomes writable on connection success,
662 but a connection failure is notified as an error. On POSIX, the
663 socket becomes writable on connection success or on connection
664 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200665 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200666 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667
Victor Stinner71694d52015-03-28 01:18:54 +0100668 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200669 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200670 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000671
Victor Stinner71694d52015-03-28 01:18:54 +0100672 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200673 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100674 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#else
Victor Stinnerced11742015-04-09 10:27:25 +0200676 if (interval >= 0) {
677 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
678 tvp = &tv;
679 }
680 else
681 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000682
Victor Stinner71694d52015-03-28 01:18:54 +0100683 FD_ZERO(&fds);
684 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200685 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200686 if (connect) {
687 /* On Windows, the socket becomes writable on connection success,
688 but a connection failure is notified as an error. On POSIX, the
689 socket becomes writable on connection success or on connection
690 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200691 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200692 }
Victor Stinner71694d52015-03-28 01:18:54 +0100693
694 /* See if the socket is ready */
695 Py_BEGIN_ALLOW_THREADS;
696 if (writing)
697 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200698 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100699 else
700 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200701 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100702 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 if (n < 0)
706 return -1;
707 if (n == 0)
708 return 1;
709 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000710}
711
Victor Stinner31bf2d52015-04-01 21:57:09 +0200712/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000713
Victor Stinner81c41db2015-04-02 11:50:57 +0200714 On error, raise an exception and return -1 if err is set, or fill err and
715 return -1 otherwise. If a signal was received and the signal handler raised
716 an exception, return -1, and set err to -1 if err is set.
717
718 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100719
Victor Stinner31bf2d52015-04-01 21:57:09 +0200720 If the socket has a timeout, wait until the socket is ready before calling
721 the function: wait until the socket is writable if writing is nonzero, wait
722 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100723
Victor Stinner81c41db2015-04-02 11:50:57 +0200724 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200725 the function, except if the signal handler raised an exception (PEP 475).
726
727 When the function is retried, recompute the timeout using a monotonic clock.
728
Victor Stinner81c41db2015-04-02 11:50:57 +0200729 sock_call_ex() must be called with the GIL held. The socket function is
730 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200731static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200732sock_call_ex(PySocketSockObject *s,
733 int writing,
734 int (*sock_func) (PySocketSockObject *s, void *data),
735 void *data,
736 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200737 int *err,
738 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200739{
Victor Stinner8912d142015-04-06 23:16:34 +0200740 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200741 _PyTime_t deadline = 0;
742 int deadline_initialized = 0;
743 int res;
744
745 /* sock_call() must be called with the GIL held. */
746 assert(PyGILState_Check());
747
748 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200749 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200750 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200751 /* For connect(), poll even for blocking socket. The connection
752 runs asynchronously. */
753 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200755 _PyTime_t interval;
756
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 if (deadline_initialized) {
758 /* recompute the timeout */
759 interval = deadline - _PyTime_GetMonotonicClock();
760 }
761 else {
762 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200763 deadline = _PyTime_GetMonotonicClock() + timeout;
764 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200765 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200766
Victor Stinner10550cd2015-04-03 13:22:27 +0200767 if (interval >= 0)
768 res = internal_select(s, writing, interval, connect);
769 else
770 res = 1;
771 }
772 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200773 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200774 }
775
Victor Stinner31bf2d52015-04-01 21:57:09 +0200776 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 if (err)
778 *err = GET_SOCK_ERROR;
779
Victor Stinner31bf2d52015-04-01 21:57:09 +0200780 if (CHECK_ERRNO(EINTR)) {
781 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200782 if (PyErr_CheckSignals()) {
783 if (err)
784 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200786 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200787
788 /* retry select() */
789 continue;
790 }
791
792 /* select() failed */
793 s->errorhandler();
794 return -1;
795 }
796
797 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200798 if (err)
799 *err = SOCK_TIMEOUT_ERR;
800 else
801 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200802 return -1;
803 }
804
805 /* the socket is ready */
806 }
807
Victor Stinner81c41db2015-04-02 11:50:57 +0200808 /* inner loop to retry sock_func() when sock_func() is interrupted
809 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 while (1) {
811 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 Py_END_ALLOW_THREADS
814
815 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 /* sock_func() succeeded */
817 if (err)
818 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200819 return 0;
820 }
821
Victor Stinner81c41db2015-04-02 11:50:57 +0200822 if (err)
823 *err = GET_SOCK_ERROR;
824
Victor Stinner31bf2d52015-04-01 21:57:09 +0200825 if (!CHECK_ERRNO(EINTR))
826 break;
827
Victor Stinner81c41db2015-04-02 11:50:57 +0200828 /* sock_func() was interrupted by a signal */
829 if (PyErr_CheckSignals()) {
830 if (err)
831 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200832 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200836 }
837
838 if (s->sock_timeout > 0
839 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200841
842 For example, select() could indicate a socket is ready for
843 reading, but the data then discarded by the OS because of a
844 wrong checksum.
845
846 Loop on select() to recheck for socket readyness. */
847 continue;
848 }
849
Victor Stinner81c41db2015-04-02 11:50:57 +0200850 /* sock_func() failed */
851 if (!err)
852 s->errorhandler();
853 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000854 return -1;
855 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000857
Victor Stinner81c41db2015-04-02 11:50:57 +0200858static int
859sock_call(PySocketSockObject *s,
860 int writing,
861 int (*func) (PySocketSockObject *s, void *data),
862 void *data)
863{
Victor Stinner8912d142015-04-06 23:16:34 +0200864 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200865}
866
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000867
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000868/* Initialize a new socket object. */
869
Victor Stinner88ed6402015-04-09 10:23:12 +0200870/* Default timeout for new sockets */
871static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000872
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200873static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000874init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 s->sock_fd = fd;
878 s->sock_family = family;
879 s->sock_type = type;
880 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000883#ifdef SOCK_NONBLOCK
884 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100885 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000886 else
887#endif
888 {
889 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200890 if (defaulttimeout >= 0) {
891 if (internal_setblocking(s, 0) == -1) {
892 return -1;
893 }
894 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000895 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200896 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000897}
898
899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Create a new socket object.
901 This just creates the object and initializes it.
902 If the creation fails, return NULL and set an exception (implicit
903 in NEWOBJ()). */
904
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000906new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 PySocketSockObject *s;
909 s = (PySocketSockObject *)
910 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200911 if (s == NULL)
912 return NULL;
913 if (init_sockobject(s, fd, family, type, proto) == -1) {
914 Py_DECREF(s);
915 return NULL;
916 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918}
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920
Guido van Rossum48a680c2001-03-02 06:34:14 +0000921/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000922 thread to be in gethostbyname or getaddrinfo */
923#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200924static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000925#endif
926
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928/* Convert a string specifying a host name or one of a few symbolic
929 names to a numeric IP address. This usually calls gethostbyname()
930 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932 an error occurred; then an exception is raised. */
933
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000934static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200935setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 struct addrinfo hints, *res;
938 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
941 if (name[0] == '\0') {
942 int siz;
943 memset(&hints, 0, sizeof(hints));
944 hints.ai_family = af;
945 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
946 hints.ai_flags = AI_PASSIVE;
947 Py_BEGIN_ALLOW_THREADS
948 ACQUIRE_GETADDRINFO_LOCK
949 error = getaddrinfo(NULL, "0", &hints, &res);
950 Py_END_ALLOW_THREADS
951 /* We assume that those thread-unsafe getaddrinfo() versions
952 *are* safe regarding their return value, ie. that a
953 subsequent call to getaddrinfo() does not destroy the
954 outcome of the first call. */
955 RELEASE_GETADDRINFO_LOCK
956 if (error) {
957 set_gaierror(error);
958 return -1;
959 }
960 switch (res->ai_family) {
961 case AF_INET:
962 siz = 4;
963 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000964#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case AF_INET6:
966 siz = 16;
967 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 default:
970 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200971 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 "unsupported address family");
973 return -1;
974 }
975 if (res->ai_next) {
976 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200977 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 "wildcard resolved to multiple address");
979 return -1;
980 }
981 if (res->ai_addrlen < addr_ret_size)
982 addr_ret_size = res->ai_addrlen;
983 memcpy(addr_ret, res->ai_addr, addr_ret_size);
984 freeaddrinfo(res);
985 return siz;
986 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200987 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100988 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200989 if (strcmp(name, "255.255.255.255") == 0 ||
990 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 struct sockaddr_in *sin;
992 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200993 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 "address family mismatched");
995 return -1;
996 }
997 sin = (struct sockaddr_in *)addr_ret;
998 memset((void *) sin, '\0', sizeof(*sin));
999 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001000#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 sin->sin_addr.s_addr = INADDR_BROADCAST;
1004 return sizeof(sin->sin_addr);
1005 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001006
1007 /* avoid a name resolution in case of numeric address */
1008#ifdef HAVE_INET_PTON
1009 /* check for an IPv4 address */
1010 if (af == AF_UNSPEC || af == AF_INET) {
1011 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1012 memset(sin, 0, sizeof(*sin));
1013 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1014 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001015#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001016 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001017#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001018 return 4;
1019 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001021#ifdef ENABLE_IPV6
1022 /* check for an IPv6 address - if the address contains a scope ID, we
1023 * fallback to getaddrinfo(), which can handle translation from interface
1024 * name to interface index */
1025 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1026 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1027 memset(sin, 0, sizeof(*sin));
1028 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1029 sin->sin6_family = AF_INET6;
1030#ifdef HAVE_SOCKADDR_SA_LEN
1031 sin->sin6_len = sizeof(*sin);
1032#endif
1033 return 16;
1034 }
1035 }
1036#endif /* ENABLE_IPV6 */
1037#else /* HAVE_INET_PTON */
1038 /* check for an IPv4 address */
1039 if (af == AF_INET || af == AF_UNSPEC) {
1040 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1041 memset(sin, 0, sizeof(*sin));
1042 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1043 sin->sin_family = AF_INET;
1044#ifdef HAVE_SOCKADDR_SA_LEN
1045 sin->sin_len = sizeof(*sin);
1046#endif
1047 return 4;
1048 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001049 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001050#endif /* HAVE_INET_PTON */
1051
1052 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 memset(&hints, 0, sizeof(hints));
1054 hints.ai_family = af;
1055 Py_BEGIN_ALLOW_THREADS
1056 ACQUIRE_GETADDRINFO_LOCK
1057 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001058#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (error == EAI_NONAME && af == AF_UNSPEC) {
1060 /* On Tru64 V5.1, numeric-to-addr conversion fails
1061 if no address family is given. Assume IPv4 for now.*/
1062 hints.ai_family = AF_INET;
1063 error = getaddrinfo(name, NULL, &hints, &res);
1064 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 Py_END_ALLOW_THREADS
1067 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1068 if (error) {
1069 set_gaierror(error);
1070 return -1;
1071 }
1072 if (res->ai_addrlen < addr_ret_size)
1073 addr_ret_size = res->ai_addrlen;
1074 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1075 freeaddrinfo(res);
1076 switch (addr_ret->sa_family) {
1077 case AF_INET:
1078 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001079#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 case AF_INET6:
1081 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001084 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 return -1;
1086 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001087}
1088
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090/* Create a string object representing an IP address.
1091 This is always a string of the form 'dd.dd.dd.dd' (with variable
1092 size numbers). */
1093
Guido van Rossum73624e91994-10-10 17:59:00 +00001094static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001095makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 char buf[NI_MAXHOST];
1098 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1101 NI_NUMERICHOST);
1102 if (error) {
1103 set_gaierror(error);
1104 return NULL;
1105 }
1106 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107}
1108
1109
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001110#ifdef USE_BLUETOOTH
1111/* Convert a string representation of a Bluetooth address into a numeric
1112 address. Returns the length (6), or raises an exception and returns -1 if
1113 an error occurred. */
1114
1115static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001116setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 unsigned int b0, b1, b2, b3, b4, b5;
1119 char ch;
1120 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1123 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1124 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1125 bdaddr->b[0] = b0;
1126 bdaddr->b[1] = b1;
1127 bdaddr->b[2] = b2;
1128 bdaddr->b[3] = b3;
1129 bdaddr->b[4] = b4;
1130 bdaddr->b[5] = b5;
1131 return 6;
1132 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001133 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 return -1;
1135 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001136}
1137
1138/* Create a string representation of the Bluetooth address. This is always a
1139 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1140 value (zero padded if necessary). */
1141
1142static PyObject *
1143makebdaddr(bdaddr_t *bdaddr)
1144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1148 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1149 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1150 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001151}
1152#endif
1153
1154
Guido van Rossum30a685f1991-06-27 15:51:29 +00001155/* Create an object representing the given socket address,
1156 suitable for passing it back to bind(), connect() etc.
1157 The family field of the sockaddr structure is inspected
1158 to determine what kind of address it really is. */
1159
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001160/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001161static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001162makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 if (addrlen == 0) {
1165 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001166 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 case AF_INET:
1172 {
1173 struct sockaddr_in *a;
1174 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1175 PyObject *ret = NULL;
1176 if (addrobj) {
1177 a = (struct sockaddr_in *)addr;
1178 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1179 Py_DECREF(addrobj);
1180 }
1181 return ret;
1182 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001183
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001184#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 case AF_UNIX:
1186 {
1187 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001188#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001189 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1190 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1191 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 }
1193 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001194#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 {
1196 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001197 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 }
1199 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001200#endif /* AF_UNIX */
1201
Martin v. Löwis11017b12006-01-14 18:12:57 +00001202#if defined(AF_NETLINK)
1203 case AF_NETLINK:
1204 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1206 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001207 }
1208#endif /* AF_NETLINK */
1209
caaveryeffc12f2017-09-06 18:18:10 -04001210#if defined(AF_VSOCK)
1211 case AF_VSOCK:
1212 {
1213 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1214 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1215 }
1216#endif /* AF_VSOCK */
1217
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001218#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 case AF_INET6:
1220 {
1221 struct sockaddr_in6 *a;
1222 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1223 PyObject *ret = NULL;
1224 if (addrobj) {
1225 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001226 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 addrobj,
1228 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001229 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 a->sin6_scope_id);
1231 Py_DECREF(addrobj);
1232 }
1233 return ret;
1234 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001235#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001237#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 case AF_BLUETOOTH:
1239 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 case BTPROTO_L2CAP:
1242 {
1243 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1244 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1245 PyObject *ret = NULL;
1246 if (addrobj) {
1247 ret = Py_BuildValue("Oi",
1248 addrobj,
1249 _BT_L2_MEMB(a, psm));
1250 Py_DECREF(addrobj);
1251 }
1252 return ret;
1253 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 case BTPROTO_RFCOMM:
1256 {
1257 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1258 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1259 PyObject *ret = NULL;
1260 if (addrobj) {
1261 ret = Py_BuildValue("Oi",
1262 addrobj,
1263 _BT_RC_MEMB(a, channel));
1264 Py_DECREF(addrobj);
1265 }
1266 return ret;
1267 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 case BTPROTO_HCI:
1270 {
1271 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001272#if defined(__NetBSD__) || defined(__DragonFly__)
1273 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1274#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 PyObject *ret = NULL;
1276 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1277 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001280
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001281#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 case BTPROTO_SCO:
1283 {
1284 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1285 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1286 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001287#endif
1288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 default:
1290 PyErr_SetString(PyExc_ValueError,
1291 "Unknown Bluetooth protocol");
1292 return NULL;
1293 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001294#endif
1295
Antoine Pitroub156a462010-10-27 20:13:57 +00001296#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 case AF_PACKET:
1298 {
1299 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1300 char *ifname = "";
1301 struct ifreq ifr;
1302 /* need to look up interface name give index */
1303 if (a->sll_ifindex) {
1304 ifr.ifr_ifindex = a->sll_ifindex;
1305 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1306 ifname = ifr.ifr_name;
1307 }
1308 return Py_BuildValue("shbhy#",
1309 ifname,
1310 ntohs(a->sll_protocol),
1311 a->sll_pkttype,
1312 a->sll_hatype,
1313 a->sll_addr,
1314 a->sll_halen);
1315 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001316#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001317
Christian Heimes043d6f62008-01-07 17:19:16 +00001318#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 case AF_TIPC:
1320 {
1321 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1322 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1323 return Py_BuildValue("IIIII",
1324 a->addrtype,
1325 a->addr.nameseq.type,
1326 a->addr.nameseq.lower,
1327 a->addr.nameseq.upper,
1328 a->scope);
1329 } else if (a->addrtype == TIPC_ADDR_NAME) {
1330 return Py_BuildValue("IIIII",
1331 a->addrtype,
1332 a->addr.name.name.type,
1333 a->addr.name.name.instance,
1334 a->addr.name.name.instance,
1335 a->scope);
1336 } else if (a->addrtype == TIPC_ADDR_ID) {
1337 return Py_BuildValue("IIIII",
1338 a->addrtype,
1339 a->addr.id.node,
1340 a->addr.id.ref,
1341 0,
1342 a->scope);
1343 } else {
1344 PyErr_SetString(PyExc_ValueError,
1345 "Invalid address type");
1346 return NULL;
1347 }
1348 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001349#endif
1350
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001351#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001352 case AF_CAN:
1353 {
1354 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1355 char *ifname = "";
1356 struct ifreq ifr;
1357 /* need to look up interface name given index */
1358 if (a->can_ifindex) {
1359 ifr.ifr_ifindex = a->can_ifindex;
1360 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1361 ifname = ifr.ifr_name;
1362 }
1363
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001364 switch (proto) {
1365#ifdef CAN_ISOTP
1366 case CAN_ISOTP:
1367 {
1368 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1369 ifname,
1370 a->can_addr.tp.rx_id,
1371 a->can_addr.tp.tx_id);
1372 }
1373#endif
1374 default:
1375 {
1376 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1377 ifname);
1378 }
1379 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001380 }
1381#endif
1382
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001383#ifdef PF_SYSTEM
1384 case PF_SYSTEM:
1385 switch(proto) {
1386#ifdef SYSPROTO_CONTROL
1387 case SYSPROTO_CONTROL:
1388 {
1389 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1390 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1391 }
1392#endif
1393 default:
1394 PyErr_SetString(PyExc_ValueError,
1395 "Invalid address type");
1396 return 0;
1397 }
1398#endif
1399
Christian Heimesdffa3942016-09-05 23:54:41 +02001400#ifdef HAVE_SOCKADDR_ALG
1401 case AF_ALG:
1402 {
1403 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1404 return Py_BuildValue("s#s#HH",
1405 a->salg_type,
1406 strnlen((const char*)a->salg_type,
1407 sizeof(a->salg_type)),
1408 a->salg_name,
1409 strnlen((const char*)a->salg_name,
1410 sizeof(a->salg_name)),
1411 a->salg_feat,
1412 a->salg_mask);
1413 }
1414#endif
1415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 default:
1419 /* If we don't know the address family, don't raise an
1420 exception -- return it as an (int, bytes) tuple. */
1421 return Py_BuildValue("iy#",
1422 addr->sa_family,
1423 addr->sa_data,
1424 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001427}
1428
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001429/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1430 (in particular, numeric IP addresses). */
1431struct maybe_idna {
1432 PyObject *obj;
1433 char *buf;
1434};
1435
1436static void
1437idna_cleanup(struct maybe_idna *data)
1438{
1439 Py_CLEAR(data->obj);
1440}
1441
1442static int
1443idna_converter(PyObject *obj, struct maybe_idna *data)
1444{
1445 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001446 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001447 if (obj == NULL) {
1448 idna_cleanup(data);
1449 return 1;
1450 }
1451 data->obj = NULL;
1452 len = -1;
1453 if (PyBytes_Check(obj)) {
1454 data->buf = PyBytes_AsString(obj);
1455 len = PyBytes_Size(obj);
1456 }
1457 else if (PyByteArray_Check(obj)) {
1458 data->buf = PyByteArray_AsString(obj);
1459 len = PyByteArray_Size(obj);
1460 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001461 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001462 if (PyUnicode_READY(obj) == -1) {
1463 return 0;
1464 }
1465 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001466 data->buf = PyUnicode_DATA(obj);
1467 len = PyUnicode_GET_LENGTH(obj);
1468 }
1469 else {
1470 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1471 if (!obj2) {
1472 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1473 return 0;
1474 }
1475 assert(PyBytes_Check(obj2));
1476 data->obj = obj2;
1477 data->buf = PyBytes_AS_STRING(obj2);
1478 len = PyBytes_GET_SIZE(obj2);
1479 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001480 }
1481 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001482 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1483 obj->ob_type->tp_name);
1484 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001485 }
1486 if (strlen(data->buf) != len) {
1487 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001488 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001489 return 0;
1490 }
1491 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001492}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001493
1494/* Parse a socket address argument according to the socket object's
1495 address family. Return 1 if the address was in the proper format,
1496 0 of not. The address is returned through addr_ret, its length
1497 through len_ret. */
1498
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001499static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001500getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001504
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001505#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 case AF_UNIX:
1507 {
1508 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001509 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001510 int retval = 0;
1511
1512 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1513 allow embedded nulls on Linux. */
1514 if (PyUnicode_Check(args)) {
1515 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1516 return 0;
1517 }
1518 else
1519 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001520 if (!PyArg_Parse(args, "y*", &path)) {
1521 Py_DECREF(args);
1522 return retval;
1523 }
1524 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001527#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001528 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001530 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001531 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001533 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 }
1535 }
1536 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001537#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 {
1539 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001540 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001541 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001543 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001545 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 }
1547 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001548 memcpy(addr->sun_path, path.buf, path.len);
1549 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001550 retval = 1;
1551 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001552 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001553 Py_DECREF(args);
1554 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001556#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557
Martin v. Löwis11017b12006-01-14 18:12:57 +00001558#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 case AF_NETLINK:
1560 {
1561 struct sockaddr_nl* addr;
1562 int pid, groups;
1563 addr = (struct sockaddr_nl *)addr_ret;
1564 if (!PyTuple_Check(args)) {
1565 PyErr_Format(
1566 PyExc_TypeError,
1567 "getsockaddrarg: "
1568 "AF_NETLINK address must be tuple, not %.500s",
1569 Py_TYPE(args)->tp_name);
1570 return 0;
1571 }
1572 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1573 return 0;
1574 addr->nl_family = AF_NETLINK;
1575 addr->nl_pid = pid;
1576 addr->nl_groups = groups;
1577 *len_ret = sizeof(*addr);
1578 return 1;
1579 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001580#endif
1581
caaveryeffc12f2017-09-06 18:18:10 -04001582#if defined(AF_VSOCK)
1583 case AF_VSOCK:
1584 {
1585 struct sockaddr_vm* addr;
1586 int port, cid;
1587 addr = (struct sockaddr_vm *)addr_ret;
1588 memset(addr, 0, sizeof(struct sockaddr_vm));
1589 if (!PyTuple_Check(args)) {
1590 PyErr_Format(
1591 PyExc_TypeError,
1592 "getsockaddrarg: "
1593 "AF_VSOCK address must be tuple, not %.500s",
1594 Py_TYPE(args)->tp_name);
1595 return 0;
1596 }
1597 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1598 return 0;
1599 addr->svm_family = s->sock_family;
1600 addr->svm_port = port;
1601 addr->svm_cid = cid;
1602 *len_ret = sizeof(*addr);
1603 return 1;
1604 }
1605#endif
1606
1607
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001608#ifdef AF_RDS
1609 case AF_RDS:
1610 /* RDS sockets use sockaddr_in: fall-through */
1611#endif
1612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 case AF_INET:
1614 {
1615 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001616 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 int port, result;
1618 if (!PyTuple_Check(args)) {
1619 PyErr_Format(
1620 PyExc_TypeError,
1621 "getsockaddrarg: "
1622 "AF_INET address must be tuple, not %.500s",
1623 Py_TYPE(args)->tp_name);
1624 return 0;
1625 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001626 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1627 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 return 0;
1629 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001630 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001632 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 if (result < 0)
1634 return 0;
1635 if (port < 0 || port > 0xffff) {
1636 PyErr_SetString(
1637 PyExc_OverflowError,
1638 "getsockaddrarg: port must be 0-65535.");
1639 return 0;
1640 }
1641 addr->sin_family = AF_INET;
1642 addr->sin_port = htons((short)port);
1643 *len_ret = sizeof *addr;
1644 return 1;
1645 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001647#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 case AF_INET6:
1649 {
1650 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001651 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001652 int port, result;
1653 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 flowinfo = scope_id = 0;
1655 if (!PyTuple_Check(args)) {
1656 PyErr_Format(
1657 PyExc_TypeError,
1658 "getsockaddrarg: "
1659 "AF_INET6 address must be tuple, not %.500s",
1660 Py_TYPE(args)->tp_name);
1661 return 0;
1662 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001663 if (!PyArg_ParseTuple(args, "O&i|II",
1664 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 &scope_id)) {
1666 return 0;
1667 }
1668 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001669 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001671 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 if (result < 0)
1673 return 0;
1674 if (port < 0 || port > 0xffff) {
1675 PyErr_SetString(
1676 PyExc_OverflowError,
1677 "getsockaddrarg: port must be 0-65535.");
1678 return 0;
1679 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001680 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001681 PyErr_SetString(
1682 PyExc_OverflowError,
1683 "getsockaddrarg: flowinfo must be 0-1048575.");
1684 return 0;
1685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 addr->sin6_family = s->sock_family;
1687 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001688 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 addr->sin6_scope_id = scope_id;
1690 *len_ret = sizeof *addr;
1691 return 1;
1692 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001693#endif
1694
Hye-Shik Chang81268602004-02-02 06:05:24 +00001695#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 case AF_BLUETOOTH:
1697 {
1698 switch (s->sock_proto) {
1699 case BTPROTO_L2CAP:
1700 {
1701 struct sockaddr_l2 *addr;
1702 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 addr = (struct sockaddr_l2 *)addr_ret;
1705 memset(addr, 0, sizeof(struct sockaddr_l2));
1706 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1707 if (!PyArg_ParseTuple(args, "si", &straddr,
1708 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001709 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 "wrong format");
1711 return 0;
1712 }
1713 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1714 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 *len_ret = sizeof *addr;
1717 return 1;
1718 }
1719 case BTPROTO_RFCOMM:
1720 {
1721 struct sockaddr_rc *addr;
1722 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 addr = (struct sockaddr_rc *)addr_ret;
1725 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1726 if (!PyArg_ParseTuple(args, "si", &straddr,
1727 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001728 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 "wrong format");
1730 return 0;
1731 }
1732 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1733 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 *len_ret = sizeof *addr;
1736 return 1;
1737 }
1738 case BTPROTO_HCI:
1739 {
1740 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001741#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001742 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001743
Alexander Belopolskye239d232010-12-08 23:31:48 +00001744 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001745 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001746 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001747 "wrong format");
1748 return 0;
1749 }
1750 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1751 return 0;
1752#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1754 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001755 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 "wrong format");
1757 return 0;
1758 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 *len_ret = sizeof *addr;
1761 return 1;
1762 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001763#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case BTPROTO_SCO:
1765 {
1766 struct sockaddr_sco *addr;
1767 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 addr = (struct sockaddr_sco *)addr_ret;
1770 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1771 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001772 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 "wrong format");
1774 return 0;
1775 }
1776 straddr = PyBytes_AS_STRING(args);
1777 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1778 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 *len_ret = sizeof *addr;
1781 return 1;
1782 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001785 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 return 0;
1787 }
1788 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001789#endif
1790
Antoine Pitroub156a462010-10-27 20:13:57 +00001791#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 case AF_PACKET:
1793 {
1794 struct sockaddr_ll* addr;
1795 struct ifreq ifr;
1796 char *interfaceName;
1797 int protoNumber;
1798 int hatype = 0;
1799 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001800 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 if (!PyTuple_Check(args)) {
1803 PyErr_Format(
1804 PyExc_TypeError,
1805 "getsockaddrarg: "
1806 "AF_PACKET address must be tuple, not %.500s",
1807 Py_TYPE(args)->tp_name);
1808 return 0;
1809 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001810 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001812 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 return 0;
1814 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1815 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1816 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1817 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return 0;
1820 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001821 if (haddr.buf && haddr.len > 8) {
1822 PyErr_SetString(PyExc_ValueError,
1823 "Hardware address must be 8 bytes or less");
1824 PyBuffer_Release(&haddr);
1825 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 }
1827 if (protoNumber < 0 || protoNumber > 0xffff) {
1828 PyErr_SetString(
1829 PyExc_OverflowError,
1830 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001831 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 return 0;
1833 }
1834 addr = (struct sockaddr_ll*)addr_ret;
1835 addr->sll_family = AF_PACKET;
1836 addr->sll_protocol = htons((short)protoNumber);
1837 addr->sll_ifindex = ifr.ifr_ifindex;
1838 addr->sll_pkttype = pkttype;
1839 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001840 if (haddr.buf) {
1841 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1842 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001844 else
1845 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001847 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 return 1;
1849 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850#endif
1851
Christian Heimes043d6f62008-01-07 17:19:16 +00001852#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 case AF_TIPC:
1854 {
1855 unsigned int atype, v1, v2, v3;
1856 unsigned int scope = TIPC_CLUSTER_SCOPE;
1857 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (!PyTuple_Check(args)) {
1860 PyErr_Format(
1861 PyExc_TypeError,
1862 "getsockaddrarg: "
1863 "AF_TIPC address must be tuple, not %.500s",
1864 Py_TYPE(args)->tp_name);
1865 return 0;
1866 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (!PyArg_ParseTuple(args,
1869 "IIII|I;Invalid TIPC address format",
1870 &atype, &v1, &v2, &v3, &scope))
1871 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 addr = (struct sockaddr_tipc *) addr_ret;
1874 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 addr->family = AF_TIPC;
1877 addr->scope = scope;
1878 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 if (atype == TIPC_ADDR_NAMESEQ) {
1881 addr->addr.nameseq.type = v1;
1882 addr->addr.nameseq.lower = v2;
1883 addr->addr.nameseq.upper = v3;
1884 } else if (atype == TIPC_ADDR_NAME) {
1885 addr->addr.name.name.type = v1;
1886 addr->addr.name.name.instance = v2;
1887 } else if (atype == TIPC_ADDR_ID) {
1888 addr->addr.id.node = v1;
1889 addr->addr.id.ref = v2;
1890 } else {
1891 /* Shouldn't happen */
1892 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1893 return 0;
1894 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 return 1;
1899 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001900#endif
1901
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001902#ifdef AF_CAN
1903
1904#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001905 case AF_CAN:
1906 switch (s->sock_proto) {
1907 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001908 /* fall-through */
1909 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001910 {
1911 struct sockaddr_can *addr;
1912 PyObject *interfaceName;
1913 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001914 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001915 addr = (struct sockaddr_can *)addr_ret;
1916
Charles-François Natali47413c12011-10-06 19:47:44 +02001917 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1918 &interfaceName))
1919 return 0;
1920
1921 len = PyBytes_GET_SIZE(interfaceName);
1922
1923 if (len == 0) {
1924 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001925 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001926 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1927 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001928 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1929 s->errorhandler();
1930 Py_DECREF(interfaceName);
1931 return 0;
1932 }
1933 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001934 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001935 "AF_CAN interface name too long");
1936 Py_DECREF(interfaceName);
1937 return 0;
1938 }
1939
1940 addr->can_family = AF_CAN;
1941 addr->can_ifindex = ifr.ifr_ifindex;
1942
1943 *len_ret = sizeof(*addr);
1944 Py_DECREF(interfaceName);
1945 return 1;
1946 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001947#endif
1948
1949#ifdef CAN_ISOTP
1950 case CAN_ISOTP:
1951 {
1952 struct sockaddr_can *addr;
1953 PyObject *interfaceName;
1954 struct ifreq ifr;
1955 Py_ssize_t len;
1956 unsigned long int rx_id, tx_id;
1957
1958 addr = (struct sockaddr_can *)addr_ret;
1959
1960 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1961 &interfaceName,
1962 &rx_id,
1963 &tx_id))
1964 return 0;
1965
1966 len = PyBytes_GET_SIZE(interfaceName);
1967
1968 if (len == 0) {
1969 ifr.ifr_ifindex = 0;
1970 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1971 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1972 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1973 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1974 s->errorhandler();
1975 Py_DECREF(interfaceName);
1976 return 0;
1977 }
1978 } else {
1979 PyErr_SetString(PyExc_OSError,
1980 "AF_CAN interface name too long");
1981 Py_DECREF(interfaceName);
1982 return 0;
1983 }
1984
1985 addr->can_family = AF_CAN;
1986 addr->can_ifindex = ifr.ifr_ifindex;
1987 addr->can_addr.tp.rx_id = rx_id;
1988 addr->can_addr.tp.tx_id = tx_id;
1989
1990 *len_ret = sizeof(*addr);
1991 Py_DECREF(interfaceName);
1992 return 1;
1993 }
1994#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001995 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001996 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001997 "getsockaddrarg: unsupported CAN protocol");
1998 return 0;
1999 }
2000#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002001
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002002#ifdef PF_SYSTEM
2003 case PF_SYSTEM:
2004 switch (s->sock_proto) {
2005#ifdef SYSPROTO_CONTROL
2006 case SYSPROTO_CONTROL:
2007 {
2008 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002009
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002010 addr = (struct sockaddr_ctl *)addr_ret;
2011 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002012 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002013
2014 if (PyUnicode_Check(args)) {
2015 struct ctl_info info;
2016 PyObject *ctl_name;
2017
2018 if (!PyArg_Parse(args, "O&",
2019 PyUnicode_FSConverter, &ctl_name)) {
2020 return 0;
2021 }
2022
Victor Stinnerf50e1872015-03-20 11:32:24 +01002023 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002024 PyErr_SetString(PyExc_ValueError,
2025 "provided string is too long");
2026 Py_DECREF(ctl_name);
2027 return 0;
2028 }
2029 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2030 sizeof(info.ctl_name));
2031 Py_DECREF(ctl_name);
2032
2033 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2034 PyErr_SetString(PyExc_OSError,
2035 "cannot find kernel control with provided name");
2036 return 0;
2037 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002038
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002039 addr->sc_id = info.ctl_id;
2040 addr->sc_unit = 0;
2041 } else if (!PyArg_ParseTuple(args, "II",
2042 &(addr->sc_id), &(addr->sc_unit))) {
2043 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2044 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002045
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002046 return 0;
2047 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002048
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002049 *len_ret = sizeof(*addr);
2050 return 1;
2051 }
2052#endif
2053 default:
2054 PyErr_SetString(PyExc_OSError,
2055 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2056 return 0;
2057 }
2058#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002059#ifdef HAVE_SOCKADDR_ALG
2060 case AF_ALG:
2061 {
2062 struct sockaddr_alg *sa;
2063 char *type;
2064 char *name;
2065 sa = (struct sockaddr_alg *)addr_ret;
2066
2067 memset(sa, 0, sizeof(*sa));
2068 sa->salg_family = AF_ALG;
2069
2070 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2071 &type, &name, &sa->salg_feat, &sa->salg_mask))
2072 return 0;
2073 /* sockaddr_alg has fixed-sized char arrays for type and name */
2074 if (strlen(type) > sizeof(sa->salg_type)) {
2075 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2076 return 0;
2077 }
2078 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2079 if (strlen(name) > sizeof(sa->salg_name)) {
2080 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2081 return 0;
2082 }
2083 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2084
2085 *len_ret = sizeof(*sa);
2086 return 1;
2087 }
2088#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002093 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002097}
2098
Guido van Rossum30a685f1991-06-27 15:51:29 +00002099
Guido van Rossum48a680c2001-03-02 06:34:14 +00002100/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002101 Return 1 if the family is known, 0 otherwise. The length is returned
2102 through len_ret. */
2103
2104static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002105getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002108
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002109#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 case AF_UNIX:
2111 {
2112 *len_ret = sizeof (struct sockaddr_un);
2113 return 1;
2114 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002115#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002116
Martin v. Löwis11017b12006-01-14 18:12:57 +00002117#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002118 case AF_NETLINK:
2119 {
2120 *len_ret = sizeof (struct sockaddr_nl);
2121 return 1;
2122 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002123#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002124
caaveryeffc12f2017-09-06 18:18:10 -04002125#if defined(AF_VSOCK)
2126 case AF_VSOCK:
2127 {
2128 *len_ret = sizeof (struct sockaddr_vm);
2129 return 1;
2130 }
2131#endif
2132
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002133#ifdef AF_RDS
2134 case AF_RDS:
2135 /* RDS sockets use sockaddr_in: fall-through */
2136#endif
2137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 case AF_INET:
2139 {
2140 *len_ret = sizeof (struct sockaddr_in);
2141 return 1;
2142 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002143
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002144#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 case AF_INET6:
2146 {
2147 *len_ret = sizeof (struct sockaddr_in6);
2148 return 1;
2149 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002150#endif
2151
Hye-Shik Chang81268602004-02-02 06:05:24 +00002152#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 case AF_BLUETOOTH:
2154 {
2155 switch(s->sock_proto)
2156 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 case BTPROTO_L2CAP:
2159 *len_ret = sizeof (struct sockaddr_l2);
2160 return 1;
2161 case BTPROTO_RFCOMM:
2162 *len_ret = sizeof (struct sockaddr_rc);
2163 return 1;
2164 case BTPROTO_HCI:
2165 *len_ret = sizeof (struct sockaddr_hci);
2166 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002167#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 case BTPROTO_SCO:
2169 *len_ret = sizeof (struct sockaddr_sco);
2170 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002173 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 "unknown BT protocol");
2175 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 }
2178 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002179#endif
2180
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002181#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 case AF_PACKET:
2183 {
2184 *len_ret = sizeof (struct sockaddr_ll);
2185 return 1;
2186 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002187#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002188
Christian Heimes043d6f62008-01-07 17:19:16 +00002189#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 case AF_TIPC:
2191 {
2192 *len_ret = sizeof (struct sockaddr_tipc);
2193 return 1;
2194 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002195#endif
2196
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002197#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002198 case AF_CAN:
2199 {
2200 *len_ret = sizeof (struct sockaddr_can);
2201 return 1;
2202 }
2203#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002204
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002205#ifdef PF_SYSTEM
2206 case PF_SYSTEM:
2207 switch(s->sock_proto) {
2208#ifdef SYSPROTO_CONTROL
2209 case SYSPROTO_CONTROL:
2210 *len_ret = sizeof (struct sockaddr_ctl);
2211 return 1;
2212#endif
2213 default:
2214 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2215 "unknown PF_SYSTEM protocol");
2216 return 0;
2217 }
2218#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002219#ifdef HAVE_SOCKADDR_ALG
2220 case AF_ALG:
2221 {
2222 *len_ret = sizeof (struct sockaddr_alg);
2223 return 1;
2224 }
2225#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002230 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002234}
2235
2236
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002237/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2238 Currently, these methods are only compiled if the RFC 2292/3542
2239 CMSG_LEN() macro is available. Older systems seem to have used
2240 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2241 it may be possible to define CMSG_LEN() that way if it's not
2242 provided. Some architectures might need extra padding after the
2243 cmsghdr, however, and CMSG_LEN() would have to take account of
2244 this. */
2245#ifdef CMSG_LEN
2246/* If length is in range, set *result to CMSG_LEN(length) and return
2247 true; otherwise, return false. */
2248static int
2249get_CMSG_LEN(size_t length, size_t *result)
2250{
2251 size_t tmp;
2252
2253 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2254 return 0;
2255 tmp = CMSG_LEN(length);
2256 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2257 return 0;
2258 *result = tmp;
2259 return 1;
2260}
2261
2262#ifdef CMSG_SPACE
2263/* If length is in range, set *result to CMSG_SPACE(length) and return
2264 true; otherwise, return false. */
2265static int
2266get_CMSG_SPACE(size_t length, size_t *result)
2267{
2268 size_t tmp;
2269
2270 /* Use CMSG_SPACE(1) here in order to take account of the padding
2271 necessary before *and* after the data. */
2272 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2273 return 0;
2274 tmp = CMSG_SPACE(length);
2275 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2276 return 0;
2277 *result = tmp;
2278 return 1;
2279}
2280#endif
2281
2282/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2283 pointer in msg->msg_control with at least "space" bytes after it,
2284 and its cmsg_len member inside the buffer. */
2285static int
2286cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2287{
2288 size_t cmsg_offset;
2289 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2290 sizeof(cmsgh->cmsg_len));
2291
Charles-François Natali466517d2011-08-28 18:23:43 +02002292 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002293 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002294 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002295 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2296 annoying under OS X as it's unsigned there and so it triggers a
2297 tautological comparison warning under Clang when compared against 0.
2298 Since the check is valid on other platforms, silence the warning under
2299 Clang. */
2300 #ifdef __clang__
2301 #pragma clang diagnostic push
2302 #pragma clang diagnostic ignored "-Wtautological-compare"
2303 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002304 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002305 #pragma GCC diagnostic push
2306 #pragma GCC diagnostic ignored "-Wtype-limits"
2307 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002308 if (msg->msg_controllen < 0)
2309 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002310 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002311 #pragma GCC diagnostic pop
2312 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002313 #ifdef __clang__
2314 #pragma clang diagnostic pop
2315 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002316 if (space < cmsg_len_end)
2317 space = cmsg_len_end;
2318 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2319 return (cmsg_offset <= (size_t)-1 - space &&
2320 cmsg_offset + space <= msg->msg_controllen);
2321}
2322
2323/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2324 *space to number of bytes following it in the buffer and return
2325 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2326 msg->msg_controllen are valid. */
2327static int
2328get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2329{
2330 size_t data_offset;
2331 char *data_ptr;
2332
2333 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2334 return 0;
2335 data_offset = data_ptr - (char *)msg->msg_control;
2336 if (data_offset > msg->msg_controllen)
2337 return 0;
2338 *space = msg->msg_controllen - data_offset;
2339 return 1;
2340}
2341
2342/* If cmsgh is invalid or not contained in the buffer pointed to by
2343 msg->msg_control, return -1. If cmsgh is valid and its associated
2344 data is entirely contained in the buffer, set *data_len to the
2345 length of the associated data and return 0. If only part of the
2346 associated data is contained in the buffer but cmsgh is otherwise
2347 valid, set *data_len to the length contained in the buffer and
2348 return 1. */
2349static int
2350get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2351{
2352 size_t space, cmsg_data_len;
2353
2354 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2355 cmsgh->cmsg_len < CMSG_LEN(0))
2356 return -1;
2357 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2358 if (!get_cmsg_data_space(msg, cmsgh, &space))
2359 return -1;
2360 if (space >= cmsg_data_len) {
2361 *data_len = cmsg_data_len;
2362 return 0;
2363 }
2364 *data_len = space;
2365 return 1;
2366}
2367#endif /* CMSG_LEN */
2368
2369
Victor Stinner31bf2d52015-04-01 21:57:09 +02002370struct sock_accept {
2371 socklen_t *addrlen;
2372 sock_addr_t *addrbuf;
2373 SOCKET_T result;
2374};
2375
2376#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2377/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2378static int accept4_works = -1;
2379#endif
2380
2381static int
2382sock_accept_impl(PySocketSockObject *s, void *data)
2383{
2384 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002385 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2386 socklen_t *paddrlen = ctx->addrlen;
2387#ifdef HAVE_SOCKADDR_ALG
2388 /* AF_ALG does not support accept() with addr and raises
2389 * ECONNABORTED instead. */
2390 if (s->sock_family == AF_ALG) {
2391 addr = NULL;
2392 paddrlen = NULL;
2393 *ctx->addrlen = 0;
2394 }
2395#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002396
2397#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2398 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002399 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002400 SOCK_CLOEXEC);
2401 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2402 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2403 accept4_works = (errno != ENOSYS);
2404 }
2405 }
2406 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002407 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002408#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002409 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002410#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002411
2412#ifdef MS_WINDOWS
2413 return (ctx->result != INVALID_SOCKET);
2414#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002415 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002416#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002417}
2418
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002419/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002420
Guido van Rossum73624e91994-10-10 17:59:00 +00002421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002422sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002425 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 socklen_t addrlen;
2427 PyObject *sock = NULL;
2428 PyObject *addr = NULL;
2429 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002430 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (!getsockaddrlen(s, &addrlen))
2433 return NULL;
2434 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 if (!IS_SELECTABLE(s))
2437 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002438
Victor Stinner31bf2d52015-04-01 21:57:09 +02002439 ctx.addrlen = &addrlen;
2440 ctx.addrbuf = &addrbuf;
2441 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002443 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002444
Victor Stinnerdaf45552013-08-28 00:53:59 +02002445#ifdef MS_WINDOWS
2446 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2447 PyErr_SetFromWindowsErr(0);
2448 SOCKETCLOSE(newfd);
2449 goto finally;
2450 }
2451#else
2452
2453#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2454 if (!accept4_works)
2455#endif
2456 {
2457 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2458 SOCKETCLOSE(newfd);
2459 goto finally;
2460 }
2461 }
2462#endif
2463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 sock = PyLong_FromSocket_t(newfd);
2465 if (sock == NULL) {
2466 SOCKETCLOSE(newfd);
2467 goto finally;
2468 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2471 addrlen, s->sock_proto);
2472 if (addr == NULL)
2473 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002476
Guido van Rossum67f7a382002-06-06 21:08:16 +00002477finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 Py_XDECREF(sock);
2479 Py_XDECREF(addr);
2480 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002481}
2482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002484"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002486Wait for an incoming connection. Return a new socket file descriptor\n\
2487representing the connection, and the address of the client.\n\
2488For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489
Guido van Rossum11ba0942002-06-13 15:07:44 +00002490/* s.setblocking(flag) method. Argument:
2491 False -- non-blocking mode; same as settimeout(0)
2492 True -- blocking mode; same as settimeout(None)
2493*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002494
Guido van Rossum73624e91994-10-10 17:59:00 +00002495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002496sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002497{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002498 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 block = PyLong_AsLong(arg);
2501 if (block == -1 && PyErr_Occurred())
2502 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002503
Victor Stinner9001d802015-04-06 23:06:01 +02002504 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002505 if (internal_setblocking(s, block) == -1) {
2506 return NULL;
2507 }
2508 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002509}
Guido van Rossume4485b01994-09-07 14:32:49 +00002510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002512"setblocking(flag)\n\
2513\n\
2514Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002515setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002516setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517
Victor Stinner71694d52015-03-28 01:18:54 +01002518static int
2519socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2520{
2521#ifdef MS_WINDOWS
2522 struct timeval tv;
2523#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002524#ifndef HAVE_POLL
2525 _PyTime_t ms;
2526#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002527 int overflow = 0;
2528
2529 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002530 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002531 return 0;
2532 }
2533
Victor Stinner869e1772015-03-30 03:49:14 +02002534 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002535 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002536 return -1;
2537
2538 if (*timeout < 0) {
2539 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2540 return -1;
2541 }
2542
2543#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002544 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002545#endif
2546#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002547 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002548 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002549#endif
2550 if (overflow) {
2551 PyErr_SetString(PyExc_OverflowError,
2552 "timeout doesn't fit into C timeval");
2553 return -1;
2554 }
2555
2556 return 0;
2557}
2558
Guido van Rossum11ba0942002-06-13 15:07:44 +00002559/* s.settimeout(timeout) method. Argument:
2560 None -- no timeout, blocking mode; same as setblocking(True)
2561 0.0 -- non-blocking mode; same as setblocking(False)
2562 > 0 -- timeout mode; operations time out after timeout seconds
2563 < 0 -- illegal; raises an exception
2564*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002567{
Victor Stinner71694d52015-03-28 01:18:54 +01002568 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002569
Victor Stinner71694d52015-03-28 01:18:54 +01002570 if (socket_parse_timeout(&timeout, arg) < 0)
2571 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002574 if (internal_setblocking(s, timeout < 0) == -1) {
2575 return NULL;
2576 }
2577 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002578}
2579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002581"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002582\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002583Set a timeout on socket operations. 'timeout' can be a float,\n\
2584giving in seconds, or None. Setting a timeout of None disables\n\
2585the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002586Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002587
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002588/* s.gettimeout() method.
2589 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002591sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002592{
Victor Stinner71694d52015-03-28 01:18:54 +01002593 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002594 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 }
Victor Stinner71694d52015-03-28 01:18:54 +01002596 else {
2597 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2598 return PyFloat_FromDouble(seconds);
2599 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002600}
2601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002602PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002603"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002605Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002606operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002607operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002608
Guido van Rossumaee08791992-09-08 09:05:33 +00002609/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002610 With an integer third argument, sets an integer optval with optlen=4.
2611 With None as third argument and an integer fourth argument, set
2612 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002613 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002614 use optional built-in module 'struct' to encode the string.
2615*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002616
Guido van Rossum73624e91994-10-10 17:59:00 +00002617static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002618sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 int level;
2621 int optname;
2622 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002623 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002625 unsigned int optlen;
2626 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002627
caaveryeffc12f2017-09-06 18:18:10 -04002628#ifdef AF_VSOCK
2629 if (s->sock_family == AF_VSOCK) {
2630 uint64_t vflag; // Must be set width of 64 bits
2631 /* setsockopt(level, opt, flag) */
2632 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2633 &level, &optname, &vflag)) {
2634 // level should always be set to AF_VSOCK
2635 res = setsockopt(s->sock_fd, level, optname,
2636 (void*)&vflag, sizeof vflag);
2637 goto done;
2638 }
2639 return NULL;
2640 }
2641#endif
2642
Christian Heimesdffa3942016-09-05 23:54:41 +02002643 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (PyArg_ParseTuple(args, "iii:setsockopt",
2645 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002646 res = setsockopt(s->sock_fd, level, optname,
2647 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002648 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002650
2651 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002652 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002653 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2654 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2655 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002656 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002657 NULL, (socklen_t)optlen);
2658 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002660
2661 PyErr_Clear();
2662 /* setsockopt(level, opt, buffer) */
2663 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2664 &level, &optname, &optval))
2665 return NULL;
2666
2667#ifdef MS_WINDOWS
2668 if (optval.len > INT_MAX) {
2669 PyBuffer_Release(&optval);
2670 PyErr_Format(PyExc_OverflowError,
2671 "socket option is larger than %i bytes",
2672 INT_MAX);
2673 return NULL;
2674 }
2675 res = setsockopt(s->sock_fd, level, optname,
2676 optval.buf, (int)optval.len);
2677#else
2678 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2679#endif
2680 PyBuffer_Release(&optval);
2681
2682done:
Victor Stinnercc739322016-03-23 21:35:29 +01002683 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002685 }
2686
2687 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002688}
2689
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002690PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002691"setsockopt(level, option, value: int)\n\
2692setsockopt(level, option, value: buffer)\n\
2693setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002694\n\
2695Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002696The value argument can either be an integer, a string buffer, or \n\
2697None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002698
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002699
Guido van Rossumaee08791992-09-08 09:05:33 +00002700/* s.getsockopt() method.
2701 With two arguments, retrieves an integer option.
2702 With a third integer argument, retrieves a string buffer of that size;
2703 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002704
Guido van Rossum73624e91994-10-10 17:59:00 +00002705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002706sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 int level;
2709 int optname;
2710 int res;
2711 PyObject *buf;
2712 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002713 int flag = 0;
2714 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2717 &level, &optname, &buflen))
2718 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002721#ifdef AF_VSOCK
2722 if (s->sock_family == AF_VSOCK) {
2723 uint64_t vflag = 0; // Must be set width of 64 bits
2724 flagsize = sizeof vflag;
2725 res = getsockopt(s->sock_fd, level, optname,
2726 (void *)&vflag, &flagsize);
2727 if (res < 0)
2728 return s->errorhandler();
2729 return PyLong_FromUnsignedLong(vflag);
2730 }
2731#endif
2732 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 res = getsockopt(s->sock_fd, level, optname,
2734 (void *)&flag, &flagsize);
2735 if (res < 0)
2736 return s->errorhandler();
2737 return PyLong_FromLong(flag);
2738 }
caaveryeffc12f2017-09-06 18:18:10 -04002739#ifdef AF_VSOCK
2740 if (s->sock_family == AF_VSOCK) {
2741 PyErr_SetString(PyExc_OSError,
2742 "getsockopt string buffer not allowed");
2743 return NULL;
2744 }
2745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002747 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 "getsockopt buflen out of range");
2749 return NULL;
2750 }
2751 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2752 if (buf == NULL)
2753 return NULL;
2754 res = getsockopt(s->sock_fd, level, optname,
2755 (void *)PyBytes_AS_STRING(buf), &buflen);
2756 if (res < 0) {
2757 Py_DECREF(buf);
2758 return s->errorhandler();
2759 }
2760 _PyBytes_Resize(&buf, buflen);
2761 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002762}
2763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002764PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002765"getsockopt(level, option[, buffersize]) -> value\n\
2766\n\
2767Get a socket option. See the Unix manual for level and option.\n\
2768If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002769string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002770
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002771
Fred Drake728819a2000-07-01 03:40:12 +00002772/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002773
Guido van Rossum73624e91994-10-10 17:59:00 +00002774static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002775sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 sock_addr_t addrbuf;
2778 int addrlen;
2779 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2782 return NULL;
2783 Py_BEGIN_ALLOW_THREADS
2784 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2785 Py_END_ALLOW_THREADS
2786 if (res < 0)
2787 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002788 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002789}
2790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002791PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002792"bind(address)\n\
2793\n\
2794Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002795pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002796sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002797
Guido van Rossum30a685f1991-06-27 15:51:29 +00002798
2799/* s.close() method.
2800 Set the file descriptor to -1 so operations tried subsequently
2801 will surely fail. */
2802
Guido van Rossum73624e91994-10-10 17:59:00 +00002803static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002804sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002807 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002808
Victor Stinner19a8e842016-03-21 16:36:48 +01002809 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002810 if (fd != INVALID_SOCKET) {
2811 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002812
2813 /* We do not want to retry upon EINTR: see
2814 http://lwn.net/Articles/576478/ and
2815 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2816 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002818 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002820 /* bpo-30319: The peer can already have closed the connection.
2821 Python ignores ECONNRESET on close(). */
2822 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002823 return s->errorhandler();
2824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002826 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002827}
2828
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002829PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002830"close()\n\
2831\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002832Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002833
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002834static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002835sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002836{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002837 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002838 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002839 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002840}
2841
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002842PyDoc_STRVAR(detach_doc,
2843"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002844\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002845Close the socket object without closing the underlying file descriptor.\n\
2846The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002847can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002848
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002849static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002850sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002851{
Victor Stinner81c41db2015-04-02 11:50:57 +02002852 int err;
2853 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002854
Victor Stinner81c41db2015-04-02 11:50:57 +02002855 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2856 /* getsockopt() failed */
2857 return 0;
2858 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002859
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 if (err == EISCONN)
2861 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002862 if (err != 0) {
2863 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2864 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002865 return 0;
2866 }
2867 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002868}
2869
2870static int
2871internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2872 int raise)
2873{
2874 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002875
2876 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002878 Py_END_ALLOW_THREADS
2879
Victor Stinner70a46f62015-03-31 22:03:59 +02002880 if (!res) {
2881 /* connect() succeeded, the socket is connected */
2882 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002884
Victor Stinner81c41db2015-04-02 11:50:57 +02002885 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002886
Victor Stinner81c41db2015-04-02 11:50:57 +02002887 /* save error, PyErr_CheckSignals() can replace it */
2888 err = GET_SOCK_ERROR;
2889 if (CHECK_ERRNO(EINTR)) {
2890 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002891 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002892
2893 /* Issue #23618: when connect() fails with EINTR, the connection is
2894 running asynchronously.
2895
2896 If the socket is blocking or has a timeout, wait until the
2897 connection completes, fails or timed out using select(), and then
2898 get the connection status using getsockopt(SO_ERROR).
2899
2900 If the socket is non-blocking, raise InterruptedError. The caller is
2901 responsible to wait until the connection completes, fails or timed
2902 out (it's the case in asyncio for example). */
2903 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2904 }
2905 else {
2906 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2907 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002908 }
2909
Victor Stinner81c41db2015-04-02 11:50:57 +02002910 if (!wait_connect) {
2911 if (raise) {
2912 /* restore error, maybe replaced by PyErr_CheckSignals() */
2913 SET_SOCK_ERROR(err);
2914 s->errorhandler();
2915 return -1;
2916 }
2917 else
2918 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002919 }
2920
Victor Stinner81c41db2015-04-02 11:50:57 +02002921 if (raise) {
2922 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002923 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2924 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002925 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002926 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002927 else {
2928 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002929 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2930 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002931 return err;
2932 }
2933 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002934}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002935
Fred Drake728819a2000-07-01 03:40:12 +00002936/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002937
Guido van Rossum73624e91994-10-10 17:59:00 +00002938static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002939sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 sock_addr_t addrbuf;
2942 int addrlen;
2943 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2946 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002947
Victor Stinner81c41db2015-04-02 11:50:57 +02002948 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002949 if (res < 0)
2950 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002951
Victor Stinneree699e92015-03-31 21:28:42 +02002952 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002953}
2954
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002955PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002956"connect(address)\n\
2957\n\
2958Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002959is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002960
Guido van Rossum30a685f1991-06-27 15:51:29 +00002961
Fred Drake728819a2000-07-01 03:40:12 +00002962/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002963
2964static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002965sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 sock_addr_t addrbuf;
2968 int addrlen;
2969 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2972 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002973
Victor Stinner81c41db2015-04-02 11:50:57 +02002974 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002975 if (res < 0)
2976 return NULL;
2977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002979}
2980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002981PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002982"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983\n\
2984This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002985instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002986
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002987
Guido van Rossumed233a51992-06-23 09:07:03 +00002988/* s.fileno() method */
2989
Guido van Rossum73624e91994-10-10 17:59:00 +00002990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002991sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002994}
2995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002996PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002997"fileno() -> integer\n\
2998\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002999Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000
Guido van Rossumed233a51992-06-23 09:07:03 +00003001
Guido van Rossumc89705d1992-11-26 08:54:07 +00003002/* s.getsockname() method */
3003
Guido van Rossum73624e91994-10-10 17:59:00 +00003004static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003005sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 sock_addr_t addrbuf;
3008 int res;
3009 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 if (!getsockaddrlen(s, &addrlen))
3012 return NULL;
3013 memset(&addrbuf, 0, addrlen);
3014 Py_BEGIN_ALLOW_THREADS
3015 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3016 Py_END_ALLOW_THREADS
3017 if (res < 0)
3018 return s->errorhandler();
3019 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3020 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003021}
3022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003023PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003024"getsockname() -> address info\n\
3025\n\
3026Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003027info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003028
Guido van Rossumc89705d1992-11-26 08:54:07 +00003029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003031/* s.getpeername() method */
3032
Guido van Rossum73624e91994-10-10 17:59:00 +00003033static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 sock_addr_t addrbuf;
3037 int res;
3038 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 if (!getsockaddrlen(s, &addrlen))
3041 return NULL;
3042 memset(&addrbuf, 0, addrlen);
3043 Py_BEGIN_ALLOW_THREADS
3044 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3045 Py_END_ALLOW_THREADS
3046 if (res < 0)
3047 return s->errorhandler();
3048 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3049 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003050}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003051
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003052PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003053"getpeername() -> address info\n\
3054\n\
3055Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003056info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003057
Guido van Rossumb6775db1994-08-01 11:34:53 +00003058#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003059
3060
Guido van Rossum30a685f1991-06-27 15:51:29 +00003061/* s.listen(n) method */
3062
Guido van Rossum73624e91994-10-10 17:59:00 +00003063static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003064sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003065{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003066 /* We try to choose a default backlog high enough to avoid connection drops
3067 * for common workloads, yet not too high to limit resource usage. */
3068 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003070
Charles-François Natali644b8f52014-05-22 19:45:39 +01003071 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003075 /* To avoid problems on systems that don't allow a negative backlog
3076 * (which doesn't make sense anyway) we force a minimum value of 0. */
3077 if (backlog < 0)
3078 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 res = listen(s->sock_fd, backlog);
3080 Py_END_ALLOW_THREADS
3081 if (res < 0)
3082 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003083 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003084}
3085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003086PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003087"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003089Enable a server to accept connections. If backlog is specified, it must be\n\
3090at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003091unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003092connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003093
Victor Stinner31bf2d52015-04-01 21:57:09 +02003094struct sock_recv {
3095 char *cbuf;
3096 Py_ssize_t len;
3097 int flags;
3098 Py_ssize_t result;
3099};
3100
3101static int
3102sock_recv_impl(PySocketSockObject *s, void *data)
3103{
3104 struct sock_recv *ctx = data;
3105
3106#ifdef MS_WINDOWS
3107 if (ctx->len > INT_MAX)
3108 ctx->len = INT_MAX;
3109 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3110#else
3111 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3112#endif
3113 return (ctx->result >= 0);
3114}
3115
Guido van Rossum82a5c661998-07-07 20:45:43 +00003116
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003118 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003119 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003120 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003121 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003122 * also possible that we return a number of bytes smaller than the request
3123 * bytes.
3124 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003125
Antoine Pitrou19467d22010-08-17 19:33:30 +00003126static Py_ssize_t
3127sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003128{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003129 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 if (!IS_SELECTABLE(s)) {
3132 select_error();
3133 return -1;
3134 }
3135 if (len == 0) {
3136 /* If 0 bytes were requested, do nothing. */
3137 return 0;
3138 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003139
Victor Stinner31bf2d52015-04-01 21:57:09 +02003140 ctx.cbuf = cbuf;
3141 ctx.len = len;
3142 ctx.flags = flags;
3143 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003145
3146 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003147}
3148
Guido van Rossum48a680c2001-03-02 06:34:14 +00003149
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003150/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003151
Guido van Rossum73624e91994-10-10 17:59:00 +00003152static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003153sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003154{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003155 Py_ssize_t recvlen, outlen;
3156 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003158
Antoine Pitrou19467d22010-08-17 19:33:30 +00003159 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 if (recvlen < 0) {
3163 PyErr_SetString(PyExc_ValueError,
3164 "negative buffersize in recv");
3165 return NULL;
3166 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 /* Allocate a new string. */
3169 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3170 if (buf == NULL)
3171 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 /* Call the guts */
3174 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3175 if (outlen < 0) {
3176 /* An error occurred, release the string and return an
3177 error. */
3178 Py_DECREF(buf);
3179 return NULL;
3180 }
3181 if (outlen != recvlen) {
3182 /* We did not read as many bytes as we anticipated, resize the
3183 string if possible and be successful. */
3184 _PyBytes_Resize(&buf, outlen);
3185 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003188}
3189
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003190PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003191"recv(buffersize[, flags]) -> data\n\
3192\n\
3193Receive up to buffersize bytes from the socket. For the optional flags\n\
3194argument, see the Unix manual. When no data is available, block until\n\
3195at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003196the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003197
Guido van Rossum30a685f1991-06-27 15:51:29 +00003198
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003199/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003200
Thomas Wouters477c8d52006-05-27 19:21:47 +00003201static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003202sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003205
Antoine Pitrou19467d22010-08-17 19:33:30 +00003206 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 Py_buffer pbuf;
3208 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003209 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003212 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 &pbuf, &recvlen, &flags))
3214 return NULL;
3215 buf = pbuf.buf;
3216 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 if (recvlen < 0) {
3219 PyBuffer_Release(&pbuf);
3220 PyErr_SetString(PyExc_ValueError,
3221 "negative buffersize in recv_into");
3222 return NULL;
3223 }
3224 if (recvlen == 0) {
3225 /* If nbytes was not specified, use the buffer's length */
3226 recvlen = buflen;
3227 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 /* Check if the buffer is large enough */
3230 if (buflen < recvlen) {
3231 PyBuffer_Release(&pbuf);
3232 PyErr_SetString(PyExc_ValueError,
3233 "buffer too small for requested bytes");
3234 return NULL;
3235 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 /* Call the guts */
3238 readlen = sock_recv_guts(s, buf, recvlen, flags);
3239 if (readlen < 0) {
3240 /* Return an error. */
3241 PyBuffer_Release(&pbuf);
3242 return NULL;
3243 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 PyBuffer_Release(&pbuf);
3246 /* Return the number of bytes read. Note that we do not do anything
3247 special here in the case that readlen < recvlen. */
3248 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003249}
3250
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003251PyDoc_STRVAR(recv_into_doc,
3252"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003253\n\
3254A version of recv() that stores its data into a buffer rather than creating \n\
3255a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3256is not specified (or 0), receive up to the size available in the given buffer.\n\
3257\n\
3258See recv() for documentation about the flags.");
3259
Victor Stinner31bf2d52015-04-01 21:57:09 +02003260struct sock_recvfrom {
3261 char* cbuf;
3262 Py_ssize_t len;
3263 int flags;
3264 socklen_t *addrlen;
3265 sock_addr_t *addrbuf;
3266 Py_ssize_t result;
3267};
3268
3269static int
3270sock_recvfrom_impl(PySocketSockObject *s, void *data)
3271{
3272 struct sock_recvfrom *ctx = data;
3273
3274 memset(ctx->addrbuf, 0, *ctx->addrlen);
3275
3276#ifdef MS_WINDOWS
3277 if (ctx->len > INT_MAX)
3278 ctx->len = INT_MAX;
3279 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3280 SAS2SA(ctx->addrbuf), ctx->addrlen);
3281#else
3282 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3283 SAS2SA(ctx->addrbuf), ctx->addrlen);
3284#endif
3285 return (ctx->result >= 0);
3286}
3287
Thomas Wouters477c8d52006-05-27 19:21:47 +00003288
3289/*
Christian Heimes99170a52007-12-19 02:07:34 +00003290 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3291 * into a char buffer. If you have any inc/def ref to do to the objects that
3292 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003293 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003294 * that it is also possible that we return a number of bytes smaller than the
3295 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003296 *
3297 * 'addr' is a return value for the address object. Note that you must decref
3298 * it yourself.
3299 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003300static Py_ssize_t
3301sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003306 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 if (!getsockaddrlen(s, &addrlen))
3311 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 if (!IS_SELECTABLE(s)) {
3314 select_error();
3315 return -1;
3316 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003317
Victor Stinner31bf2d52015-04-01 21:57:09 +02003318 ctx.cbuf = cbuf;
3319 ctx.len = len;
3320 ctx.flags = flags;
3321 ctx.addrbuf = &addrbuf;
3322 ctx.addrlen = &addrlen;
3323 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003325
Victor Stinner31bf2d52015-04-01 21:57:09 +02003326 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3327 s->sock_proto);
3328 if (*addr == NULL)
3329 return -1;
3330
3331 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003332}
3333
3334/* s.recvfrom(nbytes [,flags]) method */
3335
3336static PyObject *
3337sock_recvfrom(PySocketSockObject *s, PyObject *args)
3338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 PyObject *buf = NULL;
3340 PyObject *addr = NULL;
3341 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003342 int flags = 0;
3343 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003344
Antoine Pitrou19467d22010-08-17 19:33:30 +00003345 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 if (recvlen < 0) {
3349 PyErr_SetString(PyExc_ValueError,
3350 "negative buffersize in recvfrom");
3351 return NULL;
3352 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3355 if (buf == NULL)
3356 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3359 recvlen, flags, &addr);
3360 if (outlen < 0) {
3361 goto finally;
3362 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 if (outlen != recvlen) {
3365 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003366 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003368 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 goto finally;
3370 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003373
3374finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 Py_XDECREF(buf);
3376 Py_XDECREF(addr);
3377 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003378}
3379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003380PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003381"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3382\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003383Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003384
Thomas Wouters477c8d52006-05-27 19:21:47 +00003385
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003386/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003387
3388static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003389sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003392
Antoine Pitrou19467d22010-08-17 19:33:30 +00003393 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 Py_buffer pbuf;
3395 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003396 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003399
Antoine Pitrou19467d22010-08-17 19:33:30 +00003400 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 kwlist, &pbuf,
3402 &recvlen, &flags))
3403 return NULL;
3404 buf = pbuf.buf;
3405 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 if (recvlen < 0) {
3408 PyBuffer_Release(&pbuf);
3409 PyErr_SetString(PyExc_ValueError,
3410 "negative buffersize in recvfrom_into");
3411 return NULL;
3412 }
3413 if (recvlen == 0) {
3414 /* If nbytes was not specified, use the buffer's length */
3415 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003416 } else if (recvlen > buflen) {
3417 PyBuffer_Release(&pbuf);
3418 PyErr_SetString(PyExc_ValueError,
3419 "nbytes is greater than the length of the buffer");
3420 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3424 if (readlen < 0) {
3425 PyBuffer_Release(&pbuf);
3426 /* Return an error */
3427 Py_XDECREF(addr);
3428 return NULL;
3429 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 PyBuffer_Release(&pbuf);
3432 /* Return the number of bytes read and the address. Note that we do
3433 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003434 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003435}
3436
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003437PyDoc_STRVAR(recvfrom_into_doc,
3438"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003439\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003440Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003441
Victor Stinner35bee932015-04-02 12:28:07 +02003442/* The sendmsg() and recvmsg[_into]() methods require a working
3443 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3444#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003445struct sock_recvmsg {
3446 struct msghdr *msg;
3447 int flags;
3448 ssize_t result;
3449};
3450
3451static int
3452sock_recvmsg_impl(PySocketSockObject *s, void *data)
3453{
3454 struct sock_recvmsg *ctx = data;
3455
3456 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3457 return (ctx->result >= 0);
3458}
3459
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460/*
3461 * Call recvmsg() with the supplied iovec structures, flags, and
3462 * ancillary data buffer size (controllen). Returns the tuple return
3463 * value for recvmsg() or recvmsg_into(), with the first item provided
3464 * by the supplied makeval() function. makeval() will be called with
3465 * the length read and makeval_data as arguments, and must return a
3466 * new reference (which will be decrefed if there is a subsequent
3467 * error). On error, closes any file descriptors received via
3468 * SCM_RIGHTS.
3469 */
3470static PyObject *
3471sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3472 int flags, Py_ssize_t controllen,
3473 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3474{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003475 sock_addr_t addrbuf;
3476 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003477 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003478 PyObject *cmsg_list = NULL, *retval = NULL;
3479 void *controlbuf = NULL;
3480 struct cmsghdr *cmsgh;
3481 size_t cmsgdatalen = 0;
3482 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003483 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003484
3485 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3486 ignored" when the socket is connected (Linux fills them in
3487 anyway for AF_UNIX sockets at least). Normally msg_namelen
3488 seems to be set to 0 if there's no address, but try to
3489 initialize msg_name to something that won't be mistaken for a
3490 real address if that doesn't happen. */
3491 if (!getsockaddrlen(s, &addrbuflen))
3492 return NULL;
3493 memset(&addrbuf, 0, addrbuflen);
3494 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3495
3496 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3497 PyErr_SetString(PyExc_ValueError,
3498 "invalid ancillary data buffer length");
3499 return NULL;
3500 }
3501 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3502 return PyErr_NoMemory();
3503
3504 /* Make the system call. */
3505 if (!IS_SELECTABLE(s)) {
3506 select_error();
3507 goto finally;
3508 }
3509
Victor Stinner31bf2d52015-04-01 21:57:09 +02003510 msg.msg_name = SAS2SA(&addrbuf);
3511 msg.msg_namelen = addrbuflen;
3512 msg.msg_iov = iov;
3513 msg.msg_iovlen = iovlen;
3514 msg.msg_control = controlbuf;
3515 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003516
Victor Stinner31bf2d52015-04-01 21:57:09 +02003517 ctx.msg = &msg;
3518 ctx.flags = flags;
3519 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003521
3522 /* Make list of (level, type, data) tuples from control messages. */
3523 if ((cmsg_list = PyList_New(0)) == NULL)
3524 goto err_closefds;
3525 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3526 implementations didn't do so. */
3527 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3528 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3529 PyObject *bytes, *tuple;
3530 int tmp;
3531
3532 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3533 if (cmsg_status != 0) {
3534 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3535 "received malformed or improperly-truncated "
3536 "ancillary data", 1) == -1)
3537 goto err_closefds;
3538 }
3539 if (cmsg_status < 0)
3540 break;
3541 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003542 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543 goto err_closefds;
3544 }
3545
3546 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3547 cmsgdatalen);
3548 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3549 (int)cmsgh->cmsg_type, bytes);
3550 if (tuple == NULL)
3551 goto err_closefds;
3552 tmp = PyList_Append(cmsg_list, tuple);
3553 Py_DECREF(tuple);
3554 if (tmp != 0)
3555 goto err_closefds;
3556
3557 if (cmsg_status != 0)
3558 break;
3559 }
3560
3561 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003562 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003563 cmsg_list,
3564 (int)msg.msg_flags,
3565 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3566 ((msg.msg_namelen > addrbuflen) ?
3567 addrbuflen : msg.msg_namelen),
3568 s->sock_proto));
3569 if (retval == NULL)
3570 goto err_closefds;
3571
3572finally:
3573 Py_XDECREF(cmsg_list);
3574 PyMem_Free(controlbuf);
3575 return retval;
3576
3577err_closefds:
3578#ifdef SCM_RIGHTS
3579 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3580 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3581 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3582 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3583 if (cmsg_status < 0)
3584 break;
3585 if (cmsgh->cmsg_level == SOL_SOCKET &&
3586 cmsgh->cmsg_type == SCM_RIGHTS) {
3587 size_t numfds;
3588 int *fdp;
3589
3590 numfds = cmsgdatalen / sizeof(int);
3591 fdp = (int *)CMSG_DATA(cmsgh);
3592 while (numfds-- > 0)
3593 close(*fdp++);
3594 }
3595 if (cmsg_status != 0)
3596 break;
3597 }
3598#endif /* SCM_RIGHTS */
3599 goto finally;
3600}
3601
3602
3603static PyObject *
3604makeval_recvmsg(ssize_t received, void *data)
3605{
3606 PyObject **buf = data;
3607
3608 if (received < PyBytes_GET_SIZE(*buf))
3609 _PyBytes_Resize(buf, received);
3610 Py_XINCREF(*buf);
3611 return *buf;
3612}
3613
3614/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3615
3616static PyObject *
3617sock_recvmsg(PySocketSockObject *s, PyObject *args)
3618{
3619 Py_ssize_t bufsize, ancbufsize = 0;
3620 int flags = 0;
3621 struct iovec iov;
3622 PyObject *buf = NULL, *retval = NULL;
3623
3624 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3625 return NULL;
3626
3627 if (bufsize < 0) {
3628 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3629 return NULL;
3630 }
3631 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3632 return NULL;
3633 iov.iov_base = PyBytes_AS_STRING(buf);
3634 iov.iov_len = bufsize;
3635
3636 /* Note that we're passing a pointer to *our pointer* to the bytes
3637 object here (&buf); makeval_recvmsg() may incref the object, or
3638 deallocate it and set our pointer to NULL. */
3639 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3640 &makeval_recvmsg, &buf);
3641 Py_XDECREF(buf);
3642 return retval;
3643}
3644
3645PyDoc_STRVAR(recvmsg_doc,
3646"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3647\n\
3648Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3649socket. The ancbufsize argument sets the size in bytes of the\n\
3650internal buffer used to receive the ancillary data; it defaults to 0,\n\
3651meaning that no ancillary data will be received. Appropriate buffer\n\
3652sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3653CMSG_LEN(), and items which do not fit into the buffer might be\n\
3654truncated or discarded. The flags argument defaults to 0 and has the\n\
3655same meaning as for recv().\n\
3656\n\
3657The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3658The data item is a bytes object holding the non-ancillary data\n\
3659received. The ancdata item is a list of zero or more tuples\n\
3660(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3661(control messages) received: cmsg_level and cmsg_type are integers\n\
3662specifying the protocol level and protocol-specific type respectively,\n\
3663and cmsg_data is a bytes object holding the associated data. The\n\
3664msg_flags item is the bitwise OR of various flags indicating\n\
3665conditions on the received message; see your system documentation for\n\
3666details. If the receiving socket is unconnected, address is the\n\
3667address of the sending socket, if available; otherwise, its value is\n\
3668unspecified.\n\
3669\n\
3670If recvmsg() raises an exception after the system call returns, it\n\
3671will first attempt to close any file descriptors received via the\n\
3672SCM_RIGHTS mechanism.");
3673
3674
3675static PyObject *
3676makeval_recvmsg_into(ssize_t received, void *data)
3677{
3678 return PyLong_FromSsize_t(received);
3679}
3680
3681/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3682
3683static PyObject *
3684sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3685{
3686 Py_ssize_t ancbufsize = 0;
3687 int flags = 0;
3688 struct iovec *iovs = NULL;
3689 Py_ssize_t i, nitems, nbufs = 0;
3690 Py_buffer *bufs = NULL;
3691 PyObject *buffers_arg, *fast, *retval = NULL;
3692
3693 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3694 &buffers_arg, &ancbufsize, &flags))
3695 return NULL;
3696
3697 if ((fast = PySequence_Fast(buffers_arg,
3698 "recvmsg_into() argument 1 must be an "
3699 "iterable")) == NULL)
3700 return NULL;
3701 nitems = PySequence_Fast_GET_SIZE(fast);
3702 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003703 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003704 goto finally;
3705 }
3706
3707 /* Fill in an iovec for each item, and save the Py_buffer
3708 structs to release afterwards. */
3709 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3710 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3711 PyErr_NoMemory();
3712 goto finally;
3713 }
3714 for (; nbufs < nitems; nbufs++) {
3715 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3716 "w*;recvmsg_into() argument 1 must be an iterable "
3717 "of single-segment read-write buffers",
3718 &bufs[nbufs]))
3719 goto finally;
3720 iovs[nbufs].iov_base = bufs[nbufs].buf;
3721 iovs[nbufs].iov_len = bufs[nbufs].len;
3722 }
3723
3724 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3725 &makeval_recvmsg_into, NULL);
3726finally:
3727 for (i = 0; i < nbufs; i++)
3728 PyBuffer_Release(&bufs[i]);
3729 PyMem_Free(bufs);
3730 PyMem_Free(iovs);
3731 Py_DECREF(fast);
3732 return retval;
3733}
3734
3735PyDoc_STRVAR(recvmsg_into_doc,
3736"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3737\n\
3738Receive normal data and ancillary data from the socket, scattering the\n\
3739non-ancillary data into a series of buffers. The buffers argument\n\
3740must be an iterable of objects that export writable buffers\n\
3741(e.g. bytearray objects); these will be filled with successive chunks\n\
3742of the non-ancillary data until it has all been written or there are\n\
3743no more buffers. The ancbufsize argument sets the size in bytes of\n\
3744the internal buffer used to receive the ancillary data; it defaults to\n\
37450, meaning that no ancillary data will be received. Appropriate\n\
3746buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3747or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3748truncated or discarded. The flags argument defaults to 0 and has the\n\
3749same meaning as for recv().\n\
3750\n\
3751The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3752The nbytes item is the total number of bytes of non-ancillary data\n\
3753written into the buffers. The ancdata item is a list of zero or more\n\
3754tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3755data (control messages) received: cmsg_level and cmsg_type are\n\
3756integers specifying the protocol level and protocol-specific type\n\
3757respectively, and cmsg_data is a bytes object holding the associated\n\
3758data. The msg_flags item is the bitwise OR of various flags\n\
3759indicating conditions on the received message; see your system\n\
3760documentation for details. If the receiving socket is unconnected,\n\
3761address is the address of the sending socket, if available; otherwise,\n\
3762its value is unspecified.\n\
3763\n\
3764If recvmsg_into() raises an exception after the system call returns,\n\
3765it will first attempt to close any file descriptors received via the\n\
3766SCM_RIGHTS mechanism.");
3767#endif /* CMSG_LEN */
3768
3769
Victor Stinner31bf2d52015-04-01 21:57:09 +02003770struct sock_send {
3771 char *buf;
3772 Py_ssize_t len;
3773 int flags;
3774 Py_ssize_t result;
3775};
3776
3777static int
3778sock_send_impl(PySocketSockObject *s, void *data)
3779{
3780 struct sock_send *ctx = data;
3781
3782#ifdef MS_WINDOWS
3783 if (ctx->len > INT_MAX)
3784 ctx->len = INT_MAX;
3785 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3786#else
3787 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3788#endif
3789 return (ctx->result >= 0);
3790}
3791
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003792/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003793
Guido van Rossum73624e91994-10-10 17:59:00 +00003794static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003795sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003796{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003797 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003799 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3802 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 if (!IS_SELECTABLE(s)) {
3805 PyBuffer_Release(&pbuf);
3806 return select_error();
3807 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003808 ctx.buf = pbuf.buf;
3809 ctx.len = pbuf.len;
3810 ctx.flags = flags;
3811 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003812 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 return NULL;
3814 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003815 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003816
3817 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003818}
3819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003820PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003821"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003822\n\
3823Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003824argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003825sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003826
3827
3828/* s.sendall(data [,flags]) method */
3829
3830static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003831sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003834 Py_ssize_t len, n;
3835 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003836 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003837 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003838 int has_timeout = (s->sock_timeout > 0);
3839 _PyTime_t interval = s->sock_timeout;
3840 _PyTime_t deadline = 0;
3841 int deadline_initialized = 0;
3842 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3845 return NULL;
3846 buf = pbuf.buf;
3847 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 if (!IS_SELECTABLE(s)) {
3850 PyBuffer_Release(&pbuf);
3851 return select_error();
3852 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003855 if (has_timeout) {
3856 if (deadline_initialized) {
3857 /* recompute the timeout */
3858 interval = deadline - _PyTime_GetMonotonicClock();
3859 }
3860 else {
3861 deadline_initialized = 1;
3862 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3863 }
3864
3865 if (interval <= 0) {
3866 PyErr_SetString(socket_timeout, "timed out");
3867 goto done;
3868 }
3869 }
3870
Victor Stinner02f32ab2015-04-01 22:53:26 +02003871 ctx.buf = buf;
3872 ctx.len = len;
3873 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003874 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3875 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003876 n = ctx.result;
3877 assert(n >= 0);
3878
3879 buf += n;
3880 len -= n;
3881
3882 /* We must run our signal handlers before looping again.
3883 send() can return a successful partial write when it is
3884 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003885 if (PyErr_CheckSignals())
3886 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003887 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003889
Victor Stinner8912d142015-04-06 23:16:34 +02003890 Py_INCREF(Py_None);
3891 res = Py_None;
3892
3893done:
3894 PyBuffer_Release(&pbuf);
3895 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003896}
3897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003898PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003899"sendall(data[, flags])\n\
3900\n\
3901Send a data string to the socket. For the optional flags\n\
3902argument, see the Unix manual. This calls send() repeatedly\n\
3903until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003904to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003905
Guido van Rossum30a685f1991-06-27 15:51:29 +00003906
Victor Stinner31bf2d52015-04-01 21:57:09 +02003907struct sock_sendto {
3908 char *buf;
3909 Py_ssize_t len;
3910 int flags;
3911 int addrlen;
3912 sock_addr_t *addrbuf;
3913 Py_ssize_t result;
3914};
3915
3916static int
3917sock_sendto_impl(PySocketSockObject *s, void *data)
3918{
3919 struct sock_sendto *ctx = data;
3920
3921#ifdef MS_WINDOWS
3922 if (ctx->len > INT_MAX)
3923 ctx->len = INT_MAX;
3924 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3925 SAS2SA(ctx->addrbuf), ctx->addrlen);
3926#else
3927 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3928 SAS2SA(ctx->addrbuf), ctx->addrlen);
3929#endif
3930 return (ctx->result >= 0);
3931}
3932
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003933/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003934
Guido van Rossum73624e91994-10-10 17:59:00 +00003935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003936sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 Py_buffer pbuf;
3939 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003940 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003942 int addrlen, flags;
3943 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003946 arglen = PyTuple_Size(args);
3947 switch (arglen) {
3948 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003949 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3950 return NULL;
3951 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003952 break;
3953 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003954 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3955 &pbuf, &flags, &addro)) {
3956 return NULL;
3957 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003958 break;
3959 default:
3960 PyErr_Format(PyExc_TypeError,
3961 "sendto() takes 2 or 3 arguments (%d given)",
3962 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003963 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 if (!IS_SELECTABLE(s)) {
3967 PyBuffer_Release(&pbuf);
3968 return select_error();
3969 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3972 PyBuffer_Release(&pbuf);
3973 return NULL;
3974 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003975
Victor Stinner31bf2d52015-04-01 21:57:09 +02003976 ctx.buf = pbuf.buf;
3977 ctx.len = pbuf.len;
3978 ctx.flags = flags;
3979 ctx.addrlen = addrlen;
3980 ctx.addrbuf = &addrbuf;
3981 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003982 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 return NULL;
3984 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003985 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003986
3987 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003988}
3989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003990PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003991"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003992\n\
3993Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003994For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003995
Guido van Rossum30a685f1991-06-27 15:51:29 +00003996
Victor Stinner35bee932015-04-02 12:28:07 +02003997/* The sendmsg() and recvmsg[_into]() methods require a working
3998 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3999#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004000struct sock_sendmsg {
4001 struct msghdr *msg;
4002 int flags;
4003 ssize_t result;
4004};
4005
4006static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004007sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4008 struct msghdr *msg,
4009 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4010 Py_ssize_t ndataparts, ndatabufs = 0;
4011 int result = -1;
4012 struct iovec *iovs = NULL;
4013 PyObject *data_fast = NULL;
4014 Py_buffer *databufs = NULL;
4015
4016 /* Fill in an iovec for each message part, and save the Py_buffer
4017 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004018 data_fast = PySequence_Fast(data_arg,
4019 "sendmsg() argument 1 must be an "
4020 "iterable");
4021 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004022 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004023 }
4024
Christian Heimesdffa3942016-09-05 23:54:41 +02004025 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4026 if (ndataparts > INT_MAX) {
4027 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4028 goto finally;
4029 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004030
Christian Heimesdffa3942016-09-05 23:54:41 +02004031 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004032 if (ndataparts > 0) {
4033 iovs = PyMem_New(struct iovec, ndataparts);
4034 if (iovs == NULL) {
4035 PyErr_NoMemory();
4036 goto finally;
4037 }
4038 msg->msg_iov = iovs;
4039
4040 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004041 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004042 PyErr_NoMemory();
4043 goto finally;
4044 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004045 }
4046 for (; ndatabufs < ndataparts; ndatabufs++) {
4047 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4048 "y*;sendmsg() argument 1 must be an iterable of "
4049 "bytes-like objects",
4050 &databufs[ndatabufs]))
4051 goto finally;
4052 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4053 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4054 }
4055 result = 0;
4056 finally:
4057 *databufsout = databufs;
4058 *ndatabufsout = ndatabufs;
4059 Py_XDECREF(data_fast);
4060 return result;
4061}
4062
4063static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004064sock_sendmsg_impl(PySocketSockObject *s, void *data)
4065{
4066 struct sock_sendmsg *ctx = data;
4067
4068 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4069 return (ctx->result >= 0);
4070}
4071
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004072/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4073
4074static PyObject *
4075sock_sendmsg(PySocketSockObject *s, PyObject *args)
4076{
Christian Heimesdffa3942016-09-05 23:54:41 +02004077 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004079 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004080 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004081 struct cmsginfo {
4082 int level;
4083 int type;
4084 Py_buffer data;
4085 } *cmsgs = NULL;
4086 void *controlbuf = NULL;
4087 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004088 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004089 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004090 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004091 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004092
4093 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004094 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004096 }
4097
4098 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004099
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100 /* Parse destination address. */
4101 if (addr_arg != NULL && addr_arg != Py_None) {
4102 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4103 goto finally;
4104 msg.msg_name = &addrbuf;
4105 msg.msg_namelen = addrlen;
4106 }
4107
4108 /* Fill in an iovec for each message part, and save the Py_buffer
4109 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004110 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004111 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004112 }
4113
4114 if (cmsg_arg == NULL)
4115 ncmsgs = 0;
4116 else {
4117 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4118 "sendmsg() argument 2 must be an "
4119 "iterable")) == NULL)
4120 goto finally;
4121 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4122 }
4123
4124#ifndef CMSG_SPACE
4125 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004126 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127 "sending multiple control messages is not supported "
4128 "on this system");
4129 goto finally;
4130 }
4131#endif
4132 /* Save level, type and Py_buffer for each control message,
4133 and calculate total size. */
4134 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4135 PyErr_NoMemory();
4136 goto finally;
4137 }
4138 controllen = controllen_last = 0;
4139 while (ncmsgbufs < ncmsgs) {
4140 size_t bufsize, space;
4141
4142 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4143 "(iiy*):[sendmsg() ancillary data items]",
4144 &cmsgs[ncmsgbufs].level,
4145 &cmsgs[ncmsgbufs].type,
4146 &cmsgs[ncmsgbufs].data))
4147 goto finally;
4148 bufsize = cmsgs[ncmsgbufs++].data.len;
4149
4150#ifdef CMSG_SPACE
4151 if (!get_CMSG_SPACE(bufsize, &space)) {
4152#else
4153 if (!get_CMSG_LEN(bufsize, &space)) {
4154#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004155 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004156 goto finally;
4157 }
4158 controllen += space;
4159 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004160 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004161 goto finally;
4162 }
4163 controllen_last = controllen;
4164 }
4165
4166 /* Construct ancillary data block from control message info. */
4167 if (ncmsgbufs > 0) {
4168 struct cmsghdr *cmsgh = NULL;
4169
Victor Stinner52d61e42016-09-12 11:41:58 +02004170 controlbuf = PyMem_Malloc(controllen);
4171 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004172 PyErr_NoMemory();
4173 goto finally;
4174 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004175 msg.msg_control = controlbuf;
4176
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004177 msg.msg_controllen = controllen;
4178
4179 /* Need to zero out the buffer as a workaround for glibc's
4180 CMSG_NXTHDR() implementation. After getting the pointer to
4181 the next header, it checks its (uninitialized) cmsg_len
4182 member to see if the "message" fits in the buffer, and
4183 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004184 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185 memset(controlbuf, 0, controllen);
4186
4187 for (i = 0; i < ncmsgbufs; i++) {
4188 size_t msg_len, data_len = cmsgs[i].data.len;
4189 int enough_space = 0;
4190
4191 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4192 if (cmsgh == NULL) {
4193 PyErr_Format(PyExc_RuntimeError,
4194 "unexpected NULL result from %s()",
4195 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4196 goto finally;
4197 }
4198 if (!get_CMSG_LEN(data_len, &msg_len)) {
4199 PyErr_SetString(PyExc_RuntimeError,
4200 "item size out of range for CMSG_LEN()");
4201 goto finally;
4202 }
4203 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4204 size_t space;
4205
4206 cmsgh->cmsg_len = msg_len;
4207 if (get_cmsg_data_space(&msg, cmsgh, &space))
4208 enough_space = (space >= data_len);
4209 }
4210 if (!enough_space) {
4211 PyErr_SetString(PyExc_RuntimeError,
4212 "ancillary data does not fit in calculated "
4213 "space");
4214 goto finally;
4215 }
4216 cmsgh->cmsg_level = cmsgs[i].level;
4217 cmsgh->cmsg_type = cmsgs[i].type;
4218 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4219 }
4220 }
4221
4222 /* Make the system call. */
4223 if (!IS_SELECTABLE(s)) {
4224 select_error();
4225 goto finally;
4226 }
4227
Victor Stinner31bf2d52015-04-01 21:57:09 +02004228 ctx.msg = &msg;
4229 ctx.flags = flags;
4230 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004231 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004232
4233 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234
4235finally:
4236 PyMem_Free(controlbuf);
4237 for (i = 0; i < ncmsgbufs; i++)
4238 PyBuffer_Release(&cmsgs[i].data);
4239 PyMem_Free(cmsgs);
4240 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004241 PyMem_Free(msg.msg_iov);
4242 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004243 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004244 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004245 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246 return retval;
4247}
4248
4249PyDoc_STRVAR(sendmsg_doc,
4250"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4251\n\
4252Send normal and ancillary data to the socket, gathering the\n\
4253non-ancillary data from a series of buffers and concatenating it into\n\
4254a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004255data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004256The ancdata argument specifies the ancillary data (control messages)\n\
4257as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4258cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4259protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004260is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004261argument defaults to 0 and has the same meaning as for send(). If\n\
4262address is supplied and not None, it sets a destination address for\n\
4263the message. The return value is the number of bytes of non-ancillary\n\
4264data sent.");
4265#endif /* CMSG_LEN */
4266
Christian Heimesdffa3942016-09-05 23:54:41 +02004267#ifdef HAVE_SOCKADDR_ALG
4268static PyObject*
4269sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4270{
4271 PyObject *retval = NULL;
4272
4273 Py_ssize_t i, ndatabufs = 0;
4274 Py_buffer *databufs = NULL;
4275 PyObject *data_arg = NULL;
4276
4277 Py_buffer iv = {NULL, NULL};
4278
4279 PyObject *opobj = NULL;
4280 int op = -1;
4281
4282 PyObject *assoclenobj = NULL;
4283 int assoclen = -1;
4284
4285 unsigned int *uiptr;
4286 int flags = 0;
4287
4288 struct msghdr msg;
4289 struct cmsghdr *header = NULL;
4290 struct af_alg_iv *alg_iv = NULL;
4291 struct sock_sendmsg ctx;
4292 Py_ssize_t controllen;
4293 void *controlbuf = NULL;
4294 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4295
4296 if (self->sock_family != AF_ALG) {
4297 PyErr_SetString(PyExc_OSError,
4298 "algset is only supported for AF_ALG");
4299 return NULL;
4300 }
4301
4302 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4303 "|O$O!y*O!i:sendmsg_afalg", keywords,
4304 &data_arg,
4305 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004306 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004307 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004308 }
4309
4310 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004311
4312 /* op is a required, keyword-only argument >= 0 */
4313 if (opobj != NULL) {
4314 op = _PyLong_AsInt(opobj);
4315 }
4316 if (op < 0) {
4317 /* override exception from _PyLong_AsInt() */
4318 PyErr_SetString(PyExc_TypeError,
4319 "Invalid or missing argument 'op'");
4320 goto finally;
4321 }
4322 /* assoclen is optional but must be >= 0 */
4323 if (assoclenobj != NULL) {
4324 assoclen = _PyLong_AsInt(assoclenobj);
4325 if (assoclen == -1 && PyErr_Occurred()) {
4326 goto finally;
4327 }
4328 if (assoclen < 0) {
4329 PyErr_SetString(PyExc_TypeError,
4330 "assoclen must be positive");
4331 goto finally;
4332 }
4333 }
4334
4335 controllen = CMSG_SPACE(4);
4336 if (iv.buf != NULL) {
4337 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4338 }
4339 if (assoclen >= 0) {
4340 controllen += CMSG_SPACE(4);
4341 }
4342
4343 controlbuf = PyMem_Malloc(controllen);
4344 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004345 PyErr_NoMemory();
4346 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004347 }
4348 memset(controlbuf, 0, controllen);
4349
Christian Heimesdffa3942016-09-05 23:54:41 +02004350 msg.msg_controllen = controllen;
4351 msg.msg_control = controlbuf;
4352
4353 /* Fill in an iovec for each message part, and save the Py_buffer
4354 structs to release afterwards. */
4355 if (data_arg != NULL) {
4356 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4357 goto finally;
4358 }
4359 }
4360
4361 /* set operation to encrypt or decrypt */
4362 header = CMSG_FIRSTHDR(&msg);
4363 if (header == NULL) {
4364 PyErr_SetString(PyExc_RuntimeError,
4365 "unexpected NULL result from CMSG_FIRSTHDR");
4366 goto finally;
4367 }
4368 header->cmsg_level = SOL_ALG;
4369 header->cmsg_type = ALG_SET_OP;
4370 header->cmsg_len = CMSG_LEN(4);
4371 uiptr = (void*)CMSG_DATA(header);
4372 *uiptr = (unsigned int)op;
4373
4374 /* set initialization vector */
4375 if (iv.buf != NULL) {
4376 header = CMSG_NXTHDR(&msg, header);
4377 if (header == NULL) {
4378 PyErr_SetString(PyExc_RuntimeError,
4379 "unexpected NULL result from CMSG_NXTHDR(iv)");
4380 goto finally;
4381 }
4382 header->cmsg_level = SOL_ALG;
4383 header->cmsg_type = ALG_SET_IV;
4384 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4385 alg_iv = (void*)CMSG_DATA(header);
4386 alg_iv->ivlen = iv.len;
4387 memcpy(alg_iv->iv, iv.buf, iv.len);
4388 }
4389
4390 /* set length of associated data for AEAD */
4391 if (assoclen >= 0) {
4392 header = CMSG_NXTHDR(&msg, header);
4393 if (header == NULL) {
4394 PyErr_SetString(PyExc_RuntimeError,
4395 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4396 goto finally;
4397 }
4398 header->cmsg_level = SOL_ALG;
4399 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4400 header->cmsg_len = CMSG_LEN(4);
4401 uiptr = (void*)CMSG_DATA(header);
4402 *uiptr = (unsigned int)assoclen;
4403 }
4404
4405 ctx.msg = &msg;
4406 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004407 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004408 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004409 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004410
4411 retval = PyLong_FromSsize_t(ctx.result);
4412
4413 finally:
4414 PyMem_Free(controlbuf);
4415 if (iv.buf != NULL) {
4416 PyBuffer_Release(&iv);
4417 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004418 PyMem_Free(msg.msg_iov);
4419 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004420 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004421 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004422 PyMem_Free(databufs);
4423 return retval;
4424}
4425
4426PyDoc_STRVAR(sendmsg_afalg_doc,
4427"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4428\n\
4429Set operation mode, IV and length of associated data for an AF_ALG\n\
4430operation socket.");
4431#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004432
Guido van Rossum30a685f1991-06-27 15:51:29 +00004433/* s.shutdown(how) method */
4434
Guido van Rossum73624e91994-10-10 17:59:00 +00004435static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004436sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 int how;
4439 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004440
Serhiy Storchaka78980432013-01-15 01:12:17 +02004441 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 if (how == -1 && PyErr_Occurred())
4443 return NULL;
4444 Py_BEGIN_ALLOW_THREADS
4445 res = shutdown(s->sock_fd, how);
4446 Py_END_ALLOW_THREADS
4447 if (res < 0)
4448 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004449 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004450}
4451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004452PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004453"shutdown(flag)\n\
4454\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004455Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4456of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004457
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004458#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004459static PyObject*
4460sock_ioctl(PySocketSockObject *s, PyObject *arg)
4461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 unsigned long cmd = SIO_RCVALL;
4463 PyObject *argO;
4464 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4467 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 switch (cmd) {
4470 case SIO_RCVALL: {
4471 unsigned int option = RCVALL_ON;
4472 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4473 return NULL;
4474 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4475 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4476 return set_error();
4477 }
4478 return PyLong_FromUnsignedLong(recv); }
4479 case SIO_KEEPALIVE_VALS: {
4480 struct tcp_keepalive ka;
4481 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4482 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4483 return NULL;
4484 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4485 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4486 return set_error();
4487 }
4488 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004489#if defined(SIO_LOOPBACK_FAST_PATH)
4490 case SIO_LOOPBACK_FAST_PATH: {
4491 unsigned int option;
4492 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4493 return NULL;
4494 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4495 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4496 return set_error();
4497 }
4498 return PyLong_FromUnsignedLong(recv); }
4499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 default:
4501 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4502 return NULL;
4503 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004504}
4505PyDoc_STRVAR(sock_ioctl_doc,
4506"ioctl(cmd, option) -> long\n\
4507\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004508Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4509SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004510SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4511SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004512#endif
4513
4514#if defined(MS_WINDOWS)
4515static PyObject*
4516sock_share(PySocketSockObject *s, PyObject *arg)
4517{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004518 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004519 DWORD processId;
4520 int result;
4521
4522 if (!PyArg_ParseTuple(arg, "I", &processId))
4523 return NULL;
4524
4525 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004526 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004527 Py_END_ALLOW_THREADS
4528 if (result == SOCKET_ERROR)
4529 return set_error();
4530 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4531}
4532PyDoc_STRVAR(sock_share_doc,
4533"share(process_id) -> bytes\n\
4534\n\
4535Share the socket with another process. The target process id\n\
4536must be provided and the resulting bytes object passed to the target\n\
4537process. There the shared socket can be instantiated by calling\n\
4538socket.fromshare().");
4539
Christian Heimesfaf2f632008-01-06 16:59:19 +00004540
4541#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004542
4543/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004544
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004545static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4547 accept_doc},
4548 {"bind", (PyCFunction)sock_bind, METH_O,
4549 bind_doc},
4550 {"close", (PyCFunction)sock_close, METH_NOARGS,
4551 close_doc},
4552 {"connect", (PyCFunction)sock_connect, METH_O,
4553 connect_doc},
4554 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4555 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004556 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4557 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4559 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004560#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 {"getpeername", (PyCFunction)sock_getpeername,
4562 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 {"getsockname", (PyCFunction)sock_getsockname,
4565 METH_NOARGS, getsockname_doc},
4566 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4567 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004568#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4570 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004571#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004572#if defined(MS_WINDOWS)
4573 {"share", (PyCFunction)sock_share, METH_VARARGS,
4574 sock_share_doc},
4575#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004576 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 listen_doc},
4578 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4579 recv_doc},
4580 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4581 recv_into_doc},
4582 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4583 recvfrom_doc},
4584 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4585 recvfrom_into_doc},
4586 {"send", (PyCFunction)sock_send, METH_VARARGS,
4587 send_doc},
4588 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4589 sendall_doc},
4590 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4591 sendto_doc},
4592 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4593 setblocking_doc},
4594 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4595 settimeout_doc},
4596 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4597 gettimeout_doc},
4598 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4599 setsockopt_doc},
4600 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4601 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004602#ifdef CMSG_LEN
4603 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4604 recvmsg_doc},
4605 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4606 recvmsg_into_doc,},
4607 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4608 sendmsg_doc},
4609#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004610#ifdef HAVE_SOCKADDR_ALG
4611 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4612 sendmsg_afalg_doc},
4613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004615};
4616
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004617/* SockObject members */
4618static PyMemberDef sock_memberlist[] = {
4619 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4620 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4621 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004622 {0},
4623};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004624
Victor Stinner71694d52015-03-28 01:18:54 +01004625static PyGetSetDef sock_getsetlist[] = {
4626 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4627 {NULL} /* sentinel */
4628};
4629
Guido van Rossum73624e91994-10-10 17:59:00 +00004630/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004631 First close the file description. */
4632
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004633static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004634sock_finalize(PySocketSockObject *s)
4635{
4636 SOCKET_T fd;
4637 PyObject *error_type, *error_value, *error_traceback;
4638
4639 /* Save the current exception, if any. */
4640 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4641
Victor Stinnerd3afb622016-07-22 17:47:09 +02004642 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004643 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4644 /* Spurious errors can appear at shutdown */
4645 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4646 PyErr_WriteUnraisable((PyObject *)s);
4647 }
4648 }
4649
4650 /* Only close the socket *after* logging the ResourceWarning warning
4651 to allow the logger to call socket methods like
4652 socket.getsockname(). If the socket is closed before, socket
4653 methods fails with the EBADF error. */
4654 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004655 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004656
4657 /* We do not want to retry upon EINTR: see sock_close() */
4658 Py_BEGIN_ALLOW_THREADS
4659 (void) SOCKETCLOSE(fd);
4660 Py_END_ALLOW_THREADS
4661 }
4662
4663 /* Restore the saved exception. */
4664 PyErr_Restore(error_type, error_value, error_traceback);
4665}
4666
4667static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004668sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004669{
Victor Stinner19a8e842016-03-21 16:36:48 +01004670 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4671 return;
4672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004674}
4675
Guido van Rossum30a685f1991-06-27 15:51:29 +00004676
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004678sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004679{
Victor Stinnere254e532014-07-26 14:36:55 +02004680 long sock_fd;
4681 /* On Windows, this test is needed because SOCKET_T is unsigned */
4682 if (s->sock_fd == INVALID_SOCKET) {
4683 sock_fd = -1;
4684 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004685#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004686 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 /* this can occur on Win64, and actually there is a special
4688 ugly printf formatter for decimal pointer length integer
4689 printing, only bother if necessary*/
4690 PyErr_SetString(PyExc_OverflowError,
4691 "no printf formatter to display "
4692 "the socket descriptor in decimal");
4693 return NULL;
4694 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004695#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004696 else
4697 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 return PyUnicode_FromFormat(
4699 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004700 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 s->sock_type,
4702 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004703}
4704
4705
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004706/* Create a new, uninitialized socket object. */
4707
4708static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004709sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 new = type->tp_alloc(type, 0);
4714 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004715 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004716 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 ((PySocketSockObject *)new)->errorhandler = &set_error;
4718 }
4719 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004720}
4721
4722
4723/* Initialize a new socket object. */
4724
Victor Stinnerdaf45552013-08-28 00:53:59 +02004725#ifdef SOCK_CLOEXEC
4726/* socket() and socketpair() fail with EINVAL on Linux kernel older
4727 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4728static int sock_cloexec_works = -1;
4729#endif
4730
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004731/*ARGSUSED*/
4732static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004733sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 PySocketSockObject *s = (PySocketSockObject *)self;
4736 PyObject *fdobj = NULL;
4737 SOCKET_T fd = INVALID_SOCKET;
4738 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4739 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004740#ifndef MS_WINDOWS
4741#ifdef SOCK_CLOEXEC
4742 int *atomic_flag_works = &sock_cloexec_works;
4743#else
4744 int *atomic_flag_works = NULL;
4745#endif
4746#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4749 "|iiiO:socket", keywords,
4750 &family, &type, &proto, &fdobj))
4751 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004754#ifdef MS_WINDOWS
4755 /* recreate a socket that was duplicated */
4756 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004757 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004758 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4759 PyErr_Format(PyExc_ValueError,
4760 "socket descriptor string has wrong size, "
4761 "should be %zu bytes.", sizeof(info));
4762 return -1;
4763 }
4764 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4765 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004766 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004767 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4768 Py_END_ALLOW_THREADS
4769 if (fd == INVALID_SOCKET) {
4770 set_error();
4771 return -1;
4772 }
4773 family = info.iAddressFamily;
4774 type = info.iSocketType;
4775 proto = info.iProtocol;
4776 }
4777 else
4778#endif
4779 {
4780 fd = PyLong_AsSocket_t(fdobj);
4781 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4782 return -1;
4783 if (fd == INVALID_SOCKET) {
4784 PyErr_SetString(PyExc_ValueError,
4785 "can't use invalid socket value");
4786 return -1;
4787 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 }
4789 }
4790 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004791#ifdef MS_WINDOWS
4792 /* Windows implementation */
4793#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4794#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4795#endif
4796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004798 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004799 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004800 NULL, 0,
4801 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4802 if (fd == INVALID_SOCKET) {
4803 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4804 support_wsa_no_inherit = 0;
4805 fd = socket(family, type, proto);
4806 }
4807 }
4808 else {
4809 fd = socket(family, type, proto);
4810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 if (fd == INVALID_SOCKET) {
4814 set_error();
4815 return -1;
4816 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004817
4818 if (!support_wsa_no_inherit) {
4819 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4820 closesocket(fd);
4821 PyErr_SetFromWindowsErr(0);
4822 return -1;
4823 }
4824 }
4825#else
4826 /* UNIX */
4827 Py_BEGIN_ALLOW_THREADS
4828#ifdef SOCK_CLOEXEC
4829 if (sock_cloexec_works != 0) {
4830 fd = socket(family, type | SOCK_CLOEXEC, proto);
4831 if (sock_cloexec_works == -1) {
4832 if (fd >= 0) {
4833 sock_cloexec_works = 1;
4834 }
4835 else if (errno == EINVAL) {
4836 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4837 sock_cloexec_works = 0;
4838 fd = socket(family, type, proto);
4839 }
4840 }
4841 }
4842 else
4843#endif
4844 {
4845 fd = socket(family, type, proto);
4846 }
4847 Py_END_ALLOW_THREADS
4848
4849 if (fd == INVALID_SOCKET) {
4850 set_error();
4851 return -1;
4852 }
4853
4854 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4855 SOCKETCLOSE(fd);
4856 return -1;
4857 }
4858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004860 if (init_sockobject(s, fd, family, type, proto) == -1) {
4861 SOCKETCLOSE(fd);
4862 return -1;
4863 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004866
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004867}
4868
4869
Guido van Rossumb6775db1994-08-01 11:34:53 +00004870/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004871
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004872static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4874 "_socket.socket", /* tp_name */
4875 sizeof(PySocketSockObject), /* tp_basicsize */
4876 0, /* tp_itemsize */
4877 (destructor)sock_dealloc, /* tp_dealloc */
4878 0, /* tp_print */
4879 0, /* tp_getattr */
4880 0, /* tp_setattr */
4881 0, /* tp_reserved */
4882 (reprfunc)sock_repr, /* tp_repr */
4883 0, /* tp_as_number */
4884 0, /* tp_as_sequence */
4885 0, /* tp_as_mapping */
4886 0, /* tp_hash */
4887 0, /* tp_call */
4888 0, /* tp_str */
4889 PyObject_GenericGetAttr, /* tp_getattro */
4890 0, /* tp_setattro */
4891 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004892 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4893 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 sock_doc, /* tp_doc */
4895 0, /* tp_traverse */
4896 0, /* tp_clear */
4897 0, /* tp_richcompare */
4898 0, /* tp_weaklistoffset */
4899 0, /* tp_iter */
4900 0, /* tp_iternext */
4901 sock_methods, /* tp_methods */
4902 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004903 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 0, /* tp_base */
4905 0, /* tp_dict */
4906 0, /* tp_descr_get */
4907 0, /* tp_descr_set */
4908 0, /* tp_dictoffset */
4909 sock_initobj, /* tp_init */
4910 PyType_GenericAlloc, /* tp_alloc */
4911 sock_new, /* tp_new */
4912 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004913 0, /* tp_is_gc */
4914 0, /* tp_bases */
4915 0, /* tp_mro */
4916 0, /* tp_cache */
4917 0, /* tp_subclasses */
4918 0, /* tp_weaklist */
4919 0, /* tp_del */
4920 0, /* tp_version_tag */
4921 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004922};
4923
Guido van Rossum30a685f1991-06-27 15:51:29 +00004924
Guido van Rossum81194471991-07-27 21:42:02 +00004925/* Python interface to gethostname(). */
4926
4927/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004928static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004929socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004930{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004931#ifdef MS_WINDOWS
4932 /* Don't use winsock's gethostname, as this returns the ANSI
4933 version of the hostname, whereas we need a Unicode string.
4934 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004935 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004936 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004937 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004938 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004939
4940 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004941 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004942
4943 if (GetLastError() != ERROR_MORE_DATA)
4944 return PyErr_SetFromWindowsErr(0);
4945
4946 if (size == 0)
4947 return PyUnicode_New(0, 0);
4948
4949 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4950 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004951 name = PyMem_New(wchar_t, size);
4952 if (!name) {
4953 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004954 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004955 }
Victor Stinner74168972011-11-17 01:11:36 +01004956 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4957 name,
4958 &size))
4959 {
4960 PyMem_Free(name);
4961 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004962 }
Victor Stinner74168972011-11-17 01:11:36 +01004963
4964 result = PyUnicode_FromWideChar(name, size);
4965 PyMem_Free(name);
4966 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004967#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 char buf[1024];
4969 int res;
4970 Py_BEGIN_ALLOW_THREADS
4971 res = gethostname(buf, (int) sizeof buf - 1);
4972 Py_END_ALLOW_THREADS
4973 if (res < 0)
4974 return set_error();
4975 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004976 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004977#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004978}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004979
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004980PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004981"gethostname() -> string\n\
4982\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004983Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004984
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004985#ifdef HAVE_SETHOSTNAME
4986PyDoc_STRVAR(sethostname_doc,
4987"sethostname(name)\n\n\
4988Sets the hostname to name.");
4989
4990static PyObject *
4991socket_sethostname(PyObject *self, PyObject *args)
4992{
4993 PyObject *hnobj;
4994 Py_buffer buf;
4995 int res, flag = 0;
4996
Christian Heimesd2774c72013-06-19 02:06:29 +02004997#ifdef _AIX
4998/* issue #18259, not declared in any useful header file */
4999extern int sethostname(const char *, size_t);
5000#endif
5001
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005002 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5003 PyErr_Clear();
5004 if (!PyArg_ParseTuple(args, "O&:sethostname",
5005 PyUnicode_FSConverter, &hnobj))
5006 return NULL;
5007 flag = 1;
5008 }
5009 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5010 if (!res) {
5011 res = sethostname(buf.buf, buf.len);
5012 PyBuffer_Release(&buf);
5013 }
5014 if (flag)
5015 Py_DECREF(hnobj);
5016 if (res)
5017 return set_error();
5018 Py_RETURN_NONE;
5019}
5020#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005021
Guido van Rossum30a685f1991-06-27 15:51:29 +00005022/* Python interface to gethostbyname(name). */
5023
5024/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005025static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005026socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 char *name;
5029 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005030 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005031
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005032 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 return NULL;
5034 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005035 goto finally;
5036 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5037finally:
5038 PyMem_Free(name);
5039 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005040}
5041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005042PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005043"gethostbyname(host) -> address\n\
5044\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005045Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005046
5047
Victor Stinner72400302016-01-28 15:41:01 +01005048static PyObject*
5049sock_decode_hostname(const char *name)
5050{
5051#ifdef MS_WINDOWS
5052 /* Issue #26227: gethostbyaddr() returns a string encoded
5053 * to the ANSI code page */
5054 return PyUnicode_DecodeFSDefault(name);
5055#else
5056 /* Decode from UTF-8 */
5057 return PyUnicode_FromString(name);
5058#endif
5059}
5060
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005061/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5062
5063static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005064gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 char **pch;
5067 PyObject *rtn_tuple = (PyObject *)NULL;
5068 PyObject *name_list = (PyObject *)NULL;
5069 PyObject *addr_list = (PyObject *)NULL;
5070 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005071 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 if (h == NULL) {
5074 /* Let's get real error message to return */
5075 set_herror(h_errno);
5076 return NULL;
5077 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 if (h->h_addrtype != af) {
5080 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005081 errno = EAFNOSUPPORT;
5082 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 return NULL;
5084 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 case AF_INET:
5089 if (alen < sizeof(struct sockaddr_in))
5090 return NULL;
5091 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005092
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005093#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 case AF_INET6:
5095 if (alen < sizeof(struct sockaddr_in6))
5096 return NULL;
5097 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005098#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 if ((name_list = PyList_New(0)) == NULL)
5103 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 if ((addr_list = PyList_New(0)) == NULL)
5106 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 /* SF #1511317: h_aliases can be NULL */
5109 if (h->h_aliases) {
5110 for (pch = h->h_aliases; *pch != NULL; pch++) {
5111 int status;
5112 tmp = PyUnicode_FromString(*pch);
5113 if (tmp == NULL)
5114 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 status = PyList_Append(name_list, tmp);
5117 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 if (status)
5120 goto err;
5121 }
5122 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5125 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 case AF_INET:
5130 {
5131 struct sockaddr_in sin;
5132 memset(&sin, 0, sizeof(sin));
5133 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005134#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5138 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 if (pch == h->h_addr_list && alen >= sizeof(sin))
5141 memcpy((char *) addr, &sin, sizeof(sin));
5142 break;
5143 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005144
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005145#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 case AF_INET6:
5147 {
5148 struct sockaddr_in6 sin6;
5149 memset(&sin6, 0, sizeof(sin6));
5150 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005151#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5155 tmp = makeipaddr((struct sockaddr *)&sin6,
5156 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5159 memcpy((char *) addr, &sin6, sizeof(sin6));
5160 break;
5161 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005162#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005165 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 "unsupported address family");
5167 return NULL;
5168 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 if (tmp == NULL)
5171 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 status = PyList_Append(addr_list, tmp);
5174 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 if (status)
5177 goto err;
5178 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005179
Victor Stinner72400302016-01-28 15:41:01 +01005180 name = sock_decode_hostname(h->h_name);
5181 if (name == NULL)
5182 goto err;
5183 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005184
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005185 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 Py_XDECREF(name_list);
5187 Py_XDECREF(addr_list);
5188 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005189}
5190
5191
5192/* Python interface to gethostbyname_ex(name). */
5193
5194/*ARGSUSED*/
5195static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005196socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 char *name;
5199 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005200 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005202 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005203#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005205#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005207#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 char buf[16384];
5209 int buf_len = (sizeof buf) - 1;
5210 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005211#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005212#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005214#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005215#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005216
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005217 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005219 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005220 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005222#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005223#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005224 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005226#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005228#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 memset((void *) &data, '\0', sizeof(data));
5230 result = gethostbyname_r(name, &hp_allocated, &data);
5231 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005232#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005233#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005234#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005236#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005237 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005239#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 Py_END_ALLOW_THREADS
5241 /* Some C libraries would require addr.__ss_family instead of
5242 addr.ss_family.
5243 Therefore, we cast the sockaddr_storage into sockaddr to
5244 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005245 sa = SAS2SA(&addr);
5246 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005248#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005250#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005251finally:
5252 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005254}
5255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005256PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005257"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5258\n\
5259Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005260for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005261
5262
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005263/* Python interface to gethostbyaddr(IP). */
5264
5265/*ARGSUSED*/
5266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005267socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005268{
Charles-François Natali8b759652011-12-23 16:44:51 +01005269 sock_addr_t addr;
5270 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 char *ip_num;
5272 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005273 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005274#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005276#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005278#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 /* glibcs up to 2.10 assume that the buf argument to
5280 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5281 does not ensure. The attribute below instructs the compiler
5282 to maintain this alignment. */
5283 char buf[16384] Py_ALIGNED(8);
5284 int buf_len = (sizeof buf) - 1;
5285 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005286#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005287#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005289#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005290#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 char *ap;
5292 int al;
5293 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005294
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005295 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 return NULL;
5297 af = AF_UNSPEC;
5298 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005299 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 af = sa->sa_family;
5301 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005302 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 switch (af) {
5304 case AF_INET:
5305 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5306 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5307 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005308#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 case AF_INET6:
5310 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5311 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5312 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005315 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005316 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 }
5318 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005319#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005320#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005321 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 &hp_allocated, buf, buf_len,
5323 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005324#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 h = gethostbyaddr_r(ap, al, af,
5326 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005327#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 memset((void *) &data, '\0', sizeof(data));
5329 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5330 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005331#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005332#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005333#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005335#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005336 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005338#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005340 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005341#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005343#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005344finally:
5345 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005347}
5348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005349PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005350"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5351\n\
5352Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005353for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005354
Guido van Rossum30a685f1991-06-27 15:51:29 +00005355
5356/* Python interface to getservbyname(name).
5357 This only returns the port number, since the other info is already
5358 known or not useful (like the list of aliases). */
5359
5360/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005361static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005362socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 char *name, *proto=NULL;
5365 struct servent *sp;
5366 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5367 return NULL;
5368 Py_BEGIN_ALLOW_THREADS
5369 sp = getservbyname(name, proto);
5370 Py_END_ALLOW_THREADS
5371 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005372 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 return NULL;
5374 }
5375 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005376}
5377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005378PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005379"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005380\n\
5381Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005382The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5383otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005384
Guido van Rossum30a685f1991-06-27 15:51:29 +00005385
Barry Warsaw11b91a02004-06-28 00:50:43 +00005386/* Python interface to getservbyport(port).
5387 This only returns the service name, since the other info is already
5388 known or not useful (like the list of aliases). */
5389
5390/*ARGSUSED*/
5391static PyObject *
5392socket_getservbyport(PyObject *self, PyObject *args)
5393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 int port;
5395 char *proto=NULL;
5396 struct servent *sp;
5397 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5398 return NULL;
5399 if (port < 0 || port > 0xffff) {
5400 PyErr_SetString(
5401 PyExc_OverflowError,
5402 "getservbyport: port must be 0-65535.");
5403 return NULL;
5404 }
5405 Py_BEGIN_ALLOW_THREADS
5406 sp = getservbyport(htons((short)port), proto);
5407 Py_END_ALLOW_THREADS
5408 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005409 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 return NULL;
5411 }
5412 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005413}
5414
5415PyDoc_STRVAR(getservbyport_doc,
5416"getservbyport(port[, protocolname]) -> string\n\
5417\n\
5418Return the service name from a port number and protocol name.\n\
5419The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5420otherwise any protocol will match.");
5421
Guido van Rossum3901d851996-12-19 16:35:04 +00005422/* Python interface to getprotobyname(name).
5423 This only returns the protocol number, since the other info is
5424 already known or not useful (like the list of aliases). */
5425
5426/*ARGSUSED*/
5427static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005428socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 char *name;
5431 struct protoent *sp;
5432 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5433 return NULL;
5434 Py_BEGIN_ALLOW_THREADS
5435 sp = getprotobyname(name);
5436 Py_END_ALLOW_THREADS
5437 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005438 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 return NULL;
5440 }
5441 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005442}
5443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005444PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005445"getprotobyname(name) -> integer\n\
5446\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005447Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005448
Guido van Rossum3901d851996-12-19 16:35:04 +00005449
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005450#ifndef NO_DUP
5451/* dup() function for socket fds */
5452
5453static PyObject *
5454socket_dup(PyObject *self, PyObject *fdobj)
5455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 SOCKET_T fd, newfd;
5457 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005458#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005459 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005460#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 fd = PyLong_AsSocket_t(fdobj);
5463 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5464 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005465
Victor Stinnerdaf45552013-08-28 00:53:59 +02005466#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005467 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005468 return set_error();
5469
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005470 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005471 FROM_PROTOCOL_INFO,
5472 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 if (newfd == INVALID_SOCKET)
5474 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005475
Victor Stinnerdaf45552013-08-28 00:53:59 +02005476 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5477 closesocket(newfd);
5478 PyErr_SetFromWindowsErr(0);
5479 return NULL;
5480 }
5481#else
5482 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5483 newfd = _Py_dup(fd);
5484 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005485 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005486#endif
5487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 newfdobj = PyLong_FromSocket_t(newfd);
5489 if (newfdobj == NULL)
5490 SOCKETCLOSE(newfd);
5491 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005492}
5493
5494PyDoc_STRVAR(dup_doc,
5495"dup(integer) -> integer\n\
5496\n\
5497Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5498sockets; on some platforms os.dup() won't work for socket file descriptors.");
5499#endif
5500
5501
Dave Cole331708b2004-08-09 04:51:41 +00005502#ifdef HAVE_SOCKETPAIR
5503/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005504 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005505 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005506
5507/*ARGSUSED*/
5508static PyObject *
5509socket_socketpair(PyObject *self, PyObject *args)
5510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 PySocketSockObject *s0 = NULL, *s1 = NULL;
5512 SOCKET_T sv[2];
5513 int family, type = SOCK_STREAM, proto = 0;
5514 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005515#ifdef SOCK_CLOEXEC
5516 int *atomic_flag_works = &sock_cloexec_works;
5517#else
5518 int *atomic_flag_works = NULL;
5519#endif
5520 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005521
5522#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005524#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5528 &family, &type, &proto))
5529 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005532 Py_BEGIN_ALLOW_THREADS
5533#ifdef SOCK_CLOEXEC
5534 if (sock_cloexec_works != 0) {
5535 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5536 if (sock_cloexec_works == -1) {
5537 if (ret >= 0) {
5538 sock_cloexec_works = 1;
5539 }
5540 else if (errno == EINVAL) {
5541 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5542 sock_cloexec_works = 0;
5543 ret = socketpair(family, type, proto, sv);
5544 }
5545 }
5546 }
5547 else
5548#endif
5549 {
5550 ret = socketpair(family, type, proto, sv);
5551 }
5552 Py_END_ALLOW_THREADS
5553
5554 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005556
5557 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5558 goto finally;
5559 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5560 goto finally;
5561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 s0 = new_sockobject(sv[0], family, type, proto);
5563 if (s0 == NULL)
5564 goto finally;
5565 s1 = new_sockobject(sv[1], family, type, proto);
5566 if (s1 == NULL)
5567 goto finally;
5568 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005569
5570finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 if (res == NULL) {
5572 if (s0 == NULL)
5573 SOCKETCLOSE(sv[0]);
5574 if (s1 == NULL)
5575 SOCKETCLOSE(sv[1]);
5576 }
5577 Py_XDECREF(s0);
5578 Py_XDECREF(s1);
5579 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005580}
5581
5582PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005583"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005584\n\
5585Create a pair of socket objects from the sockets returned by the platform\n\
5586socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005587The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005588AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005589
5590#endif /* HAVE_SOCKETPAIR */
5591
5592
Guido van Rossum006bf911996-06-12 04:04:55 +00005593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005594socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005595{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005596 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005597
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005598 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 return NULL;
5600 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005601 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005603 "ntohs: can't convert negative Python int to C "
5604 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 return NULL;
5606 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005607 if (x > 0xffff) {
5608 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5609 "ntohs: Python int too large to convert to C "
5610 "16-bit unsigned integer (The silent truncation "
5611 "is deprecated)",
5612 1)) {
5613 return NULL;
5614 }
5615 }
5616 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005617}
5618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005619PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005620"ntohs(integer) -> integer\n\
5621\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005622Convert a 16-bit unsigned integer from network to host byte order.\n\
5623Note that in case the received integer does not fit in 16-bit unsigned\n\
5624integer, but does fit in a positive C int, it is silently truncated to\n\
562516-bit unsigned integer.\n\
5626However, this silent truncation feature is deprecated, and will raise an \n\
5627exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005628
5629
Guido van Rossum006bf911996-06-12 04:04:55 +00005630static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005631socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 if (PyLong_Check(arg)) {
5636 x = PyLong_AsUnsignedLong(arg);
5637 if (x == (unsigned long) -1 && PyErr_Occurred())
5638 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005639#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 {
5641 unsigned long y;
5642 /* only want the trailing 32 bits */
5643 y = x & 0xFFFFFFFFUL;
5644 if (y ^ x)
5645 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005646 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 x = y;
5648 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 }
5651 else
5652 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005653 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005656}
5657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005658PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005659"ntohl(integer) -> integer\n\
5660\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005661Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005662
5663
Guido van Rossum006bf911996-06-12 04:04:55 +00005664static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005665socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005666{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005667 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005668
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005669 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 return NULL;
5671 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005672 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005674 "htons: can't convert negative Python int to C "
5675 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 return NULL;
5677 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005678 if (x > 0xffff) {
5679 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5680 "htons: Python int too large to convert to C "
5681 "16-bit unsigned integer (The silent truncation "
5682 "is deprecated)",
5683 1)) {
5684 return NULL;
5685 }
5686 }
5687 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005688}
5689
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005690PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005691"htons(integer) -> integer\n\
5692\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005693Convert a 16-bit unsigned integer from host to network byte order.\n\
5694Note that in case the received integer does not fit in 16-bit unsigned\n\
5695integer, but does fit in a positive C int, it is silently truncated to\n\
569616-bit unsigned integer.\n\
5697However, this silent truncation feature is deprecated, and will raise an \n\
5698exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005699
5700
Guido van Rossum006bf911996-06-12 04:04:55 +00005701static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005702socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 if (PyLong_Check(arg)) {
5707 x = PyLong_AsUnsignedLong(arg);
5708 if (x == (unsigned long) -1 && PyErr_Occurred())
5709 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005710#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 {
5712 unsigned long y;
5713 /* only want the trailing 32 bits */
5714 y = x & 0xFFFFFFFFUL;
5715 if (y ^ x)
5716 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005717 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 x = y;
5719 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 }
5722 else
5723 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005724 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 Py_TYPE(arg)->tp_name);
5726 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005727}
5728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005729PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005730"htonl(integer) -> integer\n\
5731\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005732Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005733
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005734/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005736PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005737"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005738\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005739Convert 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 +00005740binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005741
5742static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005743socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005744{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005745#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005747#endif
5748
5749#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005750#if (SIZEOF_INT != 4)
5751#error "Not sure if in_addr_t exists and int is not 32-bits."
5752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 /* Have to use inet_addr() instead */
5754 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5759 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005760
Tim Peters1df9fdd2003-02-13 03:13:40 +00005761
5762#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005763
5764#ifdef USE_INET_ATON_WEAKLINK
5765 if (inet_aton != NULL) {
5766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767 if (inet_aton(ip_addr, &buf))
5768 return PyBytes_FromStringAndSize((char *)(&buf),
5769 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005770
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005771 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 "illegal IP address string passed to inet_aton");
5773 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005774
Thomas Wouters477c8d52006-05-27 19:21:47 +00005775#ifdef USE_INET_ATON_WEAKLINK
5776 } else {
5777#endif
5778
5779#endif
5780
5781#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 /* special-case this address as inet_addr might return INADDR_NONE
5784 * for this */
5785 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005786 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005788
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005789 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005793 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 "illegal IP address string passed to inet_aton");
5795 return NULL;
5796 }
5797 }
5798 return PyBytes_FromStringAndSize((char *) &packed_addr,
5799 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005800
5801#ifdef USE_INET_ATON_WEAKLINK
5802 }
5803#endif
5804
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005805#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005806}
5807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005808PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005809"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005810\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005811Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005812
5813static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005814socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005815{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005816 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005818
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005819 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 return NULL;
5821 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005822
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005823 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005824 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005826 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 return NULL;
5828 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005829
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005830 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5831 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005832
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005833 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005835}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005836
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005837#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005838
5839PyDoc_STRVAR(inet_pton_doc,
5840"inet_pton(af, ip) -> packed IP address string\n\
5841\n\
5842Convert an IP address from string format to a packed string suitable\n\
5843for use with low-level network functions.");
5844
5845static PyObject *
5846socket_inet_pton(PyObject *self, PyObject *args)
5847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 int af;
5849 char* ip;
5850 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005851#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005852 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005853#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5857 return NULL;
5858 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005859
Martin v. Löwis04697e82004-06-02 12:35:29 +00005860#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005862 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 "can't use AF_INET6, IPv6 is disabled");
5864 return NULL;
5865 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005866#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 retval = inet_pton(af, ip, packed);
5869 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005870 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 return NULL;
5872 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005873 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 "illegal IP address string passed to inet_pton");
5875 return NULL;
5876 } else if (af == AF_INET) {
5877 return PyBytes_FromStringAndSize(packed,
5878 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005879#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 } else if (af == AF_INET6) {
5881 return PyBytes_FromStringAndSize(packed,
5882 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005885 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 return NULL;
5887 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005888}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005889
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005890PyDoc_STRVAR(inet_ntop_doc,
5891"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5892\n\
5893Convert a packed IP address of the given family to string format.");
5894
5895static PyObject *
5896socket_inet_ntop(PyObject *self, PyObject *args)
5897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005899 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005901#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005902 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005905#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5908 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005909
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005910 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 return NULL;
5912 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005915 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 PyErr_SetString(PyExc_ValueError,
5917 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005918 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 return NULL;
5920 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005921#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005923 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 PyErr_SetString(PyExc_ValueError,
5925 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005926 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 return NULL;
5928 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 } else {
5931 PyErr_Format(PyExc_ValueError,
5932 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005933 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 return NULL;
5935 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005936
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005937 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5938 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005940 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 return NULL;
5942 } else {
5943 return PyUnicode_FromString(retval);
5944 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005945}
5946
5947#endif /* HAVE_INET_PTON */
5948
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005949/* Python interface to getaddrinfo(host, port). */
5950
5951/*ARGSUSED*/
5952static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005953socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005954{
Victor Stinner77af1722011-05-26 14:05:59 +02005955 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005956 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 struct addrinfo hints, *res;
5958 struct addrinfo *res0 = NULL;
5959 PyObject *hobj = NULL;
5960 PyObject *pobj = (PyObject *)NULL;
5961 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005962 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963 int family, socktype, protocol, flags;
5964 int error;
5965 PyObject *all = (PyObject *)NULL;
5966 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005967
Georg Brandl6083a4b2013-10-14 06:51:46 +02005968 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005970 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005971 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 &protocol, &flags)) {
5973 return NULL;
5974 }
5975 if (hobj == Py_None) {
5976 hptr = NULL;
5977 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005978 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979 if (!idna)
5980 return NULL;
5981 assert(PyBytes_Check(idna));
5982 hptr = PyBytes_AS_STRING(idna);
5983 } else if (PyBytes_Check(hobj)) {
5984 hptr = PyBytes_AsString(hobj);
5985 } else {
5986 PyErr_SetString(PyExc_TypeError,
5987 "getaddrinfo() argument 1 must be string or None");
5988 return NULL;
5989 }
5990 if (PyLong_CheckExact(pobj)) {
5991 long value = PyLong_AsLong(pobj);
5992 if (value == -1 && PyErr_Occurred())
5993 goto err;
5994 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5995 pptr = pbuf;
5996 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005997 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005998 if (pptr == NULL)
5999 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006001 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 } else if (pobj == Py_None) {
6003 pptr = (char *)NULL;
6004 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006005 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 goto err;
6007 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006008#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006009 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6010 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006011 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6012 * This workaround avoids a segfault in libsystem.
6013 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006014 pptr = "00";
6015 }
6016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 memset(&hints, 0, sizeof(hints));
6018 hints.ai_family = family;
6019 hints.ai_socktype = socktype;
6020 hints.ai_protocol = protocol;
6021 hints.ai_flags = flags;
6022 Py_BEGIN_ALLOW_THREADS
6023 ACQUIRE_GETADDRINFO_LOCK
6024 error = getaddrinfo(hptr, pptr, &hints, &res0);
6025 Py_END_ALLOW_THREADS
6026 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6027 if (error) {
6028 set_gaierror(error);
6029 goto err;
6030 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006031
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006032 all = PyList_New(0);
6033 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 goto err;
6035 for (res = res0; res; res = res->ai_next) {
6036 PyObject *single;
6037 PyObject *addr =
6038 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6039 if (addr == NULL)
6040 goto err;
6041 single = Py_BuildValue("iiisO", res->ai_family,
6042 res->ai_socktype, res->ai_protocol,
6043 res->ai_canonname ? res->ai_canonname : "",
6044 addr);
6045 Py_DECREF(addr);
6046 if (single == NULL)
6047 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 if (PyList_Append(all, single))
6050 goto err;
6051 Py_XDECREF(single);
6052 }
6053 Py_XDECREF(idna);
6054 if (res0)
6055 freeaddrinfo(res0);
6056 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006057 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 Py_XDECREF(all);
6059 Py_XDECREF(idna);
6060 if (res0)
6061 freeaddrinfo(res0);
6062 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006063}
6064
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006065PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006066"getaddrinfo(host, port [, family, type, proto, flags])\n\
6067 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006068\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006069Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006070
6071/* Python interface to getnameinfo(sa, flags). */
6072
6073/*ARGSUSED*/
6074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006075socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 PyObject *sa = (PyObject *)NULL;
6078 int flags;
6079 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006080 int port;
6081 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6083 struct addrinfo hints, *res = NULL;
6084 int error;
6085 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006086 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 flags = flowinfo = scope_id = 0;
6089 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6090 return NULL;
6091 if (!PyTuple_Check(sa)) {
6092 PyErr_SetString(PyExc_TypeError,
6093 "getnameinfo() argument 1 must be a tuple");
6094 return NULL;
6095 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006096 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006098 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006100 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006101 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006102 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006103 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006104 return NULL;
6105 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6107 memset(&hints, 0, sizeof(hints));
6108 hints.ai_family = AF_UNSPEC;
6109 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006110 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 Py_BEGIN_ALLOW_THREADS
6112 ACQUIRE_GETADDRINFO_LOCK
6113 error = getaddrinfo(hostp, pbuf, &hints, &res);
6114 Py_END_ALLOW_THREADS
6115 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6116 if (error) {
6117 set_gaierror(error);
6118 goto fail;
6119 }
6120 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006121 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 "sockaddr resolved to multiple addresses");
6123 goto fail;
6124 }
6125 switch (res->ai_family) {
6126 case AF_INET:
6127 {
6128 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006129 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 "IPv4 sockaddr must be 2 tuple");
6131 goto fail;
6132 }
6133 break;
6134 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006135#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 case AF_INET6:
6137 {
6138 struct sockaddr_in6 *sin6;
6139 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006140 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 sin6->sin6_scope_id = scope_id;
6142 break;
6143 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006146 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6148 if (error) {
6149 set_gaierror(error);
6150 goto fail;
6151 }
Victor Stinner72400302016-01-28 15:41:01 +01006152
6153 name = sock_decode_hostname(hbuf);
6154 if (name == NULL)
6155 goto fail;
6156 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006157
6158fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 if (res)
6160 freeaddrinfo(res);
6161 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006162}
6163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006164PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006165"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006166\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006167Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006168
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006169
6170/* Python API to getting and setting the default timeout value. */
6171
6172static PyObject *
6173socket_getdefaulttimeout(PyObject *self)
6174{
Victor Stinner71694d52015-03-28 01:18:54 +01006175 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006176 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 }
Victor Stinner71694d52015-03-28 01:18:54 +01006178 else {
6179 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6180 return PyFloat_FromDouble(seconds);
6181 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006182}
6183
6184PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006185"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006186\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006187Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006188A value of None indicates that new socket objects have no timeout.\n\
6189When the socket module is first imported, the default is None.");
6190
6191static PyObject *
6192socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6193{
Victor Stinner71694d52015-03-28 01:18:54 +01006194 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006195
Victor Stinner71694d52015-03-28 01:18:54 +01006196 if (socket_parse_timeout(&timeout, arg) < 0)
6197 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006200
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006201 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006202}
6203
6204PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006205"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006206\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006207Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006208A value of None indicates that new socket objects have no timeout.\n\
6209When the socket module is first imported, the default is None.");
6210
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006211#ifdef HAVE_IF_NAMEINDEX
6212/* Python API for getting interface indices and names */
6213
6214static PyObject *
6215socket_if_nameindex(PyObject *self, PyObject *arg)
6216{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006217 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006218 int i;
6219 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006220
Charles-François Natali60713592011-05-20 16:55:06 +02006221 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006222 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006223 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006224 return NULL;
6225 }
6226
6227 list = PyList_New(0);
6228 if (list == NULL) {
6229 if_freenameindex(ni);
6230 return NULL;
6231 }
6232
Charles-François Natali60713592011-05-20 16:55:06 +02006233 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6234 PyObject *ni_tuple = Py_BuildValue("IO&",
6235 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006236
6237 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6238 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006239 Py_DECREF(list);
6240 if_freenameindex(ni);
6241 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006242 }
6243 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006244 }
6245
6246 if_freenameindex(ni);
6247 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006248}
6249
6250PyDoc_STRVAR(if_nameindex_doc,
6251"if_nameindex()\n\
6252\n\
6253Returns a list of network interface information (index, name) tuples.");
6254
Charles-François Natali60713592011-05-20 16:55:06 +02006255static PyObject *
6256socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006257{
Charles-François Natali60713592011-05-20 16:55:06 +02006258 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006259 unsigned long index;
6260
Charles-François Natali60713592011-05-20 16:55:06 +02006261 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6262 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006263 return NULL;
6264
Charles-François Natali60713592011-05-20 16:55:06 +02006265 index = if_nametoindex(PyBytes_AS_STRING(oname));
6266 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006267 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006268 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006269 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006270 return NULL;
6271 }
6272
6273 return PyLong_FromUnsignedLong(index);
6274}
6275
6276PyDoc_STRVAR(if_nametoindex_doc,
6277"if_nametoindex(if_name)\n\
6278\n\
6279Returns the interface index corresponding to the interface name if_name.");
6280
Charles-François Natali60713592011-05-20 16:55:06 +02006281static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006282socket_if_indextoname(PyObject *self, PyObject *arg)
6283{
Charles-François Natali60713592011-05-20 16:55:06 +02006284 unsigned long index;
6285 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006286
Charles-François Natali60713592011-05-20 16:55:06 +02006287 index = PyLong_AsUnsignedLong(arg);
6288 if (index == (unsigned long) -1)
6289 return NULL;
6290
6291 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006292 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006293 return NULL;
6294 }
6295
Charles-François Natali60713592011-05-20 16:55:06 +02006296 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006297}
6298
6299PyDoc_STRVAR(if_indextoname_doc,
6300"if_indextoname(if_index)\n\
6301\n\
6302Returns the interface name corresponding to the interface index if_index.");
6303
6304#endif /* HAVE_IF_NAMEINDEX */
6305
6306
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006307#ifdef CMSG_LEN
6308/* Python interface to CMSG_LEN(length). */
6309
6310static PyObject *
6311socket_CMSG_LEN(PyObject *self, PyObject *args)
6312{
6313 Py_ssize_t length;
6314 size_t result;
6315
6316 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6317 return NULL;
6318 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6319 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6320 return NULL;
6321 }
6322 return PyLong_FromSize_t(result);
6323}
6324
6325PyDoc_STRVAR(CMSG_LEN_doc,
6326"CMSG_LEN(length) -> control message length\n\
6327\n\
6328Return the total length, without trailing padding, of an ancillary\n\
6329data item with associated data of the given length. This value can\n\
6330often be used as the buffer size for recvmsg() to receive a single\n\
6331item of ancillary data, but RFC 3542 requires portable applications to\n\
6332use CMSG_SPACE() and thus include space for padding, even when the\n\
6333item will be the last in the buffer. Raises OverflowError if length\n\
6334is outside the permissible range of values.");
6335
6336
6337#ifdef CMSG_SPACE
6338/* Python interface to CMSG_SPACE(length). */
6339
6340static PyObject *
6341socket_CMSG_SPACE(PyObject *self, PyObject *args)
6342{
6343 Py_ssize_t length;
6344 size_t result;
6345
6346 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6347 return NULL;
6348 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6349 PyErr_SetString(PyExc_OverflowError,
6350 "CMSG_SPACE() argument out of range");
6351 return NULL;
6352 }
6353 return PyLong_FromSize_t(result);
6354}
6355
6356PyDoc_STRVAR(CMSG_SPACE_doc,
6357"CMSG_SPACE(length) -> buffer size\n\
6358\n\
6359Return the buffer size needed for recvmsg() to receive an ancillary\n\
6360data item with associated data of the given length, along with any\n\
6361trailing padding. The buffer space needed to receive multiple items\n\
6362is the sum of the CMSG_SPACE() values for their associated data\n\
6363lengths. Raises OverflowError if length is outside the permissible\n\
6364range of values.");
6365#endif /* CMSG_SPACE */
6366#endif /* CMSG_LEN */
6367
6368
Guido van Rossum30a685f1991-06-27 15:51:29 +00006369/* List of functions exported by this module. */
6370
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006371static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 {"gethostbyname", socket_gethostbyname,
6373 METH_VARARGS, gethostbyname_doc},
6374 {"gethostbyname_ex", socket_gethostbyname_ex,
6375 METH_VARARGS, ghbn_ex_doc},
6376 {"gethostbyaddr", socket_gethostbyaddr,
6377 METH_VARARGS, gethostbyaddr_doc},
6378 {"gethostname", socket_gethostname,
6379 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006380#ifdef HAVE_SETHOSTNAME
6381 {"sethostname", socket_sethostname,
6382 METH_VARARGS, sethostname_doc},
6383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 {"getservbyname", socket_getservbyname,
6385 METH_VARARGS, getservbyname_doc},
6386 {"getservbyport", socket_getservbyport,
6387 METH_VARARGS, getservbyport_doc},
6388 {"getprotobyname", socket_getprotobyname,
6389 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006390#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 {"dup", socket_dup,
6392 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006393#endif
Dave Cole331708b2004-08-09 04:51:41 +00006394#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 {"socketpair", socket_socketpair,
6396 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 {"ntohs", socket_ntohs,
6399 METH_VARARGS, ntohs_doc},
6400 {"ntohl", socket_ntohl,
6401 METH_O, ntohl_doc},
6402 {"htons", socket_htons,
6403 METH_VARARGS, htons_doc},
6404 {"htonl", socket_htonl,
6405 METH_O, htonl_doc},
6406 {"inet_aton", socket_inet_aton,
6407 METH_VARARGS, inet_aton_doc},
6408 {"inet_ntoa", socket_inet_ntoa,
6409 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006410#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 {"inet_pton", socket_inet_pton,
6412 METH_VARARGS, inet_pton_doc},
6413 {"inet_ntop", socket_inet_ntop,
6414 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006415#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006416 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6417 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 {"getnameinfo", socket_getnameinfo,
6419 METH_VARARGS, getnameinfo_doc},
6420 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6421 METH_NOARGS, getdefaulttimeout_doc},
6422 {"setdefaulttimeout", socket_setdefaulttimeout,
6423 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006424#ifdef HAVE_IF_NAMEINDEX
6425 {"if_nameindex", socket_if_nameindex,
6426 METH_NOARGS, if_nameindex_doc},
6427 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006428 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006429 {"if_indextoname", socket_if_indextoname,
6430 METH_O, if_indextoname_doc},
6431#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006432#ifdef CMSG_LEN
6433 {"CMSG_LEN", socket_CMSG_LEN,
6434 METH_VARARGS, CMSG_LEN_doc},
6435#ifdef CMSG_SPACE
6436 {"CMSG_SPACE", socket_CMSG_SPACE,
6437 METH_VARARGS, CMSG_SPACE_doc},
6438#endif
6439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006441};
6442
Guido van Rossum30a685f1991-06-27 15:51:29 +00006443
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006444#ifdef MS_WINDOWS
6445#define OS_INIT_DEFINED
6446
6447/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006448
6449static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006450os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006453}
6454
6455static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006456os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 WSADATA WSAData;
6459 int ret;
6460 ret = WSAStartup(0x0101, &WSAData);
6461 switch (ret) {
6462 case 0: /* No error */
6463 Py_AtExit(os_cleanup);
6464 return 1; /* Success */
6465 case WSASYSNOTREADY:
6466 PyErr_SetString(PyExc_ImportError,
6467 "WSAStartup failed: network not ready");
6468 break;
6469 case WSAVERNOTSUPPORTED:
6470 case WSAEINVAL:
6471 PyErr_SetString(
6472 PyExc_ImportError,
6473 "WSAStartup failed: requested version not supported");
6474 break;
6475 default:
6476 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6477 break;
6478 }
6479 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006480}
6481
Guido van Rossum8d665e61996-06-26 18:22:49 +00006482#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006483
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006484
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006485
6486#ifndef OS_INIT_DEFINED
6487static int
6488os_init(void)
6489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006491}
6492#endif
6493
6494
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006495/* C API table - always add new things to the end for binary
6496 compatibility. */
6497static
6498PySocketModule_APIObject PySocketModuleAPI =
6499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006501 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006503};
6504
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006505
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006506/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006507
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006508 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006509 "socket.py" which implements some additional functionality.
6510 The import of "_socket" may fail with an ImportError exception if
6511 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006512 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006513 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006514*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006516PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006517"Implementation module for socket operations.\n\
6518\n\
6519See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006520
Martin v. Löwis1a214512008-06-11 05:26:20 +00006521static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522 PyModuleDef_HEAD_INIT,
6523 PySocket_MODULE_NAME,
6524 socket_doc,
6525 -1,
6526 socket_methods,
6527 NULL,
6528 NULL,
6529 NULL,
6530 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006531};
6532
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006533PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006534PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 if (!os_init())
6539 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006540
Victor Stinnerdaf45552013-08-28 00:53:59 +02006541#ifdef MS_WINDOWS
6542 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006543#if defined(_MSC_VER) && _MSC_VER >= 1800
6544 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6545#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006546 DWORD version = GetVersion();
6547 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6548 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6549 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006550 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6551#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006552 }
6553#endif
6554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 Py_TYPE(&sock_type) = &PyType_Type;
6556 m = PyModule_Create(&socketmodule);
6557 if (m == NULL)
6558 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006559
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006560 Py_INCREF(PyExc_OSError);
6561 PySocketModuleAPI.error = PyExc_OSError;
6562 Py_INCREF(PyExc_OSError);
6563 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006565 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 if (socket_herror == NULL)
6567 return NULL;
6568 Py_INCREF(socket_herror);
6569 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006570 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 NULL);
6572 if (socket_gaierror == NULL)
6573 return NULL;
6574 Py_INCREF(socket_gaierror);
6575 PyModule_AddObject(m, "gaierror", socket_gaierror);
6576 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006577 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 if (socket_timeout == NULL)
6579 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006580 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 Py_INCREF(socket_timeout);
6582 PyModule_AddObject(m, "timeout", socket_timeout);
6583 Py_INCREF((PyObject *)&sock_type);
6584 if (PyModule_AddObject(m, "SocketType",
6585 (PyObject *)&sock_type) != 0)
6586 return NULL;
6587 Py_INCREF((PyObject *)&sock_type);
6588 if (PyModule_AddObject(m, "socket",
6589 (PyObject *)&sock_type) != 0)
6590 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006591
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006592#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006594#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 Py_INCREF(has_ipv6);
6598 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 /* Export C API */
6601 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6602 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6603 ) != 0)
6604 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006607#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006609#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006611#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006613#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006614#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006617#endif
6618#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006620#endif
6621#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#endif
6625#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006628#endif
6629#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006632#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006633#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006636#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006637#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006641#ifdef HAVE_SOCKADDR_ALG
6642 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6643#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006644#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006647#endif
6648#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006650#endif
6651#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006654#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006655#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006658#endif
6659#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006662#endif
6663#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006666#endif
6667#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#endif
6671#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, AF_NETLINK);
6674 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006675#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006677#endif
6678#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006680#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6682 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006683#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006685#endif
6686#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006688#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006689#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006691#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006692#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006694#endif
6695#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006697#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006699#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006701#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006702#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006704#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006705#ifdef NETLINK_CRYPTO
6706 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6707#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006708#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006709
6710#ifdef AF_VSOCK
6711 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6712 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6713 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6714 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6715 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6716 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6717 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6718 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6719 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6720#endif
6721
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006722#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006725#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006726#ifdef AF_LINK
6727 PyModule_AddIntMacro(m, AF_LINK);
6728#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006729#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006732#endif
6733#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006736#endif
6737#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006740#endif
6741#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#endif
6745#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006748#endif
6749#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006752#endif
6753#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006756#endif
6757#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006760#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006761
Hye-Shik Chang81268602004-02-02 06:05:24 +00006762#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6764 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6765 PyModule_AddIntMacro(m, BTPROTO_HCI);
6766 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006767#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006769#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006770#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006771#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006773#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6775 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006776#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6779 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006780#endif
6781
Charles-François Natali47413c12011-10-06 19:47:44 +02006782#ifdef AF_CAN
6783 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006785#endif
6786#ifdef PF_CAN
6787 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006789#endif
6790
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006791/* Reliable Datagram Sockets */
6792#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006794#endif
6795#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006797#endif
6798
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006799/* Kernel event messages */
6800#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006802#endif
6803#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006805#endif
6806
Antoine Pitroub156a462010-10-27 20:13:57 +00006807#ifdef AF_PACKET
6808 PyModule_AddIntMacro(m, AF_PACKET);
6809#endif
6810#ifdef PF_PACKET
6811 PyModule_AddIntMacro(m, PF_PACKET);
6812#endif
6813#ifdef PACKET_HOST
6814 PyModule_AddIntMacro(m, PACKET_HOST);
6815#endif
6816#ifdef PACKET_BROADCAST
6817 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6818#endif
6819#ifdef PACKET_MULTICAST
6820 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6821#endif
6822#ifdef PACKET_OTHERHOST
6823 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6824#endif
6825#ifdef PACKET_OUTGOING
6826 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6827#endif
6828#ifdef PACKET_LOOPBACK
6829 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6830#endif
6831#ifdef PACKET_FASTROUTE
6832 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006833#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006834
Christian Heimes043d6f62008-01-07 17:19:16 +00006835#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6840 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6841 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006842
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6844 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6845 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, SOL_TIPC);
6849 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6850 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6851 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6852 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006853
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6855 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6856 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6857 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6861 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006862#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006865#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6867 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6868 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6869 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6870 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6871 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006872#endif
6873
Christian Heimesdffa3942016-09-05 23:54:41 +02006874#ifdef HAVE_SOCKADDR_ALG
6875 /* Socket options */
6876 PyModule_AddIntMacro(m, ALG_SET_KEY);
6877 PyModule_AddIntMacro(m, ALG_SET_IV);
6878 PyModule_AddIntMacro(m, ALG_SET_OP);
6879 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6880 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6881 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6882
6883 /* Operations */
6884 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6885 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6886 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6887 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6888#endif
6889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, SOCK_STREAM);
6892 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006893/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006894#ifdef SOCK_RAW
6895 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006897#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006899#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006901#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006902#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006904#endif
6905#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006907#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006917#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006918#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006920#endif
6921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006940#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006943#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006971#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006972#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006974#endif
6975#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006977#endif
6978#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006981#ifdef SO_PASSSEC
6982 PyModule_AddIntMacro(m, SO_PASSSEC);
6983#endif
6984#ifdef SO_PEERSEC
6985 PyModule_AddIntMacro(m, SO_PEERSEC);
6986#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006987#ifdef SO_BINDTODEVICE
6988 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6989#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006990#ifdef SO_PRIORITY
6991 PyModule_AddIntMacro(m, SO_PRIORITY);
6992#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006993#ifdef SO_MARK
6994 PyModule_AddIntMacro(m, SO_MARK);
6995#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006996#ifdef SO_DOMAIN
6997 PyModule_AddIntMacro(m, SO_DOMAIN);
6998#endif
6999#ifdef SO_PROTOCOL
7000 PyModule_AddIntMacro(m, SO_PROTOCOL);
7001#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007003 /* Maximum number of connections for "listen" */
7004#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007006#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007007 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007008#endif
7009
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007010 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007011#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007013#endif
7014#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007016#endif
7017#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007019#endif
7020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021 /* Flags for send, recv */
7022#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007025#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007052#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007054#endif
7055#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007057#endif
7058#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007060#endif
7061#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007063#endif
7064#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007066#endif
7067#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007069#endif
7070#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007072#endif
7073#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007075#endif
7076#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007078#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007079#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007081#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 /* Protocol level and numbers, usable for [gs]etsockopt */
7084#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007087#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007089#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007109#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007116#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007117#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007119#endif
7120#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7122 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007123#endif
7124#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7126 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7127 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007128
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7130 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7131 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007132#ifdef CAN_ISOTP
7133 PyModule_AddIntMacro(m, CAN_ISOTP);
7134#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007135#endif
7136#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7138 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7139 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7140 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007141#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007142#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7143 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7144#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007145#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007147 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7148 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7149 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7150 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7151 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7152 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7153 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7154 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7155 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7156 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7157 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7158 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7159#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007160#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007162#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007163#ifdef HAVE_SOCKADDR_ALG
7164 PyModule_AddIntMacro(m, SOL_ALG);
7165#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007166#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007168#endif
7169#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007171#endif
7172#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007174#endif
7175#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007177#endif
7178#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007180#endif
7181#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007186#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007214#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007225#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007284#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007285#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007290#endif
7291/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007292#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007293 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007294#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299#endif
7300
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007301#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007303#endif
7304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305 /* Some port configuration */
7306#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007308#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007315#endif
7316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 /* Some reserved IP v.4 addresses */
7318#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007330#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef INADDR_ALLHOSTS_GROUP
7339 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7340 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007341#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007346#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007351#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007353#endif
7354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 /* IPv4 [gs]etsockopt options */
7356#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007403#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007404#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007406#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7409#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007428#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007432#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007434#endif
7435#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007437#endif
7438#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#endif
7441#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007443#endif
7444#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007446#endif
7447#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007449#endif
7450#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007452#endif
7453#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007455#endif
7456#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007458#endif
7459#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#endif
7462#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007464#endif
7465#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007467#endif
7468#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#endif
7471#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007473#endif
7474#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
7477#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007479#endif
7480#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007482#endif
7483#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007485#endif
7486#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007488#endif
7489#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007491#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493 /* TCP options */
7494#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007529#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007530#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007532#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007533#ifdef TCP_CONGESTION
7534 PyModule_AddIntMacro(m, TCP_CONGESTION);
7535#endif
7536#ifdef TCP_USER_TIMEOUT
7537 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7538#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007539#ifdef TCP_NOTSENT_LOWAT
7540 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7541#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007543 /* IPX options */
7544#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007546#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007547
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007548/* Reliable Datagram Sockets */
7549#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007551#endif
7552#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007554#endif
7555#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007557#endif
7558#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007560#endif
7561#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007563#endif
7564#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007566#endif
7567#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007569#endif
7570#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007572#endif
7573#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007575#endif
7576#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007578#endif
7579#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007581#endif
7582#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007584#endif
7585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007589#endif
7590#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007592#endif
7593#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007595#endif
7596#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007598#endif
7599#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007611#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007613#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007614#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#endif
7617#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
7620#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#endif
7623#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007625#endif
7626#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007628#endif
7629#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007634#endif
7635#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007637#endif
7638#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007640#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007641#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007643#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007644#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007646#endif
7647#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#endif
7650#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007652#endif
7653#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007655#endif
7656#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007658#endif
7659#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007661#endif
7662#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007664#endif
7665#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007667#endif
7668#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007670#endif
7671#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#endif
7674#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007676#endif
7677#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007679#endif
7680#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007682#endif
7683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007685#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007687#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007688 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007689#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007691#endif
7692#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007694#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007695 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007697 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007698#endif
7699#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007700 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007701#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007702 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007705#endif
7706
Christian Heimesfaf2f632008-01-06 16:59:19 +00007707#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007708 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007709 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7710#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007711 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007712#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007713 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007714 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7715#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007716 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007717#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007718 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007719 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007720 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007721 PyObject *tmp;
7722 tmp = PyLong_FromUnsignedLong(codes[i]);
7723 if (tmp == NULL)
7724 return NULL;
7725 PyModule_AddObject(m, names[i], tmp);
7726 }
7727 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007728 PyModule_AddIntMacro(m, RCVALL_OFF);
7729 PyModule_AddIntMacro(m, RCVALL_ON);
7730 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007731#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007732 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007733#endif
7734#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007736#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007737#endif /* _MSTCPIP_ */
7738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007739 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007740#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007741 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007743 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007744}