blob: 91c879f9d6355fb97a33e87765f00cf94cd2c101 [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
Serhiy Storchakad3187152017-11-09 18:00:38 +0200230#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001235#endif /* ENABLE_IPV6 */
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));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001274#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 PyObject *ret = NULL;
1276 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1277 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001278#endif /* !(__NetBSD__ || __DragonFly__) */
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001287#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 default:
1290 PyErr_SetString(PyExc_ValueError,
1291 "Unknown Bluetooth protocol");
1292 return NULL;
1293 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001294#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295
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;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001300 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001316#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001349#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001350
Serhiy Storchakad3187152017-11-09 18:00:38 +02001351#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001352 case AF_CAN:
1353 {
1354 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001355 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001356 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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001373#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001374 default:
1375 {
1376 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1377 ifname);
1378 }
1379 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001380 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001381#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001382
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001392#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001393 default:
1394 PyErr_SetString(PyExc_ValueError,
1395 "Invalid address type");
1396 return 0;
1397 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001398#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001399
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001414#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001415
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001580#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001581
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001605#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001606
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 */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001611#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001612
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001693#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001694
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;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001702 const 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;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001722 const 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__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001742 const char *straddr;
1743 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1744 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001745 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001746 "wrong format");
1747 return 0;
1748 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001749 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001750 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1751 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001752#else /* __NetBSD__ || __DragonFly__ */
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001759#endif /* !(__NetBSD__ || __DragonFly__) */
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;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001767 const 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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001783#endif /* !__FreeBSD__ */
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001789#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001790
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;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001796 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001850#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001851
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 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001900#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001901
Serhiy Storchakad3187152017-11-09 18:00:38 +02001902#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001903 case AF_CAN:
1904 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001905#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001906 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001907 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001908#endif
1909#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001910 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001911#endif
1912#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 {
1914 struct sockaddr_can *addr;
1915 PyObject *interfaceName;
1916 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001917 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001918 addr = (struct sockaddr_can *)addr_ret;
1919
Charles-François Natali47413c12011-10-06 19:47:44 +02001920 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1921 &interfaceName))
1922 return 0;
1923
1924 len = PyBytes_GET_SIZE(interfaceName);
1925
1926 if (len == 0) {
1927 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001928 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001929 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1930 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001931 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1932 s->errorhandler();
1933 Py_DECREF(interfaceName);
1934 return 0;
1935 }
1936 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001937 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001938 "AF_CAN interface name too long");
1939 Py_DECREF(interfaceName);
1940 return 0;
1941 }
1942
1943 addr->can_family = AF_CAN;
1944 addr->can_ifindex = ifr.ifr_ifindex;
1945
1946 *len_ret = sizeof(*addr);
1947 Py_DECREF(interfaceName);
1948 return 1;
1949 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001950#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001951
1952#ifdef CAN_ISOTP
1953 case CAN_ISOTP:
1954 {
1955 struct sockaddr_can *addr;
1956 PyObject *interfaceName;
1957 struct ifreq ifr;
1958 Py_ssize_t len;
1959 unsigned long int rx_id, tx_id;
1960
1961 addr = (struct sockaddr_can *)addr_ret;
1962
1963 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1964 &interfaceName,
1965 &rx_id,
1966 &tx_id))
1967 return 0;
1968
1969 len = PyBytes_GET_SIZE(interfaceName);
1970
1971 if (len == 0) {
1972 ifr.ifr_ifindex = 0;
1973 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1974 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1975 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1976 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1977 s->errorhandler();
1978 Py_DECREF(interfaceName);
1979 return 0;
1980 }
1981 } else {
1982 PyErr_SetString(PyExc_OSError,
1983 "AF_CAN interface name too long");
1984 Py_DECREF(interfaceName);
1985 return 0;
1986 }
1987
1988 addr->can_family = AF_CAN;
1989 addr->can_ifindex = ifr.ifr_ifindex;
1990 addr->can_addr.tp.rx_id = rx_id;
1991 addr->can_addr.tp.tx_id = tx_id;
1992
1993 *len_ret = sizeof(*addr);
1994 Py_DECREF(interfaceName);
1995 return 1;
1996 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001997#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02001998 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001999 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002000 "getsockaddrarg: unsupported CAN protocol");
2001 return 0;
2002 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002003#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002004
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002005#ifdef PF_SYSTEM
2006 case PF_SYSTEM:
2007 switch (s->sock_proto) {
2008#ifdef SYSPROTO_CONTROL
2009 case SYSPROTO_CONTROL:
2010 {
2011 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002012
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002013 addr = (struct sockaddr_ctl *)addr_ret;
2014 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002015 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002016
2017 if (PyUnicode_Check(args)) {
2018 struct ctl_info info;
2019 PyObject *ctl_name;
2020
2021 if (!PyArg_Parse(args, "O&",
2022 PyUnicode_FSConverter, &ctl_name)) {
2023 return 0;
2024 }
2025
Victor Stinnerf50e1872015-03-20 11:32:24 +01002026 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002027 PyErr_SetString(PyExc_ValueError,
2028 "provided string is too long");
2029 Py_DECREF(ctl_name);
2030 return 0;
2031 }
2032 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2033 sizeof(info.ctl_name));
2034 Py_DECREF(ctl_name);
2035
2036 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2037 PyErr_SetString(PyExc_OSError,
2038 "cannot find kernel control with provided name");
2039 return 0;
2040 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002041
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002042 addr->sc_id = info.ctl_id;
2043 addr->sc_unit = 0;
2044 } else if (!PyArg_ParseTuple(args, "II",
2045 &(addr->sc_id), &(addr->sc_unit))) {
2046 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2047 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002048
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002049 return 0;
2050 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002051
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002052 *len_ret = sizeof(*addr);
2053 return 1;
2054 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002055#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002056 default:
2057 PyErr_SetString(PyExc_OSError,
2058 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2059 return 0;
2060 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002061#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002062#ifdef HAVE_SOCKADDR_ALG
2063 case AF_ALG:
2064 {
2065 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002066 const char *type;
2067 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002068 sa = (struct sockaddr_alg *)addr_ret;
2069
2070 memset(sa, 0, sizeof(*sa));
2071 sa->salg_family = AF_ALG;
2072
2073 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2074 &type, &name, &sa->salg_feat, &sa->salg_mask))
2075 return 0;
2076 /* sockaddr_alg has fixed-sized char arrays for type and name */
2077 if (strlen(type) > sizeof(sa->salg_type)) {
2078 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2079 return 0;
2080 }
2081 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2082 if (strlen(name) > sizeof(sa->salg_name)) {
2083 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2084 return 0;
2085 }
2086 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2087
2088 *len_ret = sizeof(*sa);
2089 return 1;
2090 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002091#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002096 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002100}
2101
Guido van Rossum30a685f1991-06-27 15:51:29 +00002102
Guido van Rossum48a680c2001-03-02 06:34:14 +00002103/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002104 Return 1 if the family is known, 0 otherwise. The length is returned
2105 through len_ret. */
2106
2107static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002108getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002111
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002112#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 case AF_UNIX:
2114 {
2115 *len_ret = sizeof (struct sockaddr_un);
2116 return 1;
2117 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002118#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002119
Martin v. Löwis11017b12006-01-14 18:12:57 +00002120#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002121 case AF_NETLINK:
2122 {
2123 *len_ret = sizeof (struct sockaddr_nl);
2124 return 1;
2125 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002126#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002127
caaveryeffc12f2017-09-06 18:18:10 -04002128#if defined(AF_VSOCK)
2129 case AF_VSOCK:
2130 {
2131 *len_ret = sizeof (struct sockaddr_vm);
2132 return 1;
2133 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002134#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002135
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002136#ifdef AF_RDS
2137 case AF_RDS:
2138 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002139#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 case AF_INET:
2142 {
2143 *len_ret = sizeof (struct sockaddr_in);
2144 return 1;
2145 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002146
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002147#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 case AF_INET6:
2149 {
2150 *len_ret = sizeof (struct sockaddr_in6);
2151 return 1;
2152 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002153#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002154
Hye-Shik Chang81268602004-02-02 06:05:24 +00002155#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 case AF_BLUETOOTH:
2157 {
2158 switch(s->sock_proto)
2159 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 case BTPROTO_L2CAP:
2162 *len_ret = sizeof (struct sockaddr_l2);
2163 return 1;
2164 case BTPROTO_RFCOMM:
2165 *len_ret = sizeof (struct sockaddr_rc);
2166 return 1;
2167 case BTPROTO_HCI:
2168 *len_ret = sizeof (struct sockaddr_hci);
2169 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002170#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 case BTPROTO_SCO:
2172 *len_ret = sizeof (struct sockaddr_sco);
2173 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002174#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002176 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 "unknown BT protocol");
2178 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 }
2181 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002182#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002183
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002184#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 case AF_PACKET:
2186 {
2187 *len_ret = sizeof (struct sockaddr_ll);
2188 return 1;
2189 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002190#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002191
Christian Heimes043d6f62008-01-07 17:19:16 +00002192#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 case AF_TIPC:
2194 {
2195 *len_ret = sizeof (struct sockaddr_tipc);
2196 return 1;
2197 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002198#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002199
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002200#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002201 case AF_CAN:
2202 {
2203 *len_ret = sizeof (struct sockaddr_can);
2204 return 1;
2205 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002206#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002207
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002208#ifdef PF_SYSTEM
2209 case PF_SYSTEM:
2210 switch(s->sock_proto) {
2211#ifdef SYSPROTO_CONTROL
2212 case SYSPROTO_CONTROL:
2213 *len_ret = sizeof (struct sockaddr_ctl);
2214 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002215#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002216 default:
2217 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2218 "unknown PF_SYSTEM protocol");
2219 return 0;
2220 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002221#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002222#ifdef HAVE_SOCKADDR_ALG
2223 case AF_ALG:
2224 {
2225 *len_ret = sizeof (struct sockaddr_alg);
2226 return 1;
2227 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002228#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002233 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002237}
2238
2239
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002240/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2241 Currently, these methods are only compiled if the RFC 2292/3542
2242 CMSG_LEN() macro is available. Older systems seem to have used
2243 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2244 it may be possible to define CMSG_LEN() that way if it's not
2245 provided. Some architectures might need extra padding after the
2246 cmsghdr, however, and CMSG_LEN() would have to take account of
2247 this. */
2248#ifdef CMSG_LEN
2249/* If length is in range, set *result to CMSG_LEN(length) and return
2250 true; otherwise, return false. */
2251static int
2252get_CMSG_LEN(size_t length, size_t *result)
2253{
2254 size_t tmp;
2255
2256 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2257 return 0;
2258 tmp = CMSG_LEN(length);
2259 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2260 return 0;
2261 *result = tmp;
2262 return 1;
2263}
2264
2265#ifdef CMSG_SPACE
2266/* If length is in range, set *result to CMSG_SPACE(length) and return
2267 true; otherwise, return false. */
2268static int
2269get_CMSG_SPACE(size_t length, size_t *result)
2270{
2271 size_t tmp;
2272
2273 /* Use CMSG_SPACE(1) here in order to take account of the padding
2274 necessary before *and* after the data. */
2275 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2276 return 0;
2277 tmp = CMSG_SPACE(length);
2278 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2279 return 0;
2280 *result = tmp;
2281 return 1;
2282}
2283#endif
2284
2285/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2286 pointer in msg->msg_control with at least "space" bytes after it,
2287 and its cmsg_len member inside the buffer. */
2288static int
2289cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2290{
2291 size_t cmsg_offset;
2292 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2293 sizeof(cmsgh->cmsg_len));
2294
Charles-François Natali466517d2011-08-28 18:23:43 +02002295 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002296 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002297 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002298 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2299 annoying under OS X as it's unsigned there and so it triggers a
2300 tautological comparison warning under Clang when compared against 0.
2301 Since the check is valid on other platforms, silence the warning under
2302 Clang. */
2303 #ifdef __clang__
2304 #pragma clang diagnostic push
2305 #pragma clang diagnostic ignored "-Wtautological-compare"
2306 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002307 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002308 #pragma GCC diagnostic push
2309 #pragma GCC diagnostic ignored "-Wtype-limits"
2310 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002311 if (msg->msg_controllen < 0)
2312 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002313 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002314 #pragma GCC diagnostic pop
2315 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002316 #ifdef __clang__
2317 #pragma clang diagnostic pop
2318 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002319 if (space < cmsg_len_end)
2320 space = cmsg_len_end;
2321 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2322 return (cmsg_offset <= (size_t)-1 - space &&
2323 cmsg_offset + space <= msg->msg_controllen);
2324}
2325
2326/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2327 *space to number of bytes following it in the buffer and return
2328 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2329 msg->msg_controllen are valid. */
2330static int
2331get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2332{
2333 size_t data_offset;
2334 char *data_ptr;
2335
2336 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2337 return 0;
2338 data_offset = data_ptr - (char *)msg->msg_control;
2339 if (data_offset > msg->msg_controllen)
2340 return 0;
2341 *space = msg->msg_controllen - data_offset;
2342 return 1;
2343}
2344
2345/* If cmsgh is invalid or not contained in the buffer pointed to by
2346 msg->msg_control, return -1. If cmsgh is valid and its associated
2347 data is entirely contained in the buffer, set *data_len to the
2348 length of the associated data and return 0. If only part of the
2349 associated data is contained in the buffer but cmsgh is otherwise
2350 valid, set *data_len to the length contained in the buffer and
2351 return 1. */
2352static int
2353get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2354{
2355 size_t space, cmsg_data_len;
2356
2357 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2358 cmsgh->cmsg_len < CMSG_LEN(0))
2359 return -1;
2360 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2361 if (!get_cmsg_data_space(msg, cmsgh, &space))
2362 return -1;
2363 if (space >= cmsg_data_len) {
2364 *data_len = cmsg_data_len;
2365 return 0;
2366 }
2367 *data_len = space;
2368 return 1;
2369}
2370#endif /* CMSG_LEN */
2371
2372
Victor Stinner31bf2d52015-04-01 21:57:09 +02002373struct sock_accept {
2374 socklen_t *addrlen;
2375 sock_addr_t *addrbuf;
2376 SOCKET_T result;
2377};
2378
2379#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2380/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2381static int accept4_works = -1;
2382#endif
2383
2384static int
2385sock_accept_impl(PySocketSockObject *s, void *data)
2386{
2387 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002388 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2389 socklen_t *paddrlen = ctx->addrlen;
2390#ifdef HAVE_SOCKADDR_ALG
2391 /* AF_ALG does not support accept() with addr and raises
2392 * ECONNABORTED instead. */
2393 if (s->sock_family == AF_ALG) {
2394 addr = NULL;
2395 paddrlen = NULL;
2396 *ctx->addrlen = 0;
2397 }
2398#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002399
2400#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2401 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002402 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002403 SOCK_CLOEXEC);
2404 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2405 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2406 accept4_works = (errno != ENOSYS);
2407 }
2408 }
2409 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002410 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002411#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002412 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002413#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002414
2415#ifdef MS_WINDOWS
2416 return (ctx->result != INVALID_SOCKET);
2417#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002418 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002419#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002420}
2421
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002422/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002423
Guido van Rossum73624e91994-10-10 17:59:00 +00002424static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002425sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002428 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 socklen_t addrlen;
2430 PyObject *sock = NULL;
2431 PyObject *addr = NULL;
2432 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002433 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (!getsockaddrlen(s, &addrlen))
2436 return NULL;
2437 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 if (!IS_SELECTABLE(s))
2440 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002441
Victor Stinner31bf2d52015-04-01 21:57:09 +02002442 ctx.addrlen = &addrlen;
2443 ctx.addrbuf = &addrbuf;
2444 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002446 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002447
Victor Stinnerdaf45552013-08-28 00:53:59 +02002448#ifdef MS_WINDOWS
2449 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2450 PyErr_SetFromWindowsErr(0);
2451 SOCKETCLOSE(newfd);
2452 goto finally;
2453 }
2454#else
2455
2456#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2457 if (!accept4_works)
2458#endif
2459 {
2460 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2461 SOCKETCLOSE(newfd);
2462 goto finally;
2463 }
2464 }
2465#endif
2466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 sock = PyLong_FromSocket_t(newfd);
2468 if (sock == NULL) {
2469 SOCKETCLOSE(newfd);
2470 goto finally;
2471 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2474 addrlen, s->sock_proto);
2475 if (addr == NULL)
2476 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002479
Guido van Rossum67f7a382002-06-06 21:08:16 +00002480finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 Py_XDECREF(sock);
2482 Py_XDECREF(addr);
2483 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002484}
2485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002487"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002489Wait for an incoming connection. Return a new socket file descriptor\n\
2490representing the connection, and the address of the client.\n\
2491For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002492
Guido van Rossum11ba0942002-06-13 15:07:44 +00002493/* s.setblocking(flag) method. Argument:
2494 False -- non-blocking mode; same as settimeout(0)
2495 True -- blocking mode; same as settimeout(None)
2496*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002497
Guido van Rossum73624e91994-10-10 17:59:00 +00002498static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002499sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002500{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002501 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 block = PyLong_AsLong(arg);
2504 if (block == -1 && PyErr_Occurred())
2505 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Victor Stinner9001d802015-04-06 23:06:01 +02002507 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002508 if (internal_setblocking(s, block) == -1) {
2509 return NULL;
2510 }
2511 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002512}
Guido van Rossume4485b01994-09-07 14:32:49 +00002513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515"setblocking(flag)\n\
2516\n\
2517Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002518setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520
Victor Stinner71694d52015-03-28 01:18:54 +01002521static int
2522socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2523{
2524#ifdef MS_WINDOWS
2525 struct timeval tv;
2526#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002527#ifndef HAVE_POLL
2528 _PyTime_t ms;
2529#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002530 int overflow = 0;
2531
2532 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002533 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002534 return 0;
2535 }
2536
Victor Stinner869e1772015-03-30 03:49:14 +02002537 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002538 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002539 return -1;
2540
2541 if (*timeout < 0) {
2542 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2543 return -1;
2544 }
2545
2546#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002547 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002548#endif
2549#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002550 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002551 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002552#endif
2553 if (overflow) {
2554 PyErr_SetString(PyExc_OverflowError,
2555 "timeout doesn't fit into C timeval");
2556 return -1;
2557 }
2558
2559 return 0;
2560}
2561
Guido van Rossum11ba0942002-06-13 15:07:44 +00002562/* s.settimeout(timeout) method. Argument:
2563 None -- no timeout, blocking mode; same as setblocking(True)
2564 0.0 -- non-blocking mode; same as setblocking(False)
2565 > 0 -- timeout mode; operations time out after timeout seconds
2566 < 0 -- illegal; raises an exception
2567*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002568static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002569sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002570{
Victor Stinner71694d52015-03-28 01:18:54 +01002571 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572
Victor Stinner71694d52015-03-28 01:18:54 +01002573 if (socket_parse_timeout(&timeout, arg) < 0)
2574 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002577 if (internal_setblocking(s, timeout < 0) == -1) {
2578 return NULL;
2579 }
2580 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002581}
2582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002584"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002585\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002586Set a timeout on socket operations. 'timeout' can be a float,\n\
2587giving in seconds, or None. Setting a timeout of None disables\n\
2588the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002589Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002591/* s.gettimeout() method.
2592 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002594sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595{
Victor Stinner71694d52015-03-28 01:18:54 +01002596 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002597 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 }
Victor Stinner71694d52015-03-28 01:18:54 +01002599 else {
2600 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2601 return PyFloat_FromDouble(seconds);
2602 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002603}
2604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002605PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002606"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002607\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002608Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002609operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002610operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002611
Guido van Rossumaee08791992-09-08 09:05:33 +00002612/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002613 With an integer third argument, sets an integer optval with optlen=4.
2614 With None as third argument and an integer fourth argument, set
2615 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002616 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002617 use optional built-in module 'struct' to encode the string.
2618*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002619
Guido van Rossum73624e91994-10-10 17:59:00 +00002620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002621sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 int level;
2624 int optname;
2625 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002626 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002628 unsigned int optlen;
2629 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002630
caaveryeffc12f2017-09-06 18:18:10 -04002631#ifdef AF_VSOCK
2632 if (s->sock_family == AF_VSOCK) {
2633 uint64_t vflag; // Must be set width of 64 bits
2634 /* setsockopt(level, opt, flag) */
2635 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2636 &level, &optname, &vflag)) {
2637 // level should always be set to AF_VSOCK
2638 res = setsockopt(s->sock_fd, level, optname,
2639 (void*)&vflag, sizeof vflag);
2640 goto done;
2641 }
2642 return NULL;
2643 }
2644#endif
2645
Christian Heimesdffa3942016-09-05 23:54:41 +02002646 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (PyArg_ParseTuple(args, "iii:setsockopt",
2648 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002649 res = setsockopt(s->sock_fd, level, optname,
2650 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002651 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002653
2654 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002655 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002656 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2657 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2658 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002659 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002660 NULL, (socklen_t)optlen);
2661 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002663
2664 PyErr_Clear();
2665 /* setsockopt(level, opt, buffer) */
2666 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2667 &level, &optname, &optval))
2668 return NULL;
2669
2670#ifdef MS_WINDOWS
2671 if (optval.len > INT_MAX) {
2672 PyBuffer_Release(&optval);
2673 PyErr_Format(PyExc_OverflowError,
2674 "socket option is larger than %i bytes",
2675 INT_MAX);
2676 return NULL;
2677 }
2678 res = setsockopt(s->sock_fd, level, optname,
2679 optval.buf, (int)optval.len);
2680#else
2681 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2682#endif
2683 PyBuffer_Release(&optval);
2684
2685done:
Victor Stinnercc739322016-03-23 21:35:29 +01002686 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002688 }
2689
2690 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002691}
2692
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002693PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002694"setsockopt(level, option, value: int)\n\
2695setsockopt(level, option, value: buffer)\n\
2696setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002697\n\
2698Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002699The value argument can either be an integer, a string buffer, or \n\
2700None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002701
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002702
Guido van Rossumaee08791992-09-08 09:05:33 +00002703/* s.getsockopt() method.
2704 With two arguments, retrieves an integer option.
2705 With a third integer argument, retrieves a string buffer of that size;
2706 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002707
Guido van Rossum73624e91994-10-10 17:59:00 +00002708static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002709sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 int level;
2712 int optname;
2713 int res;
2714 PyObject *buf;
2715 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002716 int flag = 0;
2717 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2720 &level, &optname, &buflen))
2721 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002724#ifdef AF_VSOCK
2725 if (s->sock_family == AF_VSOCK) {
2726 uint64_t vflag = 0; // Must be set width of 64 bits
2727 flagsize = sizeof vflag;
2728 res = getsockopt(s->sock_fd, level, optname,
2729 (void *)&vflag, &flagsize);
2730 if (res < 0)
2731 return s->errorhandler();
2732 return PyLong_FromUnsignedLong(vflag);
2733 }
2734#endif
2735 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 res = getsockopt(s->sock_fd, level, optname,
2737 (void *)&flag, &flagsize);
2738 if (res < 0)
2739 return s->errorhandler();
2740 return PyLong_FromLong(flag);
2741 }
caaveryeffc12f2017-09-06 18:18:10 -04002742#ifdef AF_VSOCK
2743 if (s->sock_family == AF_VSOCK) {
2744 PyErr_SetString(PyExc_OSError,
2745 "getsockopt string buffer not allowed");
2746 return NULL;
2747 }
2748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002750 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 "getsockopt buflen out of range");
2752 return NULL;
2753 }
2754 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2755 if (buf == NULL)
2756 return NULL;
2757 res = getsockopt(s->sock_fd, level, optname,
2758 (void *)PyBytes_AS_STRING(buf), &buflen);
2759 if (res < 0) {
2760 Py_DECREF(buf);
2761 return s->errorhandler();
2762 }
2763 _PyBytes_Resize(&buf, buflen);
2764 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002765}
2766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002767PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768"getsockopt(level, option[, buffersize]) -> value\n\
2769\n\
2770Get a socket option. See the Unix manual for level and option.\n\
2771If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002772string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002773
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002774
Fred Drake728819a2000-07-01 03:40:12 +00002775/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002776
Guido van Rossum73624e91994-10-10 17:59:00 +00002777static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002778sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 sock_addr_t addrbuf;
2781 int addrlen;
2782 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2785 return NULL;
2786 Py_BEGIN_ALLOW_THREADS
2787 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2788 Py_END_ALLOW_THREADS
2789 if (res < 0)
2790 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002791 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002792}
2793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002795"bind(address)\n\
2796\n\
2797Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002798pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002800
Guido van Rossum30a685f1991-06-27 15:51:29 +00002801
2802/* s.close() method.
2803 Set the file descriptor to -1 so operations tried subsequently
2804 will surely fail. */
2805
Guido van Rossum73624e91994-10-10 17:59:00 +00002806static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002807sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002810 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002811
Victor Stinner19a8e842016-03-21 16:36:48 +01002812 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002813 if (fd != INVALID_SOCKET) {
2814 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002815
2816 /* We do not want to retry upon EINTR: see
2817 http://lwn.net/Articles/576478/ and
2818 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2819 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002821 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002823 /* bpo-30319: The peer can already have closed the connection.
2824 Python ignores ECONNRESET on close(). */
2825 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002826 return s->errorhandler();
2827 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002829 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002830}
2831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002832PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002833"close()\n\
2834\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002835Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002836
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002837static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002838sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002839{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002840 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002841 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002842 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002843}
2844
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002845PyDoc_STRVAR(detach_doc,
2846"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002847\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002848Close the socket object without closing the underlying file descriptor.\n\
2849The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002850can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002851
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002852static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002853sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002854{
Victor Stinner81c41db2015-04-02 11:50:57 +02002855 int err;
2856 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002857
Victor Stinner81c41db2015-04-02 11:50:57 +02002858 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2859 /* getsockopt() failed */
2860 return 0;
2861 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002862
Victor Stinner81c41db2015-04-02 11:50:57 +02002863 if (err == EISCONN)
2864 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002865 if (err != 0) {
2866 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2867 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002868 return 0;
2869 }
2870 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002871}
2872
2873static int
2874internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2875 int raise)
2876{
2877 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002878
2879 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002881 Py_END_ALLOW_THREADS
2882
Victor Stinner70a46f62015-03-31 22:03:59 +02002883 if (!res) {
2884 /* connect() succeeded, the socket is connected */
2885 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002887
Victor Stinner81c41db2015-04-02 11:50:57 +02002888 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002889
Victor Stinner81c41db2015-04-02 11:50:57 +02002890 /* save error, PyErr_CheckSignals() can replace it */
2891 err = GET_SOCK_ERROR;
2892 if (CHECK_ERRNO(EINTR)) {
2893 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002894 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002895
2896 /* Issue #23618: when connect() fails with EINTR, the connection is
2897 running asynchronously.
2898
2899 If the socket is blocking or has a timeout, wait until the
2900 connection completes, fails or timed out using select(), and then
2901 get the connection status using getsockopt(SO_ERROR).
2902
2903 If the socket is non-blocking, raise InterruptedError. The caller is
2904 responsible to wait until the connection completes, fails or timed
2905 out (it's the case in asyncio for example). */
2906 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2907 }
2908 else {
2909 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2910 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002911 }
2912
Victor Stinner81c41db2015-04-02 11:50:57 +02002913 if (!wait_connect) {
2914 if (raise) {
2915 /* restore error, maybe replaced by PyErr_CheckSignals() */
2916 SET_SOCK_ERROR(err);
2917 s->errorhandler();
2918 return -1;
2919 }
2920 else
2921 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002922 }
2923
Victor Stinner81c41db2015-04-02 11:50:57 +02002924 if (raise) {
2925 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002926 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2927 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002928 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002929 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002930 else {
2931 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002932 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2933 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002934 return err;
2935 }
2936 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002937}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002938
Fred Drake728819a2000-07-01 03:40:12 +00002939/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002940
Guido van Rossum73624e91994-10-10 17:59:00 +00002941static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002942sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 sock_addr_t addrbuf;
2945 int addrlen;
2946 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2949 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002950
Victor Stinner81c41db2015-04-02 11:50:57 +02002951 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002952 if (res < 0)
2953 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002954
Victor Stinneree699e92015-03-31 21:28:42 +02002955 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002956}
2957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002958PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002959"connect(address)\n\
2960\n\
2961Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963
Guido van Rossum30a685f1991-06-27 15:51:29 +00002964
Fred Drake728819a2000-07-01 03:40:12 +00002965/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002966
2967static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002968sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 sock_addr_t addrbuf;
2971 int addrlen;
2972 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2975 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002976
Victor Stinner81c41db2015-04-02 11:50:57 +02002977 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002978 if (res < 0)
2979 return NULL;
2980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002982}
2983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002984PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002985"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002986\n\
2987This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002988instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002989
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002990
Guido van Rossumed233a51992-06-23 09:07:03 +00002991/* s.fileno() method */
2992
Guido van Rossum73624e91994-10-10 17:59:00 +00002993static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002994sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002997}
2998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002999PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003000"fileno() -> integer\n\
3001\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003002Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003003
Guido van Rossumed233a51992-06-23 09:07:03 +00003004
Guido van Rossumc89705d1992-11-26 08:54:07 +00003005/* s.getsockname() method */
3006
Guido van Rossum73624e91994-10-10 17:59:00 +00003007static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003008sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 sock_addr_t addrbuf;
3011 int res;
3012 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 if (!getsockaddrlen(s, &addrlen))
3015 return NULL;
3016 memset(&addrbuf, 0, addrlen);
3017 Py_BEGIN_ALLOW_THREADS
3018 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3019 Py_END_ALLOW_THREADS
3020 if (res < 0)
3021 return s->errorhandler();
3022 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3023 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003024}
3025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003026PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003027"getsockname() -> address info\n\
3028\n\
3029Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003030info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003031
Guido van Rossumc89705d1992-11-26 08:54:07 +00003032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003034/* s.getpeername() method */
3035
Guido van Rossum73624e91994-10-10 17:59:00 +00003036static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003037sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 sock_addr_t addrbuf;
3040 int res;
3041 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (!getsockaddrlen(s, &addrlen))
3044 return NULL;
3045 memset(&addrbuf, 0, addrlen);
3046 Py_BEGIN_ALLOW_THREADS
3047 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3048 Py_END_ALLOW_THREADS
3049 if (res < 0)
3050 return s->errorhandler();
3051 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3052 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003053}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003055PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003056"getpeername() -> address info\n\
3057\n\
3058Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003059info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003060
Guido van Rossumb6775db1994-08-01 11:34:53 +00003061#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003062
3063
Guido van Rossum30a685f1991-06-27 15:51:29 +00003064/* s.listen(n) method */
3065
Guido van Rossum73624e91994-10-10 17:59:00 +00003066static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003067sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003068{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003069 /* We try to choose a default backlog high enough to avoid connection drops
3070 * for common workloads, yet not too high to limit resource usage. */
3071 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003073
Charles-François Natali644b8f52014-05-22 19:45:39 +01003074 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003078 /* To avoid problems on systems that don't allow a negative backlog
3079 * (which doesn't make sense anyway) we force a minimum value of 0. */
3080 if (backlog < 0)
3081 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 res = listen(s->sock_fd, backlog);
3083 Py_END_ALLOW_THREADS
3084 if (res < 0)
3085 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003086 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003087}
3088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003089PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003090"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003091\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003092Enable a server to accept connections. If backlog is specified, it must be\n\
3093at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003094unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003095connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096
Victor Stinner31bf2d52015-04-01 21:57:09 +02003097struct sock_recv {
3098 char *cbuf;
3099 Py_ssize_t len;
3100 int flags;
3101 Py_ssize_t result;
3102};
3103
3104static int
3105sock_recv_impl(PySocketSockObject *s, void *data)
3106{
3107 struct sock_recv *ctx = data;
3108
3109#ifdef MS_WINDOWS
3110 if (ctx->len > INT_MAX)
3111 ctx->len = INT_MAX;
3112 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3113#else
3114 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3115#endif
3116 return (ctx->result >= 0);
3117}
3118
Guido van Rossum82a5c661998-07-07 20:45:43 +00003119
Thomas Wouters477c8d52006-05-27 19:21:47 +00003120/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003121 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003122 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003123 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003124 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125 * also possible that we return a number of bytes smaller than the request
3126 * bytes.
3127 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003128
Antoine Pitrou19467d22010-08-17 19:33:30 +00003129static Py_ssize_t
3130sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003131{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003132 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 if (!IS_SELECTABLE(s)) {
3135 select_error();
3136 return -1;
3137 }
3138 if (len == 0) {
3139 /* If 0 bytes were requested, do nothing. */
3140 return 0;
3141 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142
Victor Stinner31bf2d52015-04-01 21:57:09 +02003143 ctx.cbuf = cbuf;
3144 ctx.len = len;
3145 ctx.flags = flags;
3146 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003148
3149 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003150}
3151
Guido van Rossum48a680c2001-03-02 06:34:14 +00003152
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003153/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003154
Guido van Rossum73624e91994-10-10 17:59:00 +00003155static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003156sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003157{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003158 Py_ssize_t recvlen, outlen;
3159 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003161
Antoine Pitrou19467d22010-08-17 19:33:30 +00003162 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 if (recvlen < 0) {
3166 PyErr_SetString(PyExc_ValueError,
3167 "negative buffersize in recv");
3168 return NULL;
3169 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 /* Allocate a new string. */
3172 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3173 if (buf == NULL)
3174 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 /* Call the guts */
3177 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3178 if (outlen < 0) {
3179 /* An error occurred, release the string and return an
3180 error. */
3181 Py_DECREF(buf);
3182 return NULL;
3183 }
3184 if (outlen != recvlen) {
3185 /* We did not read as many bytes as we anticipated, resize the
3186 string if possible and be successful. */
3187 _PyBytes_Resize(&buf, outlen);
3188 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003191}
3192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003193PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003194"recv(buffersize[, flags]) -> data\n\
3195\n\
3196Receive up to buffersize bytes from the socket. For the optional flags\n\
3197argument, see the Unix manual. When no data is available, block until\n\
3198at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003199the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003200
Guido van Rossum30a685f1991-06-27 15:51:29 +00003201
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003202/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003203
Thomas Wouters477c8d52006-05-27 19:21:47 +00003204static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003205sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003208
Antoine Pitrou19467d22010-08-17 19:33:30 +00003209 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 Py_buffer pbuf;
3211 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003212 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003215 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 &pbuf, &recvlen, &flags))
3217 return NULL;
3218 buf = pbuf.buf;
3219 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 if (recvlen < 0) {
3222 PyBuffer_Release(&pbuf);
3223 PyErr_SetString(PyExc_ValueError,
3224 "negative buffersize in recv_into");
3225 return NULL;
3226 }
3227 if (recvlen == 0) {
3228 /* If nbytes was not specified, use the buffer's length */
3229 recvlen = buflen;
3230 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 /* Check if the buffer is large enough */
3233 if (buflen < recvlen) {
3234 PyBuffer_Release(&pbuf);
3235 PyErr_SetString(PyExc_ValueError,
3236 "buffer too small for requested bytes");
3237 return NULL;
3238 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 /* Call the guts */
3241 readlen = sock_recv_guts(s, buf, recvlen, flags);
3242 if (readlen < 0) {
3243 /* Return an error. */
3244 PyBuffer_Release(&pbuf);
3245 return NULL;
3246 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 PyBuffer_Release(&pbuf);
3249 /* Return the number of bytes read. Note that we do not do anything
3250 special here in the case that readlen < recvlen. */
3251 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003252}
3253
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003254PyDoc_STRVAR(recv_into_doc,
3255"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256\n\
3257A version of recv() that stores its data into a buffer rather than creating \n\
3258a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3259is not specified (or 0), receive up to the size available in the given buffer.\n\
3260\n\
3261See recv() for documentation about the flags.");
3262
Victor Stinner31bf2d52015-04-01 21:57:09 +02003263struct sock_recvfrom {
3264 char* cbuf;
3265 Py_ssize_t len;
3266 int flags;
3267 socklen_t *addrlen;
3268 sock_addr_t *addrbuf;
3269 Py_ssize_t result;
3270};
3271
3272static int
3273sock_recvfrom_impl(PySocketSockObject *s, void *data)
3274{
3275 struct sock_recvfrom *ctx = data;
3276
3277 memset(ctx->addrbuf, 0, *ctx->addrlen);
3278
3279#ifdef MS_WINDOWS
3280 if (ctx->len > INT_MAX)
3281 ctx->len = INT_MAX;
3282 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3283 SAS2SA(ctx->addrbuf), ctx->addrlen);
3284#else
3285 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3286 SAS2SA(ctx->addrbuf), ctx->addrlen);
3287#endif
3288 return (ctx->result >= 0);
3289}
3290
Thomas Wouters477c8d52006-05-27 19:21:47 +00003291
3292/*
Christian Heimes99170a52007-12-19 02:07:34 +00003293 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3294 * into a char buffer. If you have any inc/def ref to do to the objects that
3295 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003296 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003297 * that it is also possible that we return a number of bytes smaller than the
3298 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003299 *
3300 * 'addr' is a return value for the address object. Note that you must decref
3301 * it yourself.
3302 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003303static Py_ssize_t
3304sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003309 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 if (!getsockaddrlen(s, &addrlen))
3314 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 if (!IS_SELECTABLE(s)) {
3317 select_error();
3318 return -1;
3319 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003320
Victor Stinner31bf2d52015-04-01 21:57:09 +02003321 ctx.cbuf = cbuf;
3322 ctx.len = len;
3323 ctx.flags = flags;
3324 ctx.addrbuf = &addrbuf;
3325 ctx.addrlen = &addrlen;
3326 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003328
Victor Stinner31bf2d52015-04-01 21:57:09 +02003329 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3330 s->sock_proto);
3331 if (*addr == NULL)
3332 return -1;
3333
3334 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003335}
3336
3337/* s.recvfrom(nbytes [,flags]) method */
3338
3339static PyObject *
3340sock_recvfrom(PySocketSockObject *s, PyObject *args)
3341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 PyObject *buf = NULL;
3343 PyObject *addr = NULL;
3344 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003345 int flags = 0;
3346 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347
Antoine Pitrou19467d22010-08-17 19:33:30 +00003348 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 if (recvlen < 0) {
3352 PyErr_SetString(PyExc_ValueError,
3353 "negative buffersize in recvfrom");
3354 return NULL;
3355 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3358 if (buf == NULL)
3359 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3362 recvlen, flags, &addr);
3363 if (outlen < 0) {
3364 goto finally;
3365 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 if (outlen != recvlen) {
3368 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003369 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003371 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 goto finally;
3373 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003376
3377finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 Py_XDECREF(buf);
3379 Py_XDECREF(addr);
3380 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003381}
3382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003383PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003384"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3385\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003386Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003387
Thomas Wouters477c8d52006-05-27 19:21:47 +00003388
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003389/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003390
3391static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003392sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003395
Antoine Pitrou19467d22010-08-17 19:33:30 +00003396 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 Py_buffer pbuf;
3398 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003399 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003402
Antoine Pitrou19467d22010-08-17 19:33:30 +00003403 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 kwlist, &pbuf,
3405 &recvlen, &flags))
3406 return NULL;
3407 buf = pbuf.buf;
3408 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 if (recvlen < 0) {
3411 PyBuffer_Release(&pbuf);
3412 PyErr_SetString(PyExc_ValueError,
3413 "negative buffersize in recvfrom_into");
3414 return NULL;
3415 }
3416 if (recvlen == 0) {
3417 /* If nbytes was not specified, use the buffer's length */
3418 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003419 } else if (recvlen > buflen) {
3420 PyBuffer_Release(&pbuf);
3421 PyErr_SetString(PyExc_ValueError,
3422 "nbytes is greater than the length of the buffer");
3423 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3427 if (readlen < 0) {
3428 PyBuffer_Release(&pbuf);
3429 /* Return an error */
3430 Py_XDECREF(addr);
3431 return NULL;
3432 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 PyBuffer_Release(&pbuf);
3435 /* Return the number of bytes read and the address. Note that we do
3436 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003437 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003438}
3439
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003440PyDoc_STRVAR(recvfrom_into_doc,
3441"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003442\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003443Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003444
Victor Stinner35bee932015-04-02 12:28:07 +02003445/* The sendmsg() and recvmsg[_into]() methods require a working
3446 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3447#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003448struct sock_recvmsg {
3449 struct msghdr *msg;
3450 int flags;
3451 ssize_t result;
3452};
3453
3454static int
3455sock_recvmsg_impl(PySocketSockObject *s, void *data)
3456{
3457 struct sock_recvmsg *ctx = data;
3458
3459 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3460 return (ctx->result >= 0);
3461}
3462
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003463/*
3464 * Call recvmsg() with the supplied iovec structures, flags, and
3465 * ancillary data buffer size (controllen). Returns the tuple return
3466 * value for recvmsg() or recvmsg_into(), with the first item provided
3467 * by the supplied makeval() function. makeval() will be called with
3468 * the length read and makeval_data as arguments, and must return a
3469 * new reference (which will be decrefed if there is a subsequent
3470 * error). On error, closes any file descriptors received via
3471 * SCM_RIGHTS.
3472 */
3473static PyObject *
3474sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3475 int flags, Py_ssize_t controllen,
3476 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3477{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003478 sock_addr_t addrbuf;
3479 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003480 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003481 PyObject *cmsg_list = NULL, *retval = NULL;
3482 void *controlbuf = NULL;
3483 struct cmsghdr *cmsgh;
3484 size_t cmsgdatalen = 0;
3485 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003486 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003487
3488 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3489 ignored" when the socket is connected (Linux fills them in
3490 anyway for AF_UNIX sockets at least). Normally msg_namelen
3491 seems to be set to 0 if there's no address, but try to
3492 initialize msg_name to something that won't be mistaken for a
3493 real address if that doesn't happen. */
3494 if (!getsockaddrlen(s, &addrbuflen))
3495 return NULL;
3496 memset(&addrbuf, 0, addrbuflen);
3497 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3498
3499 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3500 PyErr_SetString(PyExc_ValueError,
3501 "invalid ancillary data buffer length");
3502 return NULL;
3503 }
3504 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3505 return PyErr_NoMemory();
3506
3507 /* Make the system call. */
3508 if (!IS_SELECTABLE(s)) {
3509 select_error();
3510 goto finally;
3511 }
3512
Victor Stinner31bf2d52015-04-01 21:57:09 +02003513 msg.msg_name = SAS2SA(&addrbuf);
3514 msg.msg_namelen = addrbuflen;
3515 msg.msg_iov = iov;
3516 msg.msg_iovlen = iovlen;
3517 msg.msg_control = controlbuf;
3518 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003519
Victor Stinner31bf2d52015-04-01 21:57:09 +02003520 ctx.msg = &msg;
3521 ctx.flags = flags;
3522 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003523 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003524
3525 /* Make list of (level, type, data) tuples from control messages. */
3526 if ((cmsg_list = PyList_New(0)) == NULL)
3527 goto err_closefds;
3528 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3529 implementations didn't do so. */
3530 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3531 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3532 PyObject *bytes, *tuple;
3533 int tmp;
3534
3535 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3536 if (cmsg_status != 0) {
3537 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3538 "received malformed or improperly-truncated "
3539 "ancillary data", 1) == -1)
3540 goto err_closefds;
3541 }
3542 if (cmsg_status < 0)
3543 break;
3544 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003545 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546 goto err_closefds;
3547 }
3548
3549 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3550 cmsgdatalen);
3551 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3552 (int)cmsgh->cmsg_type, bytes);
3553 if (tuple == NULL)
3554 goto err_closefds;
3555 tmp = PyList_Append(cmsg_list, tuple);
3556 Py_DECREF(tuple);
3557 if (tmp != 0)
3558 goto err_closefds;
3559
3560 if (cmsg_status != 0)
3561 break;
3562 }
3563
3564 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003565 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003566 cmsg_list,
3567 (int)msg.msg_flags,
3568 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3569 ((msg.msg_namelen > addrbuflen) ?
3570 addrbuflen : msg.msg_namelen),
3571 s->sock_proto));
3572 if (retval == NULL)
3573 goto err_closefds;
3574
3575finally:
3576 Py_XDECREF(cmsg_list);
3577 PyMem_Free(controlbuf);
3578 return retval;
3579
3580err_closefds:
3581#ifdef SCM_RIGHTS
3582 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3583 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3584 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3585 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3586 if (cmsg_status < 0)
3587 break;
3588 if (cmsgh->cmsg_level == SOL_SOCKET &&
3589 cmsgh->cmsg_type == SCM_RIGHTS) {
3590 size_t numfds;
3591 int *fdp;
3592
3593 numfds = cmsgdatalen / sizeof(int);
3594 fdp = (int *)CMSG_DATA(cmsgh);
3595 while (numfds-- > 0)
3596 close(*fdp++);
3597 }
3598 if (cmsg_status != 0)
3599 break;
3600 }
3601#endif /* SCM_RIGHTS */
3602 goto finally;
3603}
3604
3605
3606static PyObject *
3607makeval_recvmsg(ssize_t received, void *data)
3608{
3609 PyObject **buf = data;
3610
3611 if (received < PyBytes_GET_SIZE(*buf))
3612 _PyBytes_Resize(buf, received);
3613 Py_XINCREF(*buf);
3614 return *buf;
3615}
3616
3617/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3618
3619static PyObject *
3620sock_recvmsg(PySocketSockObject *s, PyObject *args)
3621{
3622 Py_ssize_t bufsize, ancbufsize = 0;
3623 int flags = 0;
3624 struct iovec iov;
3625 PyObject *buf = NULL, *retval = NULL;
3626
3627 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3628 return NULL;
3629
3630 if (bufsize < 0) {
3631 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3632 return NULL;
3633 }
3634 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3635 return NULL;
3636 iov.iov_base = PyBytes_AS_STRING(buf);
3637 iov.iov_len = bufsize;
3638
3639 /* Note that we're passing a pointer to *our pointer* to the bytes
3640 object here (&buf); makeval_recvmsg() may incref the object, or
3641 deallocate it and set our pointer to NULL. */
3642 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3643 &makeval_recvmsg, &buf);
3644 Py_XDECREF(buf);
3645 return retval;
3646}
3647
3648PyDoc_STRVAR(recvmsg_doc,
3649"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3650\n\
3651Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3652socket. The ancbufsize argument sets the size in bytes of the\n\
3653internal buffer used to receive the ancillary data; it defaults to 0,\n\
3654meaning that no ancillary data will be received. Appropriate buffer\n\
3655sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3656CMSG_LEN(), and items which do not fit into the buffer might be\n\
3657truncated or discarded. The flags argument defaults to 0 and has the\n\
3658same meaning as for recv().\n\
3659\n\
3660The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3661The data item is a bytes object holding the non-ancillary data\n\
3662received. The ancdata item is a list of zero or more tuples\n\
3663(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3664(control messages) received: cmsg_level and cmsg_type are integers\n\
3665specifying the protocol level and protocol-specific type respectively,\n\
3666and cmsg_data is a bytes object holding the associated data. The\n\
3667msg_flags item is the bitwise OR of various flags indicating\n\
3668conditions on the received message; see your system documentation for\n\
3669details. If the receiving socket is unconnected, address is the\n\
3670address of the sending socket, if available; otherwise, its value is\n\
3671unspecified.\n\
3672\n\
3673If recvmsg() raises an exception after the system call returns, it\n\
3674will first attempt to close any file descriptors received via the\n\
3675SCM_RIGHTS mechanism.");
3676
3677
3678static PyObject *
3679makeval_recvmsg_into(ssize_t received, void *data)
3680{
3681 return PyLong_FromSsize_t(received);
3682}
3683
3684/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3685
3686static PyObject *
3687sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3688{
3689 Py_ssize_t ancbufsize = 0;
3690 int flags = 0;
3691 struct iovec *iovs = NULL;
3692 Py_ssize_t i, nitems, nbufs = 0;
3693 Py_buffer *bufs = NULL;
3694 PyObject *buffers_arg, *fast, *retval = NULL;
3695
3696 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3697 &buffers_arg, &ancbufsize, &flags))
3698 return NULL;
3699
3700 if ((fast = PySequence_Fast(buffers_arg,
3701 "recvmsg_into() argument 1 must be an "
3702 "iterable")) == NULL)
3703 return NULL;
3704 nitems = PySequence_Fast_GET_SIZE(fast);
3705 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003706 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003707 goto finally;
3708 }
3709
3710 /* Fill in an iovec for each item, and save the Py_buffer
3711 structs to release afterwards. */
3712 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3713 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3714 PyErr_NoMemory();
3715 goto finally;
3716 }
3717 for (; nbufs < nitems; nbufs++) {
3718 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3719 "w*;recvmsg_into() argument 1 must be an iterable "
3720 "of single-segment read-write buffers",
3721 &bufs[nbufs]))
3722 goto finally;
3723 iovs[nbufs].iov_base = bufs[nbufs].buf;
3724 iovs[nbufs].iov_len = bufs[nbufs].len;
3725 }
3726
3727 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3728 &makeval_recvmsg_into, NULL);
3729finally:
3730 for (i = 0; i < nbufs; i++)
3731 PyBuffer_Release(&bufs[i]);
3732 PyMem_Free(bufs);
3733 PyMem_Free(iovs);
3734 Py_DECREF(fast);
3735 return retval;
3736}
3737
3738PyDoc_STRVAR(recvmsg_into_doc,
3739"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3740\n\
3741Receive normal data and ancillary data from the socket, scattering the\n\
3742non-ancillary data into a series of buffers. The buffers argument\n\
3743must be an iterable of objects that export writable buffers\n\
3744(e.g. bytearray objects); these will be filled with successive chunks\n\
3745of the non-ancillary data until it has all been written or there are\n\
3746no more buffers. The ancbufsize argument sets the size in bytes of\n\
3747the internal buffer used to receive the ancillary data; it defaults to\n\
37480, meaning that no ancillary data will be received. Appropriate\n\
3749buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3750or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3751truncated or discarded. The flags argument defaults to 0 and has the\n\
3752same meaning as for recv().\n\
3753\n\
3754The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3755The nbytes item is the total number of bytes of non-ancillary data\n\
3756written into the buffers. The ancdata item is a list of zero or more\n\
3757tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3758data (control messages) received: cmsg_level and cmsg_type are\n\
3759integers specifying the protocol level and protocol-specific type\n\
3760respectively, and cmsg_data is a bytes object holding the associated\n\
3761data. The msg_flags item is the bitwise OR of various flags\n\
3762indicating conditions on the received message; see your system\n\
3763documentation for details. If the receiving socket is unconnected,\n\
3764address is the address of the sending socket, if available; otherwise,\n\
3765its value is unspecified.\n\
3766\n\
3767If recvmsg_into() raises an exception after the system call returns,\n\
3768it will first attempt to close any file descriptors received via the\n\
3769SCM_RIGHTS mechanism.");
3770#endif /* CMSG_LEN */
3771
3772
Victor Stinner31bf2d52015-04-01 21:57:09 +02003773struct sock_send {
3774 char *buf;
3775 Py_ssize_t len;
3776 int flags;
3777 Py_ssize_t result;
3778};
3779
3780static int
3781sock_send_impl(PySocketSockObject *s, void *data)
3782{
3783 struct sock_send *ctx = data;
3784
3785#ifdef MS_WINDOWS
3786 if (ctx->len > INT_MAX)
3787 ctx->len = INT_MAX;
3788 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3789#else
3790 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3791#endif
3792 return (ctx->result >= 0);
3793}
3794
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003795/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003796
Guido van Rossum73624e91994-10-10 17:59:00 +00003797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003798sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003799{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003800 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003801 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003802 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3805 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 if (!IS_SELECTABLE(s)) {
3808 PyBuffer_Release(&pbuf);
3809 return select_error();
3810 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003811 ctx.buf = pbuf.buf;
3812 ctx.len = pbuf.len;
3813 ctx.flags = flags;
3814 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003815 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 return NULL;
3817 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003818 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003819
3820 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003821}
3822
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003823PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003824"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003825\n\
3826Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003827argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003828sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003829
3830
3831/* s.sendall(data [,flags]) method */
3832
3833static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003834sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003836 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003837 Py_ssize_t len, n;
3838 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003840 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003841 int has_timeout = (s->sock_timeout > 0);
3842 _PyTime_t interval = s->sock_timeout;
3843 _PyTime_t deadline = 0;
3844 int deadline_initialized = 0;
3845 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3848 return NULL;
3849 buf = pbuf.buf;
3850 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 if (!IS_SELECTABLE(s)) {
3853 PyBuffer_Release(&pbuf);
3854 return select_error();
3855 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003858 if (has_timeout) {
3859 if (deadline_initialized) {
3860 /* recompute the timeout */
3861 interval = deadline - _PyTime_GetMonotonicClock();
3862 }
3863 else {
3864 deadline_initialized = 1;
3865 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3866 }
3867
3868 if (interval <= 0) {
3869 PyErr_SetString(socket_timeout, "timed out");
3870 goto done;
3871 }
3872 }
3873
Victor Stinner02f32ab2015-04-01 22:53:26 +02003874 ctx.buf = buf;
3875 ctx.len = len;
3876 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003877 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3878 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003879 n = ctx.result;
3880 assert(n >= 0);
3881
3882 buf += n;
3883 len -= n;
3884
3885 /* We must run our signal handlers before looping again.
3886 send() can return a successful partial write when it is
3887 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003888 if (PyErr_CheckSignals())
3889 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003890 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003892
Victor Stinner8912d142015-04-06 23:16:34 +02003893 Py_INCREF(Py_None);
3894 res = Py_None;
3895
3896done:
3897 PyBuffer_Release(&pbuf);
3898 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003899}
3900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003901PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003902"sendall(data[, flags])\n\
3903\n\
3904Send a data string to the socket. For the optional flags\n\
3905argument, see the Unix manual. This calls send() repeatedly\n\
3906until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003907to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003908
Guido van Rossum30a685f1991-06-27 15:51:29 +00003909
Victor Stinner31bf2d52015-04-01 21:57:09 +02003910struct sock_sendto {
3911 char *buf;
3912 Py_ssize_t len;
3913 int flags;
3914 int addrlen;
3915 sock_addr_t *addrbuf;
3916 Py_ssize_t result;
3917};
3918
3919static int
3920sock_sendto_impl(PySocketSockObject *s, void *data)
3921{
3922 struct sock_sendto *ctx = data;
3923
3924#ifdef MS_WINDOWS
3925 if (ctx->len > INT_MAX)
3926 ctx->len = INT_MAX;
3927 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3928 SAS2SA(ctx->addrbuf), ctx->addrlen);
3929#else
3930 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3931 SAS2SA(ctx->addrbuf), ctx->addrlen);
3932#endif
3933 return (ctx->result >= 0);
3934}
3935
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003936/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003937
Guido van Rossum73624e91994-10-10 17:59:00 +00003938static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003939sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 Py_buffer pbuf;
3942 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003943 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003945 int addrlen, flags;
3946 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003949 arglen = PyTuple_Size(args);
3950 switch (arglen) {
3951 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003952 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3953 return NULL;
3954 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003955 break;
3956 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003957 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3958 &pbuf, &flags, &addro)) {
3959 return NULL;
3960 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003961 break;
3962 default:
3963 PyErr_Format(PyExc_TypeError,
3964 "sendto() takes 2 or 3 arguments (%d given)",
3965 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003966 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 if (!IS_SELECTABLE(s)) {
3970 PyBuffer_Release(&pbuf);
3971 return select_error();
3972 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3975 PyBuffer_Release(&pbuf);
3976 return NULL;
3977 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003978
Victor Stinner31bf2d52015-04-01 21:57:09 +02003979 ctx.buf = pbuf.buf;
3980 ctx.len = pbuf.len;
3981 ctx.flags = flags;
3982 ctx.addrlen = addrlen;
3983 ctx.addrbuf = &addrbuf;
3984 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003985 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 return NULL;
3987 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003988 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003989
3990 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003991}
3992
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003993PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003994"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003995\n\
3996Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003997For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003998
Guido van Rossum30a685f1991-06-27 15:51:29 +00003999
Victor Stinner35bee932015-04-02 12:28:07 +02004000/* The sendmsg() and recvmsg[_into]() methods require a working
4001 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4002#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004003struct sock_sendmsg {
4004 struct msghdr *msg;
4005 int flags;
4006 ssize_t result;
4007};
4008
4009static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004010sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4011 struct msghdr *msg,
4012 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4013 Py_ssize_t ndataparts, ndatabufs = 0;
4014 int result = -1;
4015 struct iovec *iovs = NULL;
4016 PyObject *data_fast = NULL;
4017 Py_buffer *databufs = NULL;
4018
4019 /* Fill in an iovec for each message part, and save the Py_buffer
4020 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004021 data_fast = PySequence_Fast(data_arg,
4022 "sendmsg() argument 1 must be an "
4023 "iterable");
4024 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004025 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004026 }
4027
Christian Heimesdffa3942016-09-05 23:54:41 +02004028 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4029 if (ndataparts > INT_MAX) {
4030 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4031 goto finally;
4032 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004033
Christian Heimesdffa3942016-09-05 23:54:41 +02004034 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004035 if (ndataparts > 0) {
4036 iovs = PyMem_New(struct iovec, ndataparts);
4037 if (iovs == NULL) {
4038 PyErr_NoMemory();
4039 goto finally;
4040 }
4041 msg->msg_iov = iovs;
4042
4043 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004044 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004045 PyErr_NoMemory();
4046 goto finally;
4047 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004048 }
4049 for (; ndatabufs < ndataparts; ndatabufs++) {
4050 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4051 "y*;sendmsg() argument 1 must be an iterable of "
4052 "bytes-like objects",
4053 &databufs[ndatabufs]))
4054 goto finally;
4055 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4056 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4057 }
4058 result = 0;
4059 finally:
4060 *databufsout = databufs;
4061 *ndatabufsout = ndatabufs;
4062 Py_XDECREF(data_fast);
4063 return result;
4064}
4065
4066static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004067sock_sendmsg_impl(PySocketSockObject *s, void *data)
4068{
4069 struct sock_sendmsg *ctx = data;
4070
4071 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4072 return (ctx->result >= 0);
4073}
4074
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004075/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4076
4077static PyObject *
4078sock_sendmsg(PySocketSockObject *s, PyObject *args)
4079{
Christian Heimesdffa3942016-09-05 23:54:41 +02004080 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004081 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004082 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004083 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004084 struct cmsginfo {
4085 int level;
4086 int type;
4087 Py_buffer data;
4088 } *cmsgs = NULL;
4089 void *controlbuf = NULL;
4090 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004091 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004092 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004094 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004095
4096 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004097 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004098 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004099 }
4100
4101 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004102
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103 /* Parse destination address. */
4104 if (addr_arg != NULL && addr_arg != Py_None) {
4105 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4106 goto finally;
4107 msg.msg_name = &addrbuf;
4108 msg.msg_namelen = addrlen;
4109 }
4110
4111 /* Fill in an iovec for each message part, and save the Py_buffer
4112 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004113 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004114 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004115 }
4116
4117 if (cmsg_arg == NULL)
4118 ncmsgs = 0;
4119 else {
4120 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4121 "sendmsg() argument 2 must be an "
4122 "iterable")) == NULL)
4123 goto finally;
4124 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4125 }
4126
4127#ifndef CMSG_SPACE
4128 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004129 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004130 "sending multiple control messages is not supported "
4131 "on this system");
4132 goto finally;
4133 }
4134#endif
4135 /* Save level, type and Py_buffer for each control message,
4136 and calculate total size. */
4137 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4138 PyErr_NoMemory();
4139 goto finally;
4140 }
4141 controllen = controllen_last = 0;
4142 while (ncmsgbufs < ncmsgs) {
4143 size_t bufsize, space;
4144
4145 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4146 "(iiy*):[sendmsg() ancillary data items]",
4147 &cmsgs[ncmsgbufs].level,
4148 &cmsgs[ncmsgbufs].type,
4149 &cmsgs[ncmsgbufs].data))
4150 goto finally;
4151 bufsize = cmsgs[ncmsgbufs++].data.len;
4152
4153#ifdef CMSG_SPACE
4154 if (!get_CMSG_SPACE(bufsize, &space)) {
4155#else
4156 if (!get_CMSG_LEN(bufsize, &space)) {
4157#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004158 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004159 goto finally;
4160 }
4161 controllen += space;
4162 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004163 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004164 goto finally;
4165 }
4166 controllen_last = controllen;
4167 }
4168
4169 /* Construct ancillary data block from control message info. */
4170 if (ncmsgbufs > 0) {
4171 struct cmsghdr *cmsgh = NULL;
4172
Victor Stinner52d61e42016-09-12 11:41:58 +02004173 controlbuf = PyMem_Malloc(controllen);
4174 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004175 PyErr_NoMemory();
4176 goto finally;
4177 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004178 msg.msg_control = controlbuf;
4179
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004180 msg.msg_controllen = controllen;
4181
4182 /* Need to zero out the buffer as a workaround for glibc's
4183 CMSG_NXTHDR() implementation. After getting the pointer to
4184 the next header, it checks its (uninitialized) cmsg_len
4185 member to see if the "message" fits in the buffer, and
4186 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004187 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004188 memset(controlbuf, 0, controllen);
4189
4190 for (i = 0; i < ncmsgbufs; i++) {
4191 size_t msg_len, data_len = cmsgs[i].data.len;
4192 int enough_space = 0;
4193
4194 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4195 if (cmsgh == NULL) {
4196 PyErr_Format(PyExc_RuntimeError,
4197 "unexpected NULL result from %s()",
4198 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4199 goto finally;
4200 }
4201 if (!get_CMSG_LEN(data_len, &msg_len)) {
4202 PyErr_SetString(PyExc_RuntimeError,
4203 "item size out of range for CMSG_LEN()");
4204 goto finally;
4205 }
4206 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4207 size_t space;
4208
4209 cmsgh->cmsg_len = msg_len;
4210 if (get_cmsg_data_space(&msg, cmsgh, &space))
4211 enough_space = (space >= data_len);
4212 }
4213 if (!enough_space) {
4214 PyErr_SetString(PyExc_RuntimeError,
4215 "ancillary data does not fit in calculated "
4216 "space");
4217 goto finally;
4218 }
4219 cmsgh->cmsg_level = cmsgs[i].level;
4220 cmsgh->cmsg_type = cmsgs[i].type;
4221 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4222 }
4223 }
4224
4225 /* Make the system call. */
4226 if (!IS_SELECTABLE(s)) {
4227 select_error();
4228 goto finally;
4229 }
4230
Victor Stinner31bf2d52015-04-01 21:57:09 +02004231 ctx.msg = &msg;
4232 ctx.flags = flags;
4233 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004235
4236 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004237
4238finally:
4239 PyMem_Free(controlbuf);
4240 for (i = 0; i < ncmsgbufs; i++)
4241 PyBuffer_Release(&cmsgs[i].data);
4242 PyMem_Free(cmsgs);
4243 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004244 PyMem_Free(msg.msg_iov);
4245 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004246 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004247 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004249 return retval;
4250}
4251
4252PyDoc_STRVAR(sendmsg_doc,
4253"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4254\n\
4255Send normal and ancillary data to the socket, gathering the\n\
4256non-ancillary data from a series of buffers and concatenating it into\n\
4257a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004258data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004259The ancdata argument specifies the ancillary data (control messages)\n\
4260as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4261cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4262protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004263is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004264argument defaults to 0 and has the same meaning as for send(). If\n\
4265address is supplied and not None, it sets a destination address for\n\
4266the message. The return value is the number of bytes of non-ancillary\n\
4267data sent.");
4268#endif /* CMSG_LEN */
4269
Christian Heimesdffa3942016-09-05 23:54:41 +02004270#ifdef HAVE_SOCKADDR_ALG
4271static PyObject*
4272sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4273{
4274 PyObject *retval = NULL;
4275
4276 Py_ssize_t i, ndatabufs = 0;
4277 Py_buffer *databufs = NULL;
4278 PyObject *data_arg = NULL;
4279
4280 Py_buffer iv = {NULL, NULL};
4281
4282 PyObject *opobj = NULL;
4283 int op = -1;
4284
4285 PyObject *assoclenobj = NULL;
4286 int assoclen = -1;
4287
4288 unsigned int *uiptr;
4289 int flags = 0;
4290
4291 struct msghdr msg;
4292 struct cmsghdr *header = NULL;
4293 struct af_alg_iv *alg_iv = NULL;
4294 struct sock_sendmsg ctx;
4295 Py_ssize_t controllen;
4296 void *controlbuf = NULL;
4297 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4298
4299 if (self->sock_family != AF_ALG) {
4300 PyErr_SetString(PyExc_OSError,
4301 "algset is only supported for AF_ALG");
4302 return NULL;
4303 }
4304
4305 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4306 "|O$O!y*O!i:sendmsg_afalg", keywords,
4307 &data_arg,
4308 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004309 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004310 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004311 }
4312
4313 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004314
4315 /* op is a required, keyword-only argument >= 0 */
4316 if (opobj != NULL) {
4317 op = _PyLong_AsInt(opobj);
4318 }
4319 if (op < 0) {
4320 /* override exception from _PyLong_AsInt() */
4321 PyErr_SetString(PyExc_TypeError,
4322 "Invalid or missing argument 'op'");
4323 goto finally;
4324 }
4325 /* assoclen is optional but must be >= 0 */
4326 if (assoclenobj != NULL) {
4327 assoclen = _PyLong_AsInt(assoclenobj);
4328 if (assoclen == -1 && PyErr_Occurred()) {
4329 goto finally;
4330 }
4331 if (assoclen < 0) {
4332 PyErr_SetString(PyExc_TypeError,
4333 "assoclen must be positive");
4334 goto finally;
4335 }
4336 }
4337
4338 controllen = CMSG_SPACE(4);
4339 if (iv.buf != NULL) {
4340 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4341 }
4342 if (assoclen >= 0) {
4343 controllen += CMSG_SPACE(4);
4344 }
4345
4346 controlbuf = PyMem_Malloc(controllen);
4347 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004348 PyErr_NoMemory();
4349 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004350 }
4351 memset(controlbuf, 0, controllen);
4352
Christian Heimesdffa3942016-09-05 23:54:41 +02004353 msg.msg_controllen = controllen;
4354 msg.msg_control = controlbuf;
4355
4356 /* Fill in an iovec for each message part, and save the Py_buffer
4357 structs to release afterwards. */
4358 if (data_arg != NULL) {
4359 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4360 goto finally;
4361 }
4362 }
4363
4364 /* set operation to encrypt or decrypt */
4365 header = CMSG_FIRSTHDR(&msg);
4366 if (header == NULL) {
4367 PyErr_SetString(PyExc_RuntimeError,
4368 "unexpected NULL result from CMSG_FIRSTHDR");
4369 goto finally;
4370 }
4371 header->cmsg_level = SOL_ALG;
4372 header->cmsg_type = ALG_SET_OP;
4373 header->cmsg_len = CMSG_LEN(4);
4374 uiptr = (void*)CMSG_DATA(header);
4375 *uiptr = (unsigned int)op;
4376
4377 /* set initialization vector */
4378 if (iv.buf != NULL) {
4379 header = CMSG_NXTHDR(&msg, header);
4380 if (header == NULL) {
4381 PyErr_SetString(PyExc_RuntimeError,
4382 "unexpected NULL result from CMSG_NXTHDR(iv)");
4383 goto finally;
4384 }
4385 header->cmsg_level = SOL_ALG;
4386 header->cmsg_type = ALG_SET_IV;
4387 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4388 alg_iv = (void*)CMSG_DATA(header);
4389 alg_iv->ivlen = iv.len;
4390 memcpy(alg_iv->iv, iv.buf, iv.len);
4391 }
4392
4393 /* set length of associated data for AEAD */
4394 if (assoclen >= 0) {
4395 header = CMSG_NXTHDR(&msg, header);
4396 if (header == NULL) {
4397 PyErr_SetString(PyExc_RuntimeError,
4398 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4399 goto finally;
4400 }
4401 header->cmsg_level = SOL_ALG;
4402 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4403 header->cmsg_len = CMSG_LEN(4);
4404 uiptr = (void*)CMSG_DATA(header);
4405 *uiptr = (unsigned int)assoclen;
4406 }
4407
4408 ctx.msg = &msg;
4409 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004410 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004411 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004412 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004413
4414 retval = PyLong_FromSsize_t(ctx.result);
4415
4416 finally:
4417 PyMem_Free(controlbuf);
4418 if (iv.buf != NULL) {
4419 PyBuffer_Release(&iv);
4420 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004421 PyMem_Free(msg.msg_iov);
4422 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004423 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004424 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004425 PyMem_Free(databufs);
4426 return retval;
4427}
4428
4429PyDoc_STRVAR(sendmsg_afalg_doc,
4430"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4431\n\
4432Set operation mode, IV and length of associated data for an AF_ALG\n\
4433operation socket.");
4434#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004435
Guido van Rossum30a685f1991-06-27 15:51:29 +00004436/* s.shutdown(how) method */
4437
Guido van Rossum73624e91994-10-10 17:59:00 +00004438static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004439sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 int how;
4442 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004443
Serhiy Storchaka78980432013-01-15 01:12:17 +02004444 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 if (how == -1 && PyErr_Occurred())
4446 return NULL;
4447 Py_BEGIN_ALLOW_THREADS
4448 res = shutdown(s->sock_fd, how);
4449 Py_END_ALLOW_THREADS
4450 if (res < 0)
4451 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004452 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004453}
4454
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004455PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004456"shutdown(flag)\n\
4457\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004458Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4459of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004460
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004461#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004462static PyObject*
4463sock_ioctl(PySocketSockObject *s, PyObject *arg)
4464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 unsigned long cmd = SIO_RCVALL;
4466 PyObject *argO;
4467 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4470 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 switch (cmd) {
4473 case SIO_RCVALL: {
4474 unsigned int option = RCVALL_ON;
4475 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4476 return NULL;
4477 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4478 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4479 return set_error();
4480 }
4481 return PyLong_FromUnsignedLong(recv); }
4482 case SIO_KEEPALIVE_VALS: {
4483 struct tcp_keepalive ka;
4484 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4485 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4486 return NULL;
4487 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4488 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4489 return set_error();
4490 }
4491 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004492#if defined(SIO_LOOPBACK_FAST_PATH)
4493 case SIO_LOOPBACK_FAST_PATH: {
4494 unsigned int option;
4495 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4496 return NULL;
4497 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4498 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4499 return set_error();
4500 }
4501 return PyLong_FromUnsignedLong(recv); }
4502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 default:
4504 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4505 return NULL;
4506 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004507}
4508PyDoc_STRVAR(sock_ioctl_doc,
4509"ioctl(cmd, option) -> long\n\
4510\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004511Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4512SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004513SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4514SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004515#endif
4516
4517#if defined(MS_WINDOWS)
4518static PyObject*
4519sock_share(PySocketSockObject *s, PyObject *arg)
4520{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004521 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004522 DWORD processId;
4523 int result;
4524
4525 if (!PyArg_ParseTuple(arg, "I", &processId))
4526 return NULL;
4527
4528 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004529 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004530 Py_END_ALLOW_THREADS
4531 if (result == SOCKET_ERROR)
4532 return set_error();
4533 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4534}
4535PyDoc_STRVAR(sock_share_doc,
4536"share(process_id) -> bytes\n\
4537\n\
4538Share the socket with another process. The target process id\n\
4539must be provided and the resulting bytes object passed to the target\n\
4540process. There the shared socket can be instantiated by calling\n\
4541socket.fromshare().");
4542
Christian Heimesfaf2f632008-01-06 16:59:19 +00004543
4544#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004545
4546/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004547
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004548static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4550 accept_doc},
4551 {"bind", (PyCFunction)sock_bind, METH_O,
4552 bind_doc},
4553 {"close", (PyCFunction)sock_close, METH_NOARGS,
4554 close_doc},
4555 {"connect", (PyCFunction)sock_connect, METH_O,
4556 connect_doc},
4557 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4558 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004559 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4560 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4562 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004563#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 {"getpeername", (PyCFunction)sock_getpeername,
4565 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 {"getsockname", (PyCFunction)sock_getsockname,
4568 METH_NOARGS, getsockname_doc},
4569 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4570 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004571#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4573 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004574#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004575#if defined(MS_WINDOWS)
4576 {"share", (PyCFunction)sock_share, METH_VARARGS,
4577 sock_share_doc},
4578#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004579 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 listen_doc},
4581 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4582 recv_doc},
4583 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4584 recv_into_doc},
4585 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4586 recvfrom_doc},
4587 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4588 recvfrom_into_doc},
4589 {"send", (PyCFunction)sock_send, METH_VARARGS,
4590 send_doc},
4591 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4592 sendall_doc},
4593 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4594 sendto_doc},
4595 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4596 setblocking_doc},
4597 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4598 settimeout_doc},
4599 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4600 gettimeout_doc},
4601 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4602 setsockopt_doc},
4603 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4604 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004605#ifdef CMSG_LEN
4606 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4607 recvmsg_doc},
4608 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4609 recvmsg_into_doc,},
4610 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4611 sendmsg_doc},
4612#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004613#ifdef HAVE_SOCKADDR_ALG
4614 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4615 sendmsg_afalg_doc},
4616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004618};
4619
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004620/* SockObject members */
4621static PyMemberDef sock_memberlist[] = {
4622 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4623 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4624 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004625 {0},
4626};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004627
Victor Stinner71694d52015-03-28 01:18:54 +01004628static PyGetSetDef sock_getsetlist[] = {
4629 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4630 {NULL} /* sentinel */
4631};
4632
Guido van Rossum73624e91994-10-10 17:59:00 +00004633/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004634 First close the file description. */
4635
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004636static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004637sock_finalize(PySocketSockObject *s)
4638{
4639 SOCKET_T fd;
4640 PyObject *error_type, *error_value, *error_traceback;
4641
4642 /* Save the current exception, if any. */
4643 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4644
Victor Stinnerd3afb622016-07-22 17:47:09 +02004645 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004646 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4647 /* Spurious errors can appear at shutdown */
4648 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4649 PyErr_WriteUnraisable((PyObject *)s);
4650 }
4651 }
4652
4653 /* Only close the socket *after* logging the ResourceWarning warning
4654 to allow the logger to call socket methods like
4655 socket.getsockname(). If the socket is closed before, socket
4656 methods fails with the EBADF error. */
4657 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004658 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004659
4660 /* We do not want to retry upon EINTR: see sock_close() */
4661 Py_BEGIN_ALLOW_THREADS
4662 (void) SOCKETCLOSE(fd);
4663 Py_END_ALLOW_THREADS
4664 }
4665
4666 /* Restore the saved exception. */
4667 PyErr_Restore(error_type, error_value, error_traceback);
4668}
4669
4670static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004671sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004672{
Victor Stinner19a8e842016-03-21 16:36:48 +01004673 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4674 return;
4675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004677}
4678
Guido van Rossum30a685f1991-06-27 15:51:29 +00004679
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004680static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004681sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004682{
Victor Stinnere254e532014-07-26 14:36:55 +02004683 long sock_fd;
4684 /* On Windows, this test is needed because SOCKET_T is unsigned */
4685 if (s->sock_fd == INVALID_SOCKET) {
4686 sock_fd = -1;
4687 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004688#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004689 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 /* this can occur on Win64, and actually there is a special
4691 ugly printf formatter for decimal pointer length integer
4692 printing, only bother if necessary*/
4693 PyErr_SetString(PyExc_OverflowError,
4694 "no printf formatter to display "
4695 "the socket descriptor in decimal");
4696 return NULL;
4697 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004698#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004699 else
4700 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 return PyUnicode_FromFormat(
4702 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004703 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 s->sock_type,
4705 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004706}
4707
4708
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004709/* Create a new, uninitialized socket object. */
4710
4711static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004712sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004716 new = type->tp_alloc(type, 0);
4717 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004718 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004719 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 ((PySocketSockObject *)new)->errorhandler = &set_error;
4721 }
4722 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004723}
4724
4725
4726/* Initialize a new socket object. */
4727
Victor Stinnerdaf45552013-08-28 00:53:59 +02004728#ifdef SOCK_CLOEXEC
4729/* socket() and socketpair() fail with EINVAL on Linux kernel older
4730 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4731static int sock_cloexec_works = -1;
4732#endif
4733
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004734/*ARGSUSED*/
4735static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004736sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 PySocketSockObject *s = (PySocketSockObject *)self;
4739 PyObject *fdobj = NULL;
4740 SOCKET_T fd = INVALID_SOCKET;
4741 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4742 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004743#ifndef MS_WINDOWS
4744#ifdef SOCK_CLOEXEC
4745 int *atomic_flag_works = &sock_cloexec_works;
4746#else
4747 int *atomic_flag_works = NULL;
4748#endif
4749#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4752 "|iiiO:socket", keywords,
4753 &family, &type, &proto, &fdobj))
4754 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004757#ifdef MS_WINDOWS
4758 /* recreate a socket that was duplicated */
4759 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004760 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004761 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4762 PyErr_Format(PyExc_ValueError,
4763 "socket descriptor string has wrong size, "
4764 "should be %zu bytes.", sizeof(info));
4765 return -1;
4766 }
4767 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4768 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004769 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004770 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4771 Py_END_ALLOW_THREADS
4772 if (fd == INVALID_SOCKET) {
4773 set_error();
4774 return -1;
4775 }
4776 family = info.iAddressFamily;
4777 type = info.iSocketType;
4778 proto = info.iProtocol;
4779 }
4780 else
4781#endif
4782 {
4783 fd = PyLong_AsSocket_t(fdobj);
4784 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4785 return -1;
4786 if (fd == INVALID_SOCKET) {
4787 PyErr_SetString(PyExc_ValueError,
4788 "can't use invalid socket value");
4789 return -1;
4790 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 }
4792 }
4793 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004794#ifdef MS_WINDOWS
4795 /* Windows implementation */
4796#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4797#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4798#endif
4799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004801 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004802 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004803 NULL, 0,
4804 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4805 if (fd == INVALID_SOCKET) {
4806 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4807 support_wsa_no_inherit = 0;
4808 fd = socket(family, type, proto);
4809 }
4810 }
4811 else {
4812 fd = socket(family, type, proto);
4813 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 if (fd == INVALID_SOCKET) {
4817 set_error();
4818 return -1;
4819 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004820
4821 if (!support_wsa_no_inherit) {
4822 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4823 closesocket(fd);
4824 PyErr_SetFromWindowsErr(0);
4825 return -1;
4826 }
4827 }
4828#else
4829 /* UNIX */
4830 Py_BEGIN_ALLOW_THREADS
4831#ifdef SOCK_CLOEXEC
4832 if (sock_cloexec_works != 0) {
4833 fd = socket(family, type | SOCK_CLOEXEC, proto);
4834 if (sock_cloexec_works == -1) {
4835 if (fd >= 0) {
4836 sock_cloexec_works = 1;
4837 }
4838 else if (errno == EINVAL) {
4839 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4840 sock_cloexec_works = 0;
4841 fd = socket(family, type, proto);
4842 }
4843 }
4844 }
4845 else
4846#endif
4847 {
4848 fd = socket(family, type, proto);
4849 }
4850 Py_END_ALLOW_THREADS
4851
4852 if (fd == INVALID_SOCKET) {
4853 set_error();
4854 return -1;
4855 }
4856
4857 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4858 SOCKETCLOSE(fd);
4859 return -1;
4860 }
4861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004863 if (init_sockobject(s, fd, family, type, proto) == -1) {
4864 SOCKETCLOSE(fd);
4865 return -1;
4866 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004869
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004870}
4871
4872
Guido van Rossumb6775db1994-08-01 11:34:53 +00004873/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004874
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004875static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4877 "_socket.socket", /* tp_name */
4878 sizeof(PySocketSockObject), /* tp_basicsize */
4879 0, /* tp_itemsize */
4880 (destructor)sock_dealloc, /* tp_dealloc */
4881 0, /* tp_print */
4882 0, /* tp_getattr */
4883 0, /* tp_setattr */
4884 0, /* tp_reserved */
4885 (reprfunc)sock_repr, /* tp_repr */
4886 0, /* tp_as_number */
4887 0, /* tp_as_sequence */
4888 0, /* tp_as_mapping */
4889 0, /* tp_hash */
4890 0, /* tp_call */
4891 0, /* tp_str */
4892 PyObject_GenericGetAttr, /* tp_getattro */
4893 0, /* tp_setattro */
4894 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004895 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4896 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 sock_doc, /* tp_doc */
4898 0, /* tp_traverse */
4899 0, /* tp_clear */
4900 0, /* tp_richcompare */
4901 0, /* tp_weaklistoffset */
4902 0, /* tp_iter */
4903 0, /* tp_iternext */
4904 sock_methods, /* tp_methods */
4905 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004906 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 0, /* tp_base */
4908 0, /* tp_dict */
4909 0, /* tp_descr_get */
4910 0, /* tp_descr_set */
4911 0, /* tp_dictoffset */
4912 sock_initobj, /* tp_init */
4913 PyType_GenericAlloc, /* tp_alloc */
4914 sock_new, /* tp_new */
4915 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004916 0, /* tp_is_gc */
4917 0, /* tp_bases */
4918 0, /* tp_mro */
4919 0, /* tp_cache */
4920 0, /* tp_subclasses */
4921 0, /* tp_weaklist */
4922 0, /* tp_del */
4923 0, /* tp_version_tag */
4924 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004925};
4926
Guido van Rossum30a685f1991-06-27 15:51:29 +00004927
Guido van Rossum81194471991-07-27 21:42:02 +00004928/* Python interface to gethostname(). */
4929
4930/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004931static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004932socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004933{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004934#ifdef MS_WINDOWS
4935 /* Don't use winsock's gethostname, as this returns the ANSI
4936 version of the hostname, whereas we need a Unicode string.
4937 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004938 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004939 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004940 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004941 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004942
4943 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004944 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004945
4946 if (GetLastError() != ERROR_MORE_DATA)
4947 return PyErr_SetFromWindowsErr(0);
4948
4949 if (size == 0)
4950 return PyUnicode_New(0, 0);
4951
4952 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4953 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004954 name = PyMem_New(wchar_t, size);
4955 if (!name) {
4956 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004957 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004958 }
Victor Stinner74168972011-11-17 01:11:36 +01004959 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4960 name,
4961 &size))
4962 {
4963 PyMem_Free(name);
4964 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004965 }
Victor Stinner74168972011-11-17 01:11:36 +01004966
4967 result = PyUnicode_FromWideChar(name, size);
4968 PyMem_Free(name);
4969 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 char buf[1024];
4972 int res;
4973 Py_BEGIN_ALLOW_THREADS
4974 res = gethostname(buf, (int) sizeof buf - 1);
4975 Py_END_ALLOW_THREADS
4976 if (res < 0)
4977 return set_error();
4978 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004979 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004980#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004981}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004983PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004984"gethostname() -> string\n\
4985\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004986Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004987
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004988#ifdef HAVE_SETHOSTNAME
4989PyDoc_STRVAR(sethostname_doc,
4990"sethostname(name)\n\n\
4991Sets the hostname to name.");
4992
4993static PyObject *
4994socket_sethostname(PyObject *self, PyObject *args)
4995{
4996 PyObject *hnobj;
4997 Py_buffer buf;
4998 int res, flag = 0;
4999
Christian Heimesd2774c72013-06-19 02:06:29 +02005000#ifdef _AIX
5001/* issue #18259, not declared in any useful header file */
5002extern int sethostname(const char *, size_t);
5003#endif
5004
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005005 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5006 PyErr_Clear();
5007 if (!PyArg_ParseTuple(args, "O&:sethostname",
5008 PyUnicode_FSConverter, &hnobj))
5009 return NULL;
5010 flag = 1;
5011 }
5012 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5013 if (!res) {
5014 res = sethostname(buf.buf, buf.len);
5015 PyBuffer_Release(&buf);
5016 }
5017 if (flag)
5018 Py_DECREF(hnobj);
5019 if (res)
5020 return set_error();
5021 Py_RETURN_NONE;
5022}
5023#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005024
Guido van Rossum30a685f1991-06-27 15:51:29 +00005025/* Python interface to gethostbyname(name). */
5026
5027/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005028static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005029socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 char *name;
5032 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005033 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005034
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005035 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 return NULL;
5037 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005038 goto finally;
5039 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5040finally:
5041 PyMem_Free(name);
5042 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005043}
5044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005045PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005046"gethostbyname(host) -> address\n\
5047\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005048Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005049
5050
Victor Stinner72400302016-01-28 15:41:01 +01005051static PyObject*
5052sock_decode_hostname(const char *name)
5053{
5054#ifdef MS_WINDOWS
5055 /* Issue #26227: gethostbyaddr() returns a string encoded
5056 * to the ANSI code page */
5057 return PyUnicode_DecodeFSDefault(name);
5058#else
5059 /* Decode from UTF-8 */
5060 return PyUnicode_FromString(name);
5061#endif
5062}
5063
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005064/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5065
5066static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005067gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 char **pch;
5070 PyObject *rtn_tuple = (PyObject *)NULL;
5071 PyObject *name_list = (PyObject *)NULL;
5072 PyObject *addr_list = (PyObject *)NULL;
5073 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005074 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 if (h == NULL) {
5077 /* Let's get real error message to return */
5078 set_herror(h_errno);
5079 return NULL;
5080 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 if (h->h_addrtype != af) {
5083 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005084 errno = EAFNOSUPPORT;
5085 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 return NULL;
5087 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 case AF_INET:
5092 if (alen < sizeof(struct sockaddr_in))
5093 return NULL;
5094 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005095
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005096#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 case AF_INET6:
5098 if (alen < sizeof(struct sockaddr_in6))
5099 return NULL;
5100 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005101#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 if ((name_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 if ((addr_list = PyList_New(0)) == NULL)
5109 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 /* SF #1511317: h_aliases can be NULL */
5112 if (h->h_aliases) {
5113 for (pch = h->h_aliases; *pch != NULL; pch++) {
5114 int status;
5115 tmp = PyUnicode_FromString(*pch);
5116 if (tmp == NULL)
5117 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 status = PyList_Append(name_list, tmp);
5120 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 if (status)
5123 goto err;
5124 }
5125 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5128 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 case AF_INET:
5133 {
5134 struct sockaddr_in sin;
5135 memset(&sin, 0, sizeof(sin));
5136 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005137#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5141 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 if (pch == h->h_addr_list && alen >= sizeof(sin))
5144 memcpy((char *) addr, &sin, sizeof(sin));
5145 break;
5146 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005147
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005148#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 case AF_INET6:
5150 {
5151 struct sockaddr_in6 sin6;
5152 memset(&sin6, 0, sizeof(sin6));
5153 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005154#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5158 tmp = makeipaddr((struct sockaddr *)&sin6,
5159 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5162 memcpy((char *) addr, &sin6, sizeof(sin6));
5163 break;
5164 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005165#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005168 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 "unsupported address family");
5170 return NULL;
5171 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 if (tmp == NULL)
5174 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 status = PyList_Append(addr_list, tmp);
5177 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 if (status)
5180 goto err;
5181 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005182
Victor Stinner72400302016-01-28 15:41:01 +01005183 name = sock_decode_hostname(h->h_name);
5184 if (name == NULL)
5185 goto err;
5186 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005187
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005188 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 Py_XDECREF(name_list);
5190 Py_XDECREF(addr_list);
5191 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005192}
5193
5194
5195/* Python interface to gethostbyname_ex(name). */
5196
5197/*ARGSUSED*/
5198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005199socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 char *name;
5202 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005203 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005205 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005206#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005208#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005210#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 char buf[16384];
5212 int buf_len = (sizeof buf) - 1;
5213 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005214#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005215#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005217#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005218#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005219
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005220 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005222 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005223 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005225#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005226#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005227 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005229#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005231#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 memset((void *) &data, '\0', sizeof(data));
5233 result = gethostbyname_r(name, &hp_allocated, &data);
5234 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005235#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005236#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005237#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005239#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005240 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005242#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 Py_END_ALLOW_THREADS
5244 /* Some C libraries would require addr.__ss_family instead of
5245 addr.ss_family.
5246 Therefore, we cast the sockaddr_storage into sockaddr to
5247 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005248 sa = SAS2SA(&addr);
5249 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005251#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005253#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005254finally:
5255 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005257}
5258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005259PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005260"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5261\n\
5262Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005263for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005264
5265
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005266/* Python interface to gethostbyaddr(IP). */
5267
5268/*ARGSUSED*/
5269static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005270socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005271{
Charles-François Natali8b759652011-12-23 16:44:51 +01005272 sock_addr_t addr;
5273 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 char *ip_num;
5275 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005276 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005277#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005279#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005281#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 /* glibcs up to 2.10 assume that the buf argument to
5283 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5284 does not ensure. The attribute below instructs the compiler
5285 to maintain this alignment. */
5286 char buf[16384] Py_ALIGNED(8);
5287 int buf_len = (sizeof buf) - 1;
5288 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005289#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005290#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005292#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005293#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005294 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 int al;
5296 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005297
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005298 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 return NULL;
5300 af = AF_UNSPEC;
5301 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005302 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 af = sa->sa_family;
5304 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005305 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 switch (af) {
5307 case AF_INET:
5308 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5309 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5310 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005311#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 case AF_INET6:
5313 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5314 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5315 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005318 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005319 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 }
5321 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005322#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005323#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005324 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 &hp_allocated, buf, buf_len,
5326 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005327#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 h = gethostbyaddr_r(ap, al, af,
5329 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005330#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 memset((void *) &data, '\0', sizeof(data));
5332 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5333 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005334#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005335#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005336#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005338#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005339 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005341#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005343 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005344#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005346#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005347finally:
5348 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005350}
5351
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005352PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005353"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5354\n\
5355Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005356for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005357
Guido van Rossum30a685f1991-06-27 15:51:29 +00005358
5359/* Python interface to getservbyname(name).
5360 This only returns the port number, since the other info is already
5361 known or not useful (like the list of aliases). */
5362
5363/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005364static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005365socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005366{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005367 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 struct servent *sp;
5369 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5370 return NULL;
5371 Py_BEGIN_ALLOW_THREADS
5372 sp = getservbyname(name, proto);
5373 Py_END_ALLOW_THREADS
5374 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005375 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 return NULL;
5377 }
5378 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005379}
5380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005381PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005382"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005383\n\
5384Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005385The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5386otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005387
Guido van Rossum30a685f1991-06-27 15:51:29 +00005388
Barry Warsaw11b91a02004-06-28 00:50:43 +00005389/* Python interface to getservbyport(port).
5390 This only returns the service name, since the other info is already
5391 known or not useful (like the list of aliases). */
5392
5393/*ARGSUSED*/
5394static PyObject *
5395socket_getservbyport(PyObject *self, PyObject *args)
5396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005398 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 struct servent *sp;
5400 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5401 return NULL;
5402 if (port < 0 || port > 0xffff) {
5403 PyErr_SetString(
5404 PyExc_OverflowError,
5405 "getservbyport: port must be 0-65535.");
5406 return NULL;
5407 }
5408 Py_BEGIN_ALLOW_THREADS
5409 sp = getservbyport(htons((short)port), proto);
5410 Py_END_ALLOW_THREADS
5411 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005412 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 return NULL;
5414 }
5415 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005416}
5417
5418PyDoc_STRVAR(getservbyport_doc,
5419"getservbyport(port[, protocolname]) -> string\n\
5420\n\
5421Return the service name from a port number and protocol name.\n\
5422The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5423otherwise any protocol will match.");
5424
Guido van Rossum3901d851996-12-19 16:35:04 +00005425/* Python interface to getprotobyname(name).
5426 This only returns the protocol number, since the other info is
5427 already known or not useful (like the list of aliases). */
5428
5429/*ARGSUSED*/
5430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005431socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005432{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005433 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 struct protoent *sp;
5435 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5436 return NULL;
5437 Py_BEGIN_ALLOW_THREADS
5438 sp = getprotobyname(name);
5439 Py_END_ALLOW_THREADS
5440 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005441 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 return NULL;
5443 }
5444 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005445}
5446
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005447PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005448"getprotobyname(name) -> integer\n\
5449\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005450Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005451
Guido van Rossum3901d851996-12-19 16:35:04 +00005452
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005453#ifndef NO_DUP
5454/* dup() function for socket fds */
5455
5456static PyObject *
5457socket_dup(PyObject *self, PyObject *fdobj)
5458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 SOCKET_T fd, newfd;
5460 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005461#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005462 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005463#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 fd = PyLong_AsSocket_t(fdobj);
5466 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5467 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005468
Victor Stinnerdaf45552013-08-28 00:53:59 +02005469#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005470 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005471 return set_error();
5472
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005473 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005474 FROM_PROTOCOL_INFO,
5475 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 if (newfd == INVALID_SOCKET)
5477 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005478
Victor Stinnerdaf45552013-08-28 00:53:59 +02005479 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5480 closesocket(newfd);
5481 PyErr_SetFromWindowsErr(0);
5482 return NULL;
5483 }
5484#else
5485 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5486 newfd = _Py_dup(fd);
5487 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005488 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005489#endif
5490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 newfdobj = PyLong_FromSocket_t(newfd);
5492 if (newfdobj == NULL)
5493 SOCKETCLOSE(newfd);
5494 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005495}
5496
5497PyDoc_STRVAR(dup_doc,
5498"dup(integer) -> integer\n\
5499\n\
5500Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5501sockets; on some platforms os.dup() won't work for socket file descriptors.");
5502#endif
5503
5504
Dave Cole331708b2004-08-09 04:51:41 +00005505#ifdef HAVE_SOCKETPAIR
5506/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005507 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005508 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005509
5510/*ARGSUSED*/
5511static PyObject *
5512socket_socketpair(PyObject *self, PyObject *args)
5513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 PySocketSockObject *s0 = NULL, *s1 = NULL;
5515 SOCKET_T sv[2];
5516 int family, type = SOCK_STREAM, proto = 0;
5517 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005518#ifdef SOCK_CLOEXEC
5519 int *atomic_flag_works = &sock_cloexec_works;
5520#else
5521 int *atomic_flag_works = NULL;
5522#endif
5523 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005524
5525#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005527#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5531 &family, &type, &proto))
5532 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005535 Py_BEGIN_ALLOW_THREADS
5536#ifdef SOCK_CLOEXEC
5537 if (sock_cloexec_works != 0) {
5538 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5539 if (sock_cloexec_works == -1) {
5540 if (ret >= 0) {
5541 sock_cloexec_works = 1;
5542 }
5543 else if (errno == EINVAL) {
5544 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5545 sock_cloexec_works = 0;
5546 ret = socketpair(family, type, proto, sv);
5547 }
5548 }
5549 }
5550 else
5551#endif
5552 {
5553 ret = socketpair(family, type, proto, sv);
5554 }
5555 Py_END_ALLOW_THREADS
5556
5557 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005559
5560 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5561 goto finally;
5562 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5563 goto finally;
5564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 s0 = new_sockobject(sv[0], family, type, proto);
5566 if (s0 == NULL)
5567 goto finally;
5568 s1 = new_sockobject(sv[1], family, type, proto);
5569 if (s1 == NULL)
5570 goto finally;
5571 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005572
5573finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 if (res == NULL) {
5575 if (s0 == NULL)
5576 SOCKETCLOSE(sv[0]);
5577 if (s1 == NULL)
5578 SOCKETCLOSE(sv[1]);
5579 }
5580 Py_XDECREF(s0);
5581 Py_XDECREF(s1);
5582 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005583}
5584
5585PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005586"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005587\n\
5588Create a pair of socket objects from the sockets returned by the platform\n\
5589socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005590The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005591AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005592
5593#endif /* HAVE_SOCKETPAIR */
5594
5595
Guido van Rossum006bf911996-06-12 04:04:55 +00005596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005597socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005598{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005599 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005600
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005601 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 return NULL;
5603 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005604 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005606 "ntohs: can't convert negative Python int to C "
5607 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 return NULL;
5609 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005610 if (x > 0xffff) {
5611 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5612 "ntohs: Python int too large to convert to C "
5613 "16-bit unsigned integer (The silent truncation "
5614 "is deprecated)",
5615 1)) {
5616 return NULL;
5617 }
5618 }
5619 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005620}
5621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005622PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005623"ntohs(integer) -> integer\n\
5624\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005625Convert a 16-bit unsigned integer from network to host byte order.\n\
5626Note that in case the received integer does not fit in 16-bit unsigned\n\
5627integer, but does fit in a positive C int, it is silently truncated to\n\
562816-bit unsigned integer.\n\
5629However, this silent truncation feature is deprecated, and will raise an \n\
5630exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005631
5632
Guido van Rossum006bf911996-06-12 04:04:55 +00005633static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005634socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 if (PyLong_Check(arg)) {
5639 x = PyLong_AsUnsignedLong(arg);
5640 if (x == (unsigned long) -1 && PyErr_Occurred())
5641 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005642#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 {
5644 unsigned long y;
5645 /* only want the trailing 32 bits */
5646 y = x & 0xFFFFFFFFUL;
5647 if (y ^ x)
5648 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005649 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 x = y;
5651 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 }
5654 else
5655 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005656 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005659}
5660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005661PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005662"ntohl(integer) -> integer\n\
5663\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005664Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005665
5666
Guido van Rossum006bf911996-06-12 04:04:55 +00005667static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005668socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005669{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005670 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005671
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005672 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 return NULL;
5674 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005675 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005677 "htons: can't convert negative Python int to C "
5678 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 return NULL;
5680 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005681 if (x > 0xffff) {
5682 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5683 "htons: Python int too large to convert to C "
5684 "16-bit unsigned integer (The silent truncation "
5685 "is deprecated)",
5686 1)) {
5687 return NULL;
5688 }
5689 }
5690 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005691}
5692
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005693PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005694"htons(integer) -> integer\n\
5695\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005696Convert a 16-bit unsigned integer from host to network byte order.\n\
5697Note that in case the received integer does not fit in 16-bit unsigned\n\
5698integer, but does fit in a positive C int, it is silently truncated to\n\
569916-bit unsigned integer.\n\
5700However, this silent truncation feature is deprecated, and will raise an \n\
5701exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005702
5703
Guido van Rossum006bf911996-06-12 04:04:55 +00005704static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005705socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 if (PyLong_Check(arg)) {
5710 x = PyLong_AsUnsignedLong(arg);
5711 if (x == (unsigned long) -1 && PyErr_Occurred())
5712 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005713#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 {
5715 unsigned long y;
5716 /* only want the trailing 32 bits */
5717 y = x & 0xFFFFFFFFUL;
5718 if (y ^ x)
5719 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005720 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 x = y;
5722 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 }
5725 else
5726 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005727 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 Py_TYPE(arg)->tp_name);
5729 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005730}
5731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005732PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005733"htonl(integer) -> integer\n\
5734\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005735Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005736
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005737/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005738
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005739PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005740"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005741\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005742Convert 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 +00005743binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005744
5745static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005746socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005747{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005748#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005750#endif
5751
5752#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005753#if (SIZEOF_INT != 4)
5754#error "Not sure if in_addr_t exists and int is not 32-bits."
5755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 /* Have to use inet_addr() instead */
5757 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005758#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005759 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5762 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005763
Tim Peters1df9fdd2003-02-13 03:13:40 +00005764
5765#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005766
5767#ifdef USE_INET_ATON_WEAKLINK
5768 if (inet_aton != NULL) {
5769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 if (inet_aton(ip_addr, &buf))
5771 return PyBytes_FromStringAndSize((char *)(&buf),
5772 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005773
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005774 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 "illegal IP address string passed to inet_aton");
5776 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005777
Thomas Wouters477c8d52006-05-27 19:21:47 +00005778#ifdef USE_INET_ATON_WEAKLINK
5779 } else {
5780#endif
5781
5782#endif
5783
5784#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 /* special-case this address as inet_addr might return INADDR_NONE
5787 * for this */
5788 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005789 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005791
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005792 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005796 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 "illegal IP address string passed to inet_aton");
5798 return NULL;
5799 }
5800 }
5801 return PyBytes_FromStringAndSize((char *) &packed_addr,
5802 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005803
5804#ifdef USE_INET_ATON_WEAKLINK
5805 }
5806#endif
5807
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005808#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005809}
5810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005811PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005812"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005813\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005814Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005815
5816static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005817socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005818{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005819 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005821
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005822 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 return NULL;
5824 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005825
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005826 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005827 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005829 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 return NULL;
5831 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005832
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005833 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5834 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005835
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005836 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005838}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005839
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005840#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005841
5842PyDoc_STRVAR(inet_pton_doc,
5843"inet_pton(af, ip) -> packed IP address string\n\
5844\n\
5845Convert an IP address from string format to a packed string suitable\n\
5846for use with low-level network functions.");
5847
5848static PyObject *
5849socket_inet_pton(PyObject *self, PyObject *args)
5850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005852 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005854#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005855 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005856#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5860 return NULL;
5861 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005862
Martin v. Löwis04697e82004-06-02 12:35:29 +00005863#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005865 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 "can't use AF_INET6, IPv6 is disabled");
5867 return NULL;
5868 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005869#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 retval = inet_pton(af, ip, packed);
5872 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005873 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 return NULL;
5875 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005876 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 "illegal IP address string passed to inet_pton");
5878 return NULL;
5879 } else if (af == AF_INET) {
5880 return PyBytes_FromStringAndSize(packed,
5881 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005882#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 } else if (af == AF_INET6) {
5884 return PyBytes_FromStringAndSize(packed,
5885 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005888 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 return NULL;
5890 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005891}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005892
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005893PyDoc_STRVAR(inet_ntop_doc,
5894"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5895\n\
5896Convert a packed IP address of the given family to string format.");
5897
5898static PyObject *
5899socket_inet_ntop(PyObject *self, PyObject *args)
5900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005902 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005904#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005905 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005906#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005908#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5911 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005912
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005913 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 return NULL;
5915 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005918 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 PyErr_SetString(PyExc_ValueError,
5920 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005921 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 return NULL;
5923 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005924#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005926 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 PyErr_SetString(PyExc_ValueError,
5928 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005929 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 return NULL;
5931 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 } else {
5934 PyErr_Format(PyExc_ValueError,
5935 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005936 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 return NULL;
5938 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005939
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005940 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5941 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005943 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 return NULL;
5945 } else {
5946 return PyUnicode_FromString(retval);
5947 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005948}
5949
5950#endif /* HAVE_INET_PTON */
5951
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005952/* Python interface to getaddrinfo(host, port). */
5953
5954/*ARGSUSED*/
5955static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005956socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005957{
Victor Stinner77af1722011-05-26 14:05:59 +02005958 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005959 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 struct addrinfo hints, *res;
5961 struct addrinfo *res0 = NULL;
5962 PyObject *hobj = NULL;
5963 PyObject *pobj = (PyObject *)NULL;
5964 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005965 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 int family, socktype, protocol, flags;
5967 int error;
5968 PyObject *all = (PyObject *)NULL;
5969 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005970
Georg Brandl6083a4b2013-10-14 06:51:46 +02005971 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005973 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005974 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 &protocol, &flags)) {
5976 return NULL;
5977 }
5978 if (hobj == Py_None) {
5979 hptr = NULL;
5980 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005981 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 if (!idna)
5983 return NULL;
5984 assert(PyBytes_Check(idna));
5985 hptr = PyBytes_AS_STRING(idna);
5986 } else if (PyBytes_Check(hobj)) {
5987 hptr = PyBytes_AsString(hobj);
5988 } else {
5989 PyErr_SetString(PyExc_TypeError,
5990 "getaddrinfo() argument 1 must be string or None");
5991 return NULL;
5992 }
5993 if (PyLong_CheckExact(pobj)) {
5994 long value = PyLong_AsLong(pobj);
5995 if (value == -1 && PyErr_Occurred())
5996 goto err;
5997 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5998 pptr = pbuf;
5999 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006000 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006001 if (pptr == NULL)
6002 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006004 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 } else if (pobj == Py_None) {
6006 pptr = (char *)NULL;
6007 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006008 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 goto err;
6010 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006011#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006012 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6013 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006014 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6015 * This workaround avoids a segfault in libsystem.
6016 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006017 pptr = "00";
6018 }
6019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 memset(&hints, 0, sizeof(hints));
6021 hints.ai_family = family;
6022 hints.ai_socktype = socktype;
6023 hints.ai_protocol = protocol;
6024 hints.ai_flags = flags;
6025 Py_BEGIN_ALLOW_THREADS
6026 ACQUIRE_GETADDRINFO_LOCK
6027 error = getaddrinfo(hptr, pptr, &hints, &res0);
6028 Py_END_ALLOW_THREADS
6029 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6030 if (error) {
6031 set_gaierror(error);
6032 goto err;
6033 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006034
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006035 all = PyList_New(0);
6036 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 goto err;
6038 for (res = res0; res; res = res->ai_next) {
6039 PyObject *single;
6040 PyObject *addr =
6041 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6042 if (addr == NULL)
6043 goto err;
6044 single = Py_BuildValue("iiisO", res->ai_family,
6045 res->ai_socktype, res->ai_protocol,
6046 res->ai_canonname ? res->ai_canonname : "",
6047 addr);
6048 Py_DECREF(addr);
6049 if (single == NULL)
6050 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 if (PyList_Append(all, single))
6053 goto err;
6054 Py_XDECREF(single);
6055 }
6056 Py_XDECREF(idna);
6057 if (res0)
6058 freeaddrinfo(res0);
6059 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006060 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 Py_XDECREF(all);
6062 Py_XDECREF(idna);
6063 if (res0)
6064 freeaddrinfo(res0);
6065 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006066}
6067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006068PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006069"getaddrinfo(host, port [, family, type, proto, flags])\n\
6070 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006071\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006072Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006073
6074/* Python interface to getnameinfo(sa, flags). */
6075
6076/*ARGSUSED*/
6077static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006078socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 PyObject *sa = (PyObject *)NULL;
6081 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006082 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006083 int port;
6084 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6086 struct addrinfo hints, *res = NULL;
6087 int error;
6088 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006089 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 flags = flowinfo = scope_id = 0;
6092 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6093 return NULL;
6094 if (!PyTuple_Check(sa)) {
6095 PyErr_SetString(PyExc_TypeError,
6096 "getnameinfo() argument 1 must be a tuple");
6097 return NULL;
6098 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006099 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006101 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006103 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006104 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006105 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006106 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006107 return NULL;
6108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6110 memset(&hints, 0, sizeof(hints));
6111 hints.ai_family = AF_UNSPEC;
6112 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006113 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 Py_BEGIN_ALLOW_THREADS
6115 ACQUIRE_GETADDRINFO_LOCK
6116 error = getaddrinfo(hostp, pbuf, &hints, &res);
6117 Py_END_ALLOW_THREADS
6118 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6119 if (error) {
6120 set_gaierror(error);
6121 goto fail;
6122 }
6123 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006124 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 "sockaddr resolved to multiple addresses");
6126 goto fail;
6127 }
6128 switch (res->ai_family) {
6129 case AF_INET:
6130 {
6131 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006132 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 "IPv4 sockaddr must be 2 tuple");
6134 goto fail;
6135 }
6136 break;
6137 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006138#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 case AF_INET6:
6140 {
6141 struct sockaddr_in6 *sin6;
6142 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006143 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 sin6->sin6_scope_id = scope_id;
6145 break;
6146 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006149 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6151 if (error) {
6152 set_gaierror(error);
6153 goto fail;
6154 }
Victor Stinner72400302016-01-28 15:41:01 +01006155
6156 name = sock_decode_hostname(hbuf);
6157 if (name == NULL)
6158 goto fail;
6159 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006160
6161fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 if (res)
6163 freeaddrinfo(res);
6164 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006165}
6166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006167PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006168"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006169\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006170Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006171
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006172
6173/* Python API to getting and setting the default timeout value. */
6174
6175static PyObject *
6176socket_getdefaulttimeout(PyObject *self)
6177{
Victor Stinner71694d52015-03-28 01:18:54 +01006178 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006179 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 }
Victor Stinner71694d52015-03-28 01:18:54 +01006181 else {
6182 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6183 return PyFloat_FromDouble(seconds);
6184 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006185}
6186
6187PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006188"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006189\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006190Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006191A value of None indicates that new socket objects have no timeout.\n\
6192When the socket module is first imported, the default is None.");
6193
6194static PyObject *
6195socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6196{
Victor Stinner71694d52015-03-28 01:18:54 +01006197 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006198
Victor Stinner71694d52015-03-28 01:18:54 +01006199 if (socket_parse_timeout(&timeout, arg) < 0)
6200 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006203
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006204 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006205}
6206
6207PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006208"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006209\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006210Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006211A value of None indicates that new socket objects have no timeout.\n\
6212When the socket module is first imported, the default is None.");
6213
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006214#ifdef HAVE_IF_NAMEINDEX
6215/* Python API for getting interface indices and names */
6216
6217static PyObject *
6218socket_if_nameindex(PyObject *self, PyObject *arg)
6219{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006220 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006221 int i;
6222 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006223
Charles-François Natali60713592011-05-20 16:55:06 +02006224 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006225 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006226 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006227 return NULL;
6228 }
6229
6230 list = PyList_New(0);
6231 if (list == NULL) {
6232 if_freenameindex(ni);
6233 return NULL;
6234 }
6235
Charles-François Natali60713592011-05-20 16:55:06 +02006236 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6237 PyObject *ni_tuple = Py_BuildValue("IO&",
6238 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006239
6240 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6241 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006242 Py_DECREF(list);
6243 if_freenameindex(ni);
6244 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006245 }
6246 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006247 }
6248
6249 if_freenameindex(ni);
6250 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006251}
6252
6253PyDoc_STRVAR(if_nameindex_doc,
6254"if_nameindex()\n\
6255\n\
6256Returns a list of network interface information (index, name) tuples.");
6257
Charles-François Natali60713592011-05-20 16:55:06 +02006258static PyObject *
6259socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006260{
Charles-François Natali60713592011-05-20 16:55:06 +02006261 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006262 unsigned long index;
6263
Charles-François Natali60713592011-05-20 16:55:06 +02006264 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6265 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006266 return NULL;
6267
Charles-François Natali60713592011-05-20 16:55:06 +02006268 index = if_nametoindex(PyBytes_AS_STRING(oname));
6269 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006270 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006271 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006272 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006273 return NULL;
6274 }
6275
6276 return PyLong_FromUnsignedLong(index);
6277}
6278
6279PyDoc_STRVAR(if_nametoindex_doc,
6280"if_nametoindex(if_name)\n\
6281\n\
6282Returns the interface index corresponding to the interface name if_name.");
6283
Charles-François Natali60713592011-05-20 16:55:06 +02006284static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006285socket_if_indextoname(PyObject *self, PyObject *arg)
6286{
Charles-François Natali60713592011-05-20 16:55:06 +02006287 unsigned long index;
6288 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006289
Charles-François Natali60713592011-05-20 16:55:06 +02006290 index = PyLong_AsUnsignedLong(arg);
6291 if (index == (unsigned long) -1)
6292 return NULL;
6293
6294 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006295 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006296 return NULL;
6297 }
6298
Charles-François Natali60713592011-05-20 16:55:06 +02006299 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006300}
6301
6302PyDoc_STRVAR(if_indextoname_doc,
6303"if_indextoname(if_index)\n\
6304\n\
6305Returns the interface name corresponding to the interface index if_index.");
6306
6307#endif /* HAVE_IF_NAMEINDEX */
6308
6309
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006310#ifdef CMSG_LEN
6311/* Python interface to CMSG_LEN(length). */
6312
6313static PyObject *
6314socket_CMSG_LEN(PyObject *self, PyObject *args)
6315{
6316 Py_ssize_t length;
6317 size_t result;
6318
6319 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6320 return NULL;
6321 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6322 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6323 return NULL;
6324 }
6325 return PyLong_FromSize_t(result);
6326}
6327
6328PyDoc_STRVAR(CMSG_LEN_doc,
6329"CMSG_LEN(length) -> control message length\n\
6330\n\
6331Return the total length, without trailing padding, of an ancillary\n\
6332data item with associated data of the given length. This value can\n\
6333often be used as the buffer size for recvmsg() to receive a single\n\
6334item of ancillary data, but RFC 3542 requires portable applications to\n\
6335use CMSG_SPACE() and thus include space for padding, even when the\n\
6336item will be the last in the buffer. Raises OverflowError if length\n\
6337is outside the permissible range of values.");
6338
6339
6340#ifdef CMSG_SPACE
6341/* Python interface to CMSG_SPACE(length). */
6342
6343static PyObject *
6344socket_CMSG_SPACE(PyObject *self, PyObject *args)
6345{
6346 Py_ssize_t length;
6347 size_t result;
6348
6349 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6350 return NULL;
6351 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6352 PyErr_SetString(PyExc_OverflowError,
6353 "CMSG_SPACE() argument out of range");
6354 return NULL;
6355 }
6356 return PyLong_FromSize_t(result);
6357}
6358
6359PyDoc_STRVAR(CMSG_SPACE_doc,
6360"CMSG_SPACE(length) -> buffer size\n\
6361\n\
6362Return the buffer size needed for recvmsg() to receive an ancillary\n\
6363data item with associated data of the given length, along with any\n\
6364trailing padding. The buffer space needed to receive multiple items\n\
6365is the sum of the CMSG_SPACE() values for their associated data\n\
6366lengths. Raises OverflowError if length is outside the permissible\n\
6367range of values.");
6368#endif /* CMSG_SPACE */
6369#endif /* CMSG_LEN */
6370
6371
Guido van Rossum30a685f1991-06-27 15:51:29 +00006372/* List of functions exported by this module. */
6373
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006374static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 {"gethostbyname", socket_gethostbyname,
6376 METH_VARARGS, gethostbyname_doc},
6377 {"gethostbyname_ex", socket_gethostbyname_ex,
6378 METH_VARARGS, ghbn_ex_doc},
6379 {"gethostbyaddr", socket_gethostbyaddr,
6380 METH_VARARGS, gethostbyaddr_doc},
6381 {"gethostname", socket_gethostname,
6382 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006383#ifdef HAVE_SETHOSTNAME
6384 {"sethostname", socket_sethostname,
6385 METH_VARARGS, sethostname_doc},
6386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 {"getservbyname", socket_getservbyname,
6388 METH_VARARGS, getservbyname_doc},
6389 {"getservbyport", socket_getservbyport,
6390 METH_VARARGS, getservbyport_doc},
6391 {"getprotobyname", socket_getprotobyname,
6392 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006393#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 {"dup", socket_dup,
6395 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006396#endif
Dave Cole331708b2004-08-09 04:51:41 +00006397#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 {"socketpair", socket_socketpair,
6399 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 {"ntohs", socket_ntohs,
6402 METH_VARARGS, ntohs_doc},
6403 {"ntohl", socket_ntohl,
6404 METH_O, ntohl_doc},
6405 {"htons", socket_htons,
6406 METH_VARARGS, htons_doc},
6407 {"htonl", socket_htonl,
6408 METH_O, htonl_doc},
6409 {"inet_aton", socket_inet_aton,
6410 METH_VARARGS, inet_aton_doc},
6411 {"inet_ntoa", socket_inet_ntoa,
6412 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006413#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 {"inet_pton", socket_inet_pton,
6415 METH_VARARGS, inet_pton_doc},
6416 {"inet_ntop", socket_inet_ntop,
6417 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006418#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006419 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6420 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 {"getnameinfo", socket_getnameinfo,
6422 METH_VARARGS, getnameinfo_doc},
6423 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6424 METH_NOARGS, getdefaulttimeout_doc},
6425 {"setdefaulttimeout", socket_setdefaulttimeout,
6426 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006427#ifdef HAVE_IF_NAMEINDEX
6428 {"if_nameindex", socket_if_nameindex,
6429 METH_NOARGS, if_nameindex_doc},
6430 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006431 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006432 {"if_indextoname", socket_if_indextoname,
6433 METH_O, if_indextoname_doc},
6434#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006435#ifdef CMSG_LEN
6436 {"CMSG_LEN", socket_CMSG_LEN,
6437 METH_VARARGS, CMSG_LEN_doc},
6438#ifdef CMSG_SPACE
6439 {"CMSG_SPACE", socket_CMSG_SPACE,
6440 METH_VARARGS, CMSG_SPACE_doc},
6441#endif
6442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006444};
6445
Guido van Rossum30a685f1991-06-27 15:51:29 +00006446
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006447#ifdef MS_WINDOWS
6448#define OS_INIT_DEFINED
6449
6450/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006451
6452static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006453os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006456}
6457
6458static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006459os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 WSADATA WSAData;
6462 int ret;
6463 ret = WSAStartup(0x0101, &WSAData);
6464 switch (ret) {
6465 case 0: /* No error */
6466 Py_AtExit(os_cleanup);
6467 return 1; /* Success */
6468 case WSASYSNOTREADY:
6469 PyErr_SetString(PyExc_ImportError,
6470 "WSAStartup failed: network not ready");
6471 break;
6472 case WSAVERNOTSUPPORTED:
6473 case WSAEINVAL:
6474 PyErr_SetString(
6475 PyExc_ImportError,
6476 "WSAStartup failed: requested version not supported");
6477 break;
6478 default:
6479 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6480 break;
6481 }
6482 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006483}
6484
Guido van Rossum8d665e61996-06-26 18:22:49 +00006485#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006486
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006487
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006488
6489#ifndef OS_INIT_DEFINED
6490static int
6491os_init(void)
6492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006494}
6495#endif
6496
6497
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006498/* C API table - always add new things to the end for binary
6499 compatibility. */
6500static
6501PySocketModule_APIObject PySocketModuleAPI =
6502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006504 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006506};
6507
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006508
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006509/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006511 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006512 "socket.py" which implements some additional functionality.
6513 The import of "_socket" may fail with an ImportError exception if
6514 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006515 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006516 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006517*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006519PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006520"Implementation module for socket operations.\n\
6521\n\
6522See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006523
Martin v. Löwis1a214512008-06-11 05:26:20 +00006524static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 PyModuleDef_HEAD_INIT,
6526 PySocket_MODULE_NAME,
6527 socket_doc,
6528 -1,
6529 socket_methods,
6530 NULL,
6531 NULL,
6532 NULL,
6533 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006534};
6535
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006536PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006537PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 if (!os_init())
6542 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006543
Victor Stinnerdaf45552013-08-28 00:53:59 +02006544#ifdef MS_WINDOWS
6545 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006546#if defined(_MSC_VER) && _MSC_VER >= 1800
6547 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6548#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006549 DWORD version = GetVersion();
6550 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6551 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6552 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006553 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6554#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006555 }
6556#endif
6557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 Py_TYPE(&sock_type) = &PyType_Type;
6559 m = PyModule_Create(&socketmodule);
6560 if (m == NULL)
6561 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006562
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006563 Py_INCREF(PyExc_OSError);
6564 PySocketModuleAPI.error = PyExc_OSError;
6565 Py_INCREF(PyExc_OSError);
6566 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006568 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 if (socket_herror == NULL)
6570 return NULL;
6571 Py_INCREF(socket_herror);
6572 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006573 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 NULL);
6575 if (socket_gaierror == NULL)
6576 return NULL;
6577 Py_INCREF(socket_gaierror);
6578 PyModule_AddObject(m, "gaierror", socket_gaierror);
6579 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006580 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 if (socket_timeout == NULL)
6582 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006583 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 Py_INCREF(socket_timeout);
6585 PyModule_AddObject(m, "timeout", socket_timeout);
6586 Py_INCREF((PyObject *)&sock_type);
6587 if (PyModule_AddObject(m, "SocketType",
6588 (PyObject *)&sock_type) != 0)
6589 return NULL;
6590 Py_INCREF((PyObject *)&sock_type);
6591 if (PyModule_AddObject(m, "socket",
6592 (PyObject *)&sock_type) != 0)
6593 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006594
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006595#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006597#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 Py_INCREF(has_ipv6);
6601 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 /* Export C API */
6604 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6605 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6606 ) != 0)
6607 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006610#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006612#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006614#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006616#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006617#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006620#endif
6621#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006623#endif
6624#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006627#endif
6628#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#endif
6632#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006635#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006636#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006639#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006643#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006644#ifdef HAVE_SOCKADDR_ALG
6645 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6646#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006647#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006650#endif
6651#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006653#endif
6654#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006657#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006658#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006661#endif
6662#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006665#endif
6666#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006669#endif
6670#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006673#endif
6674#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, AF_NETLINK);
6677 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006678#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006680#endif
6681#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006683#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6685 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006686#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006688#endif
6689#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006691#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006692#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006694#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006695#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006697#endif
6698#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006700#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006702#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006704#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006705#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006707#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006708#ifdef NETLINK_CRYPTO
6709 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6710#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006711#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006712
6713#ifdef AF_VSOCK
6714 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6715 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6716 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6717 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6718 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6719 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6720 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6721 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6722 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6723#endif
6724
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006725#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006726 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006728#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006729#ifdef AF_LINK
6730 PyModule_AddIntMacro(m, AF_LINK);
6731#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006732#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006735#endif
6736#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006737 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006738 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006739#endif
6740#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006743#endif
6744#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006747#endif
6748#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006751#endif
6752#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006755#endif
6756#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006759#endif
6760#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006763#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006764
Hye-Shik Chang81268602004-02-02 06:05:24 +00006765#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6767 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6768 PyModule_AddIntMacro(m, BTPROTO_HCI);
6769 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006770#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006772#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006773#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006774#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006776#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6778 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006779#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6782 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006783#endif
6784
Charles-François Natali47413c12011-10-06 19:47:44 +02006785#ifdef AF_CAN
6786 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006788#endif
6789#ifdef PF_CAN
6790 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006792#endif
6793
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006794/* Reliable Datagram Sockets */
6795#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006797#endif
6798#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006800#endif
6801
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006802/* Kernel event messages */
6803#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006805#endif
6806#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006808#endif
6809
Antoine Pitroub156a462010-10-27 20:13:57 +00006810#ifdef AF_PACKET
6811 PyModule_AddIntMacro(m, AF_PACKET);
6812#endif
6813#ifdef PF_PACKET
6814 PyModule_AddIntMacro(m, PF_PACKET);
6815#endif
6816#ifdef PACKET_HOST
6817 PyModule_AddIntMacro(m, PACKET_HOST);
6818#endif
6819#ifdef PACKET_BROADCAST
6820 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6821#endif
6822#ifdef PACKET_MULTICAST
6823 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6824#endif
6825#ifdef PACKET_OTHERHOST
6826 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6827#endif
6828#ifdef PACKET_OUTGOING
6829 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6830#endif
6831#ifdef PACKET_LOOPBACK
6832 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6833#endif
6834#ifdef PACKET_FASTROUTE
6835 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006836#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006837
Christian Heimes043d6f62008-01-07 17:19:16 +00006838#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6843 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6844 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006845
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6847 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6848 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, SOL_TIPC);
6852 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6853 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6854 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6855 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006856
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6858 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6859 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6860 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6864 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006865#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006868#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6870 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6871 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6872 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6873 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6874 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006875#endif
6876
Christian Heimesdffa3942016-09-05 23:54:41 +02006877#ifdef HAVE_SOCKADDR_ALG
6878 /* Socket options */
6879 PyModule_AddIntMacro(m, ALG_SET_KEY);
6880 PyModule_AddIntMacro(m, ALG_SET_IV);
6881 PyModule_AddIntMacro(m, ALG_SET_OP);
6882 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6883 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6884 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6885
6886 /* Operations */
6887 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6888 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6889 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6890 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6891#endif
6892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, SOCK_STREAM);
6895 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006896/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006897#ifdef SOCK_RAW
6898 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006900#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006902#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006904#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006905#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006907#endif
6908#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006910#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006918#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006920#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006921#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006923#endif
6924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006942#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006943#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006946#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006974#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006975#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006977#endif
6978#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#endif
6981#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006983#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006984#ifdef SO_PASSSEC
6985 PyModule_AddIntMacro(m, SO_PASSSEC);
6986#endif
6987#ifdef SO_PEERSEC
6988 PyModule_AddIntMacro(m, SO_PEERSEC);
6989#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006990#ifdef SO_BINDTODEVICE
6991 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6992#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006993#ifdef SO_PRIORITY
6994 PyModule_AddIntMacro(m, SO_PRIORITY);
6995#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006996#ifdef SO_MARK
6997 PyModule_AddIntMacro(m, SO_MARK);
6998#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006999#ifdef SO_DOMAIN
7000 PyModule_AddIntMacro(m, SO_DOMAIN);
7001#endif
7002#ifdef SO_PROTOCOL
7003 PyModule_AddIntMacro(m, SO_PROTOCOL);
7004#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007006 /* Maximum number of connections for "listen" */
7007#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007009#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007011#endif
7012
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007013 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007014#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007016#endif
7017#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007019#endif
7020#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007022#endif
7023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024 /* Flags for send, recv */
7025#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007054#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007055#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007057#endif
7058#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007060#endif
7061#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007063#endif
7064#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007066#endif
7067#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007069#endif
7070#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007072#endif
7073#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007075#endif
7076#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007078#endif
7079#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007081#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007082#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007084#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086 /* Protocol level and numbers, usable for [gs]etsockopt */
7087#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007092#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007093 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007112#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007119#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007120#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007122#endif
7123#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7125 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007126#endif
7127#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7129 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7130 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007131
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7133 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7134 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007135#ifdef CAN_ISOTP
7136 PyModule_AddIntMacro(m, CAN_ISOTP);
7137#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007138#endif
7139#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7141 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7142 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7143 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007144#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007145#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7146 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7147#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007148#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007150 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7151 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7152 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7153 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7154 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7155 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7156 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7157 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7158 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7159 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7160 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7161 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7162#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007163#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007165#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007166#ifdef HAVE_SOCKADDR_ALG
7167 PyModule_AddIntMacro(m, SOL_ALG);
7168#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007169#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007171#endif
7172#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007174#endif
7175#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007177#endif
7178#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007180#endif
7181#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007183#endif
7184#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007189#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007190 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007197#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007217#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007228#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007243#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007274 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007287#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007288#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007293#endif
7294/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007297#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007298 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007302#endif
7303
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007304#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007306#endif
7307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308 /* Some port configuration */
7309#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007311#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007318#endif
7319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320 /* Some reserved IP v.4 addresses */
7321#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007333#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007338#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341#ifdef INADDR_ALLHOSTS_GROUP
7342 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7343 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007344#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007354#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007356#endif
7357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007358 /* IPv4 [gs]etsockopt options */
7359#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007401#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007406#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007407#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007409#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007411 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7412#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007430 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007431#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007437#endif
7438#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#endif
7441#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007443#endif
7444#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007446#endif
7447#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007449#endif
7450#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007452#endif
7453#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007455#endif
7456#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007458#endif
7459#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007461#endif
7462#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007464#endif
7465#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007467#endif
7468#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007470#endif
7471#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007473#endif
7474#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007476#endif
7477#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007479#endif
7480#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007482#endif
7483#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007485#endif
7486#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007488#endif
7489#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007491#endif
7492#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007494#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496 /* TCP options */
7497#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007532#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007533#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007535#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007536#ifdef TCP_CONGESTION
7537 PyModule_AddIntMacro(m, TCP_CONGESTION);
7538#endif
7539#ifdef TCP_USER_TIMEOUT
7540 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7541#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007542#ifdef TCP_NOTSENT_LOWAT
7543 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7544#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007546 /* IPX options */
7547#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007549#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007550
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007551/* Reliable Datagram Sockets */
7552#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007554#endif
7555#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007557#endif
7558#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007560#endif
7561#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007563#endif
7564#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007566#endif
7567#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007569#endif
7570#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007572#endif
7573#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007575#endif
7576#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007578#endif
7579#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007581#endif
7582#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007584#endif
7585#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007587#endif
7588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007592#endif
7593#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007595#endif
7596#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007598#endif
7599#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007613#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007614#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007616#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
7620#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#endif
7623#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007625#endif
7626#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007628#endif
7629#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007634#endif
7635#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007637#endif
7638#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007640#endif
7641#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007643#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007644#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007646#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007647#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007649#endif
7650#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007652#endif
7653#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007655#endif
7656#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007658#endif
7659#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007661#endif
7662#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007664#endif
7665#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007667#endif
7668#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007670#endif
7671#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007673#endif
7674#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007676#endif
7677#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007679#endif
7680#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007682#endif
7683#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007685#endif
7686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007687 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007688#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007690#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007692#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007693 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007694#endif
7695#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007696 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007697#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007699#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007701#endif
7702#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007704#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007708#endif
7709
Christian Heimesfaf2f632008-01-06 16:59:19 +00007710#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007712 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7713#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007714 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007715#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007716 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007717 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7718#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007719 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007720#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007721 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007722 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007723 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724 PyObject *tmp;
7725 tmp = PyLong_FromUnsignedLong(codes[i]);
7726 if (tmp == NULL)
7727 return NULL;
7728 PyModule_AddObject(m, names[i], tmp);
7729 }
7730 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007731 PyModule_AddIntMacro(m, RCVALL_OFF);
7732 PyModule_AddIntMacro(m, RCVALL_ON);
7733 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007734#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007736#endif
7737#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007739#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007740#endif /* _MSTCPIP_ */
7741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007742 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007743#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007747}