blob: 661e1bdf578401432b8c7f3e4fa650fc9a44354a [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
Miss Islington (bot)01b96642018-12-30 17:59:19 -0800103#ifdef _Py_MEMORY_SANITIZER
104# include <sanitizer/msan_interface.h>
105#endif
106
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000107/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000108PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100109"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
110socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000111\n\
112Open a socket of the given type. The family argument specifies the\n\
113address family; it defaults to AF_INET. The type argument specifies\n\
114whether this is a stream (SOCK_STREAM, this is the default)\n\
115or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
116specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200117The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100119When a fileno is passed in, family, type and proto are auto-detected,\n\
120unless they are explicitly set.\n\
121\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000122A socket object represents one endpoint of a network connection.\n\
123\n\
124Methods of socket objects (keyword arguments not allowed):\n\
125\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000126_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000127bind(addr) -- bind the socket to a local address\n\
128close() -- close the socket\n\
129connect(addr) -- connect the socket to a remote address\n\
130connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200131dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000132fileno() -- return underlying file descriptor\n\
133getpeername() -- return remote address [*]\n\
134getsockname() -- return local address\n\
135getsockopt(level, optname[, buflen]) -- get socket options\n\
136gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100137listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000138recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000139recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000140recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000141recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000142 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000143sendall(data[, flags]) -- send all data\n\
144send(data[, flags]) -- send data, may not send all of it\n\
145sendto(data[, flags], addr) -- send data to a given address\n\
146setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500147getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200148setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000149settimeout(None | float) -- set or clear the timeout\n\
150shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700151if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700152if_nametoindex(name) -- return the corresponding interface index\n\
153if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000155 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000156
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000157/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000158 I hope some day someone can clean this up please... */
159
Guido van Rossum9376b741999-09-15 22:01:40 +0000160/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
161 script doesn't get this right, so we hardcode some platform checks below.
162 On the other hand, not all Linux versions agree, so there the settings
163 computed by the configure script are needed! */
164
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700165#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# undef HAVE_GETHOSTBYNAME_R_3_ARG
167# undef HAVE_GETHOSTBYNAME_R_5_ARG
168# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000169#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000170
Victor Stinner710d27e2011-08-23 10:57:32 +0200171#if defined(__OpenBSD__)
172# include <sys/uio.h>
173#endif
174
Stefan Krah1f9eb872016-05-22 17:35:34 +0200175#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000177#endif
178
Guido van Rossume7de2061999-03-24 17:24:33 +0000179#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000180# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define HAVE_GETHOSTBYNAME_R_3_ARG
182# elif defined(__sun) || defined(__sgi)
183# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700184# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000185/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000186# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
187# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# else
189# undef HAVE_GETHOSTBYNAME_R
190# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000191#endif
192
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200193#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000194# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000195#endif
196
Ned Deilye1d4e582016-02-23 22:05:29 +1100197/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000198#ifdef HAVE_SYS_PARAM_H
199#include <sys/param.h>
200#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000201/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100202 (this includes the getaddrinfo emulation) protect access with a lock.
203
204 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
205 a mix of code including an unsafe implementation from an old BSD's
206 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
207 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100208 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100209
Ned Deilye1d4e582016-02-23 22:05:29 +1100210 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
211 http://www.openbsd.org/plus54.html
212
213 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
214
215http://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 +1100216 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200217#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100218 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000219 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100220 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
221 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100222 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000223#define USE_GETADDRINFO_LOCK
224#endif
225
226#ifdef USE_GETADDRINFO_LOCK
227#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
228#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
229#else
230#define ACQUIRE_GETADDRINFO_LOCK
231#define RELEASE_GETADDRINFO_LOCK
232#endif
233
234#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000235# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000236#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000237
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000238
Serhiy Storchakad3187152017-11-09 18:00:38 +0200239#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100240# include <sys/ioctl.h>
241#endif
242
243
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000245/* make sure that the reentrant (gethostbyaddr_r etc)
246 functions are declared correctly if compiling with
247 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248
Thomas Wouters477c8d52006-05-27 19:21:47 +0000249/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000251#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000252#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _XOPEN_SOURCE
255#include <sys/socket.h>
256#include <sys/types.h>
257#include <netinet/in.h>
258#ifdef _SS_ALIGNSIZE
259#define HAVE_GETADDRINFO 1
260#define HAVE_GETNAMEINFO 1
261#endif
262
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000263#define HAVE_INET_PTON
264#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000265#endif
266
Benjamin Peterson06930632017-09-04 16:36:05 -0700267/* Solaris fails to define this variable at all. */
268#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000269#define INET_ADDRSTRLEN 16
270#endif
271
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000274#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700277#ifdef HAVE_SYS_SOCKET_H
278#include <sys/socket.h>
279#endif
280
281#ifdef HAVE_NET_IF_H
282#include <net/if.h>
283#endif
284
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000285/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000287#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
289/* Addressing includes */
290
Guido van Rossum6f489d91996-06-28 20:15:15 +0000291#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
293/* Non-MS WINDOWS includes */
294# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000295# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000296
Guido van Rossum9376b741999-09-15 22:01:40 +0000297/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000302#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000303
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000305# ifdef HAVE_FCNTL_H
306# include <fcntl.h>
307# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308
Steve Dower65e4cb12014-11-22 12:54:57 -0800309/* Provides the IsWindows7SP1OrGreater() function */
Miss Islington (bot)bf8e9d12018-08-16 03:29:20 -0400310#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800311
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -0800312/* remove some flags on older version Windows during run-time.
313 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
314typedef struct {
315 DWORD build_number; /* available starting with this Win10 BuildNumber */
316 const char flag_name[20];
317} FlagRuntimeInfo;
318
319/* IMPORTANT: make sure the list ordered by descending build_number */
320static FlagRuntimeInfo win_runtime_flags[] = {
321 /* available starting with Windows 10 1709 */
322 {16299, "TCP_KEEPIDLE"},
323 {16299, "TCP_KEEPINTVL"},
324 /* available starting with Windows 10 1703 */
325 {15063, "TCP_KEEPCNT"},
326 /* available starting with Windows 10 1607 */
327 {14393, "TCP_FASTOPEN"}
328};
329
330static void
331remove_unusable_flags(PyObject *m)
332{
333 PyObject *dict;
334 OSVERSIONINFOEX info;
335 DWORDLONG dwlConditionMask;
336
337 dict = PyModule_GetDict(m);
338 if (dict == NULL) {
339 return;
340 }
341
342 /* set to Windows 10, except BuildNumber. */
343 memset(&info, 0, sizeof(info));
344 info.dwOSVersionInfoSize = sizeof(info);
345 info.dwMajorVersion = 10;
346 info.dwMinorVersion = 0;
347
348 /* set Condition Mask */
349 dwlConditionMask = 0;
350 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
351 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
352 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
353
354 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
355 info.dwBuildNumber = win_runtime_flags[i].build_number;
356 /* greater than or equal to the specified version?
357 Compatibility Mode will not cheat VerifyVersionInfo(...) */
358 if (VerifyVersionInfo(
359 &info,
360 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
361 dwlConditionMask)) {
362 break;
363 }
364 else {
365 if (PyDict_GetItemString(
366 dict,
Miss Islington (bot)62674f32018-12-10 23:05:13 -0800367 win_runtime_flags[i].flag_name) != NULL)
368 {
369 if (PyDict_DelItemString(
370 dict,
371 win_runtime_flags[i].flag_name))
372 {
373 PyErr_Clear();
374 }
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -0800375 }
376 }
377 }
378}
379
Jeremy Hylton22308652001-02-02 03:23:09 +0000380#endif
381
Skip Montanaro7befb992004-02-10 16:50:21 +0000382#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000383
Neal Norwitz39d22e52002-11-02 19:55:21 +0000384#ifndef O_NONBLOCK
385# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000386#endif
387
Trent Micka708d6e2004-09-07 17:48:26 +0000388/* include Python's addrinfo.h unless it causes trouble */
389#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
390 /* Do not include addinfo.h on some newer IRIX versions.
391 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
392 * for example, but not by 6.5.10.
393 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000395 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
396 * EAI_* constants are defined in (the already included) ws2tcpip.h.
397 */
398#else
399# include "addrinfo.h"
400#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000401
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000402#ifdef __APPLE__
403/* On OS X, getaddrinfo returns no error indication of lookup
404 failure, so we must use the emulation instead of the libinfo
405 implementation. Unfortunately, performing an autoconf test
406 for this bug would require DNS access for the machine performing
407 the configuration, which is not acceptable. Therefore, we
408 determine the bug just by checking for __APPLE__. If this bug
409 gets ever fixed, perhaps checking for sys/version.h would be
410 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000411#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600412/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000413 Find to check for Jaguar is that it has getnameinfo(), which
414 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000415#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000416#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000417
418#ifdef HAVE_INET_ATON
419#define USE_INET_ATON_WEAKLINK
420#endif
421
Jack Jansen84262fb2002-07-02 14:40:42 +0000422#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000423
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000424/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000425#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000426/* avoid clashes with the C library definition of the symbol. */
427#define getaddrinfo fake_getaddrinfo
428#define gai_strerror fake_gai_strerror
429#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000430#include "getaddrinfo.c"
431#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000432#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000433#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000434#include "getnameinfo.c"
435#endif
436
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000437#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000438#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000439#endif
440
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000442#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000443#define EAFNOSUPPORT WSAEAFNOSUPPORT
444#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000445#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000446
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000447#ifndef SOCKETCLOSE
448#define SOCKETCLOSE close
449#endif
450
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000451#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000452#define USE_BLUETOOTH 1
453#if defined(__FreeBSD__)
454#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
455#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000456#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000457#define SOL_HCI SOL_HCI_RAW
458#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000459#define sockaddr_l2 sockaddr_l2cap
460#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000462#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
463#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000464#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000465#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466#define sockaddr_l2 sockaddr_bt
467#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000468#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000469#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000470#define SOL_HCI BTPROTO_HCI
471#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000472#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
473#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000474#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000475#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000476#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000477#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
478#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000479#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000480#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
481#endif
482#endif
483
Charles-François Natali8b759652011-12-23 16:44:51 +0100484/* Convert "sock_addr_t *" to "struct sockaddr *". */
485#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000486
Martin v. Löwise9416172003-05-03 10:12:45 +0000487/*
488 * Constants for getnameinfo()
489 */
490#if !defined(NI_MAXHOST)
491#define NI_MAXHOST 1025
492#endif
493#if !defined(NI_MAXSERV)
494#define NI_MAXSERV 32
495#endif
496
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000497#ifndef INVALID_SOCKET /* MS defines this */
498#define INVALID_SOCKET (-1)
499#endif
500
Charles-François Natali0cc86852013-09-13 19:53:08 +0200501#ifndef INADDR_NONE
502#define INADDR_NONE (-1)
503#endif
504
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000505/* XXX There's a problem here: *static* functions are not supposed to have
506 a Py prefix (or use CapitalizedWords). Later... */
507
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508/* Global variable holding the exception type for errors detected
509 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000510static PyObject *socket_herror;
511static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000512static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513
Tim Peters643a7fc2002-02-17 04:13:21 +0000514/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000515 The sock_type variable contains pointers to various functions,
516 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000517 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000518static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000519
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000520#if defined(HAVE_POLL_H)
521#include <poll.h>
522#elif defined(HAVE_SYS_POLL_H)
523#include <sys/poll.h>
524#endif
525
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000526/* Largest value to try to store in a socklen_t (used when handling
527 ancillary data). POSIX requires socklen_t to hold at least
528 (2**31)-1 and recommends against storing larger values, but
529 socklen_t was originally int in the BSD interface, so to be on the
530 safe side we use the smaller of (2**31)-1 and INT_MAX. */
531#if INT_MAX > 0x7fffffff
532#define SOCKLEN_T_LIMIT 0x7fffffff
533#else
534#define SOCKLEN_T_LIMIT INT_MAX
535#endif
536
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200537#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000538/* Instead of select(), we'll use poll() since poll() works on any fd. */
539#define IS_SELECTABLE(s) 1
540/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000541#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200542/* If there's no timeout left, we don't have to call select, so it's a safe,
543 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100544#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000545#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000546
547static PyObject*
548select_error(void)
549{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200550 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000552}
553
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000554#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000555#ifndef WSAEAGAIN
556#define WSAEAGAIN WSAEWOULDBLOCK
557#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000558#define CHECK_ERRNO(expected) \
559 (WSAGetLastError() == WSA ## expected)
560#else
561#define CHECK_ERRNO(expected) \
562 (errno == expected)
563#endif
564
Victor Stinnerdaf45552013-08-28 00:53:59 +0200565#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200566# define GET_SOCK_ERROR WSAGetLastError()
567# define SET_SOCK_ERROR(err) WSASetLastError(err)
568# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
569# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
570#else
571# define GET_SOCK_ERROR errno
572# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
573# define SOCK_TIMEOUT_ERR EWOULDBLOCK
574# define SOCK_INPROGRESS_ERR EINPROGRESS
575#endif
576
Miss Islington (bot)5b17d7f2018-09-04 23:45:03 -0700577#ifdef _MSC_VER
578# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
579#else
580# define SUPPRESS_DEPRECATED_CALL
581#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200582
583#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200584/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
585static int support_wsa_no_inherit = -1;
586#endif
587
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588/* Convenience function to raise an error according to errno
589 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590
Guido van Rossum73624e91994-10-10 17:59:00 +0000591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000592set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000594#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 int err_no = WSAGetLastError();
596 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
597 recognizes the error codes used by both GetLastError() and
598 WSAGetLastError */
599 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200600 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000601#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000602
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200603 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604}
605
Guido van Rossum30a685f1991-06-27 15:51:29 +0000606
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000607static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000608set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611
612#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 if (v != NULL) {
618 PyErr_SetObject(socket_herror, v);
619 Py_DECREF(v);
620 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000623}
624
625
626static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000627set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630
Martin v. Löwis272cb402002-03-01 08:31:07 +0000631#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* EAI_SYSTEM is not available on Windows XP. */
633 if (error == EAI_SYSTEM)
634 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000635#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000636
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000637#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000639#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 if (v != NULL) {
643 PyErr_SetObject(socket_gaierror, v);
644 Py_DECREF(v);
645 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648}
649
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000650/* Function to perform the setting of socket blocking mode
651 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652static int
653internal_setblocking(PySocketSockObject *s, int block)
654{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400655 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200656#ifdef MS_WINDOWS
657 u_long arg;
658#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100659#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100660 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100661 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000662#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100666#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200668 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400669 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100670#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200672 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400673 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100675 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 else
Victor Stinner9a954832013-12-04 00:41:24 +0100677 new_delay_flag = delay_flag | O_NONBLOCK;
678 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200679 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400680 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100681#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200683 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200684 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400685 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400687
688 result = 0;
689
690 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692
Yury Selivanovfa22b292016-10-18 16:03:52 -0400693 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200694#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400695 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200696#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400697 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200698#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400699 }
700
701 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702}
703
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000704static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200705internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
706 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100709#ifdef HAVE_POLL
710 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200711 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100712#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200713 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200714 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100715#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000716
Victor Stinnerb7df3142015-03-27 22:59:32 +0100717 /* must be called with the GIL held */
718 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100719
Victor Stinner416f2e62015-03-31 13:56:29 +0200720 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200724 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 /* Prefer poll, if available, since you can poll() any fd
728 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000729#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100730 pollfd.fd = s->sock_fd;
731 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 if (connect) {
733 /* On Windows, the socket becomes writable on connection success,
734 but a connection failure is notified as an error. On POSIX, the
735 socket becomes writable on connection success or on connection
736 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200737 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200738 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739
Victor Stinner71694d52015-03-28 01:18:54 +0100740 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200741 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200742 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000743
Victor Stinner71694d52015-03-28 01:18:54 +0100744 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200745 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100746 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000747#else
Victor Stinnerced11742015-04-09 10:27:25 +0200748 if (interval >= 0) {
749 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
750 tvp = &tv;
751 }
752 else
753 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000754
Victor Stinner71694d52015-03-28 01:18:54 +0100755 FD_ZERO(&fds);
756 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200757 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 if (connect) {
759 /* On Windows, the socket becomes writable on connection success,
760 but a connection failure is notified as an error. On POSIX, the
761 socket becomes writable on connection success or on connection
762 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200763 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200764 }
Victor Stinner71694d52015-03-28 01:18:54 +0100765
766 /* See if the socket is ready */
767 Py_BEGIN_ALLOW_THREADS;
768 if (writing)
769 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200770 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100771 else
772 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200773 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100774 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000775#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 if (n < 0)
778 return -1;
779 if (n == 0)
780 return 1;
781 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000782}
783
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000785
Victor Stinner81c41db2015-04-02 11:50:57 +0200786 On error, raise an exception and return -1 if err is set, or fill err and
787 return -1 otherwise. If a signal was received and the signal handler raised
788 an exception, return -1, and set err to -1 if err is set.
789
790 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100791
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792 If the socket has a timeout, wait until the socket is ready before calling
793 the function: wait until the socket is writable if writing is nonzero, wait
794 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100795
Victor Stinner81c41db2015-04-02 11:50:57 +0200796 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200797 the function, except if the signal handler raised an exception (PEP 475).
798
799 When the function is retried, recompute the timeout using a monotonic clock.
800
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 sock_call_ex() must be called with the GIL held. The socket function is
802 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200804sock_call_ex(PySocketSockObject *s,
805 int writing,
806 int (*sock_func) (PySocketSockObject *s, void *data),
807 void *data,
808 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200809 int *err,
810 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811{
Victor Stinner8912d142015-04-06 23:16:34 +0200812 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 _PyTime_t deadline = 0;
814 int deadline_initialized = 0;
815 int res;
816
817 /* sock_call() must be called with the GIL held. */
818 assert(PyGILState_Check());
819
820 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 /* For connect(), poll even for blocking socket. The connection
824 runs asynchronously. */
825 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200826 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200827 _PyTime_t interval;
828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 if (deadline_initialized) {
830 /* recompute the timeout */
831 interval = deadline - _PyTime_GetMonotonicClock();
832 }
833 else {
834 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200835 deadline = _PyTime_GetMonotonicClock() + timeout;
836 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200837 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200838
Victor Stinner10550cd2015-04-03 13:22:27 +0200839 if (interval >= 0)
840 res = internal_select(s, writing, interval, connect);
841 else
842 res = 1;
843 }
844 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200845 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200846 }
847
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200849 if (err)
850 *err = GET_SOCK_ERROR;
851
Victor Stinner31bf2d52015-04-01 21:57:09 +0200852 if (CHECK_ERRNO(EINTR)) {
853 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 if (PyErr_CheckSignals()) {
855 if (err)
856 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200857 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859
860 /* retry select() */
861 continue;
862 }
863
864 /* select() failed */
865 s->errorhandler();
866 return -1;
867 }
868
869 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 if (err)
871 *err = SOCK_TIMEOUT_ERR;
872 else
873 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 return -1;
875 }
876
877 /* the socket is ready */
878 }
879
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 /* inner loop to retry sock_func() when sock_func() is interrupted
881 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200882 while (1) {
883 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200884 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200885 Py_END_ALLOW_THREADS
886
887 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200888 /* sock_func() succeeded */
889 if (err)
890 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891 return 0;
892 }
893
Victor Stinner81c41db2015-04-02 11:50:57 +0200894 if (err)
895 *err = GET_SOCK_ERROR;
896
Victor Stinner31bf2d52015-04-01 21:57:09 +0200897 if (!CHECK_ERRNO(EINTR))
898 break;
899
Victor Stinner81c41db2015-04-02 11:50:57 +0200900 /* sock_func() was interrupted by a signal */
901 if (PyErr_CheckSignals()) {
902 if (err)
903 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200904 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200905 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200906
Victor Stinner81c41db2015-04-02 11:50:57 +0200907 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200908 }
909
910 if (s->sock_timeout > 0
911 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200912 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200913
914 For example, select() could indicate a socket is ready for
915 reading, but the data then discarded by the OS because of a
916 wrong checksum.
917
918 Loop on select() to recheck for socket readyness. */
919 continue;
920 }
921
Victor Stinner81c41db2015-04-02 11:50:57 +0200922 /* sock_func() failed */
923 if (!err)
924 s->errorhandler();
925 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000926 return -1;
927 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200928}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000929
Victor Stinner81c41db2015-04-02 11:50:57 +0200930static int
931sock_call(PySocketSockObject *s,
932 int writing,
933 int (*func) (PySocketSockObject *s, void *data),
934 void *data)
935{
Victor Stinner8912d142015-04-06 23:16:34 +0200936 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200937}
938
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000939
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000940/* Initialize a new socket object. */
941
Victor Stinner88ed6402015-04-09 10:23:12 +0200942/* Default timeout for new sockets */
943static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000944
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200945static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000946init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 s->sock_fd = fd;
950 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500953
954 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
955 on some OSes as part of socket.type. We want to reset them here,
956 to make socket.type be set to the same value on all platforms.
957 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
958 not portable.
959 */
960#ifdef SOCK_NONBLOCK
961 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
962#endif
963#ifdef SOCK_CLOEXEC
964 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
965#endif
966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000970#ifdef SOCK_NONBLOCK
971 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100972 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000973 else
974#endif
975 {
976 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200977 if (defaulttimeout >= 0) {
978 if (internal_setblocking(s, 0) == -1) {
979 return -1;
980 }
981 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000982 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200983 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000984}
985
986
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987/* Create a new socket object.
988 This just creates the object and initializes it.
989 If the creation fails, return NULL and set an exception (implicit
990 in NEWOBJ()). */
991
Guido van Rossum73624e91994-10-10 17:59:00 +0000992static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000993new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 PySocketSockObject *s;
996 s = (PySocketSockObject *)
997 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200998 if (s == NULL)
999 return NULL;
1000 if (init_sockobject(s, fd, family, type, proto) == -1) {
1001 Py_DECREF(s);
1002 return NULL;
1003 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001005}
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007
Guido van Rossum48a680c2001-03-02 06:34:14 +00001008/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001009 thread to be in gethostbyname or getaddrinfo */
1010#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001011static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001012#endif
1013
1014
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015/* Convert a string specifying a host name or one of a few symbolic
1016 names to a numeric IP address. This usually calls gethostbyname()
1017 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001018 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 an error occurred; then an exception is raised. */
1020
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001022setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 struct addrinfo hints, *res;
1025 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1028 if (name[0] == '\0') {
1029 int siz;
1030 memset(&hints, 0, sizeof(hints));
1031 hints.ai_family = af;
1032 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1033 hints.ai_flags = AI_PASSIVE;
1034 Py_BEGIN_ALLOW_THREADS
1035 ACQUIRE_GETADDRINFO_LOCK
1036 error = getaddrinfo(NULL, "0", &hints, &res);
1037 Py_END_ALLOW_THREADS
1038 /* We assume that those thread-unsafe getaddrinfo() versions
1039 *are* safe regarding their return value, ie. that a
1040 subsequent call to getaddrinfo() does not destroy the
1041 outcome of the first call. */
1042 RELEASE_GETADDRINFO_LOCK
1043 if (error) {
1044 set_gaierror(error);
1045 return -1;
1046 }
1047 switch (res->ai_family) {
1048 case AF_INET:
1049 siz = 4;
1050 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001051#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 case AF_INET6:
1053 siz = 16;
1054 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 default:
1057 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001058 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 "unsupported address family");
1060 return -1;
1061 }
1062 if (res->ai_next) {
1063 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001064 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 "wildcard resolved to multiple address");
1066 return -1;
1067 }
1068 if (res->ai_addrlen < addr_ret_size)
1069 addr_ret_size = res->ai_addrlen;
1070 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1071 freeaddrinfo(res);
1072 return siz;
1073 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001074 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001075 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001076 if (strcmp(name, "255.255.255.255") == 0 ||
1077 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 struct sockaddr_in *sin;
1079 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 "address family mismatched");
1082 return -1;
1083 }
1084 sin = (struct sockaddr_in *)addr_ret;
1085 memset((void *) sin, '\0', sizeof(*sin));
1086 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001087#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 sin->sin_addr.s_addr = INADDR_BROADCAST;
1091 return sizeof(sin->sin_addr);
1092 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001093
1094 /* avoid a name resolution in case of numeric address */
1095#ifdef HAVE_INET_PTON
1096 /* check for an IPv4 address */
1097 if (af == AF_UNSPEC || af == AF_INET) {
1098 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1099 memset(sin, 0, sizeof(*sin));
1100 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1101 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001102#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001103 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001104#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001105 return 4;
1106 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001108#ifdef ENABLE_IPV6
1109 /* check for an IPv6 address - if the address contains a scope ID, we
1110 * fallback to getaddrinfo(), which can handle translation from interface
1111 * name to interface index */
1112 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1113 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1114 memset(sin, 0, sizeof(*sin));
1115 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1116 sin->sin6_family = AF_INET6;
1117#ifdef HAVE_SOCKADDR_SA_LEN
1118 sin->sin6_len = sizeof(*sin);
1119#endif
1120 return 16;
1121 }
1122 }
1123#endif /* ENABLE_IPV6 */
1124#else /* HAVE_INET_PTON */
1125 /* check for an IPv4 address */
1126 if (af == AF_INET || af == AF_UNSPEC) {
1127 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1128 memset(sin, 0, sizeof(*sin));
1129 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1130 sin->sin_family = AF_INET;
1131#ifdef HAVE_SOCKADDR_SA_LEN
1132 sin->sin_len = sizeof(*sin);
1133#endif
1134 return 4;
1135 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001136 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001137#endif /* HAVE_INET_PTON */
1138
1139 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 memset(&hints, 0, sizeof(hints));
1141 hints.ai_family = af;
1142 Py_BEGIN_ALLOW_THREADS
1143 ACQUIRE_GETADDRINFO_LOCK
1144 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001145#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (error == EAI_NONAME && af == AF_UNSPEC) {
1147 /* On Tru64 V5.1, numeric-to-addr conversion fails
1148 if no address family is given. Assume IPv4 for now.*/
1149 hints.ai_family = AF_INET;
1150 error = getaddrinfo(name, NULL, &hints, &res);
1151 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 Py_END_ALLOW_THREADS
1154 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1155 if (error) {
1156 set_gaierror(error);
1157 return -1;
1158 }
1159 if (res->ai_addrlen < addr_ret_size)
1160 addr_ret_size = res->ai_addrlen;
1161 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1162 freeaddrinfo(res);
1163 switch (addr_ret->sa_family) {
1164 case AF_INET:
1165 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001166#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 case AF_INET6:
1168 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001171 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 return -1;
1173 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174}
1175
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176
Miss Islington (bot)04425992018-02-12 12:12:24 -08001177/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
Miss Islington (bot)04425992018-02-12 12:12:24 -08001180make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181{
Miss Islington (bot)04425992018-02-12 12:12:24 -08001182 char buf[INET_ADDRSTRLEN];
1183 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1184 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 return NULL;
1186 }
1187 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188}
1189
Miss Islington (bot)04425992018-02-12 12:12:24 -08001190#ifdef ENABLE_IPV6
1191/* Convert IPv6 sockaddr to a Python str. */
1192
1193static PyObject *
1194make_ipv6_addr(const struct sockaddr_in6 *addr)
1195{
1196 char buf[INET6_ADDRSTRLEN];
1197 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1198 PyErr_SetFromErrno(PyExc_OSError);
1199 return NULL;
1200 }
1201 return PyUnicode_FromString(buf);
1202}
1203#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001205#ifdef USE_BLUETOOTH
1206/* Convert a string representation of a Bluetooth address into a numeric
1207 address. Returns the length (6), or raises an exception and returns -1 if
1208 an error occurred. */
1209
1210static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001211setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 unsigned int b0, b1, b2, b3, b4, b5;
1214 char ch;
1215 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1218 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1219 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1220 bdaddr->b[0] = b0;
1221 bdaddr->b[1] = b1;
1222 bdaddr->b[2] = b2;
1223 bdaddr->b[3] = b3;
1224 bdaddr->b[4] = b4;
1225 bdaddr->b[5] = b5;
1226 return 6;
1227 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001228 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 return -1;
1230 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001231}
1232
1233/* Create a string representation of the Bluetooth address. This is always a
1234 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1235 value (zero padded if necessary). */
1236
1237static PyObject *
1238makebdaddr(bdaddr_t *bdaddr)
1239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1243 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1244 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1245 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001246}
1247#endif
1248
1249
Guido van Rossum30a685f1991-06-27 15:51:29 +00001250/* Create an object representing the given socket address,
1251 suitable for passing it back to bind(), connect() etc.
1252 The family field of the sockaddr structure is inspected
1253 to determine what kind of address it really is. */
1254
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001256static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001257makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (addrlen == 0) {
1260 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001261 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 case AF_INET:
1267 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001268 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1269 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 PyObject *ret = NULL;
1271 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1273 Py_DECREF(addrobj);
1274 }
1275 return ret;
1276 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001278#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 case AF_UNIX:
1280 {
1281 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001282#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001283 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1284 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1285 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 }
1287 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001288#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 {
1290 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001291 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 }
1293 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001294#endif /* AF_UNIX */
1295
Martin v. Löwis11017b12006-01-14 18:12:57 +00001296#if defined(AF_NETLINK)
1297 case AF_NETLINK:
1298 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1300 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001301 }
1302#endif /* AF_NETLINK */
1303
caaveryeffc12f2017-09-06 18:18:10 -04001304#if defined(AF_VSOCK)
1305 case AF_VSOCK:
1306 {
1307 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1308 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1309 }
1310#endif /* AF_VSOCK */
1311
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001312#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 case AF_INET6:
1314 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001315 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1316 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 PyObject *ret = NULL;
1318 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001319 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 addrobj,
1321 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001322 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 a->sin6_scope_id);
1324 Py_DECREF(addrobj);
1325 }
1326 return ret;
1327 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001328#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001329
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001330#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case AF_BLUETOOTH:
1332 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 case BTPROTO_L2CAP:
1335 {
1336 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1337 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1338 PyObject *ret = NULL;
1339 if (addrobj) {
1340 ret = Py_BuildValue("Oi",
1341 addrobj,
1342 _BT_L2_MEMB(a, psm));
1343 Py_DECREF(addrobj);
1344 }
1345 return ret;
1346 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 case BTPROTO_RFCOMM:
1349 {
1350 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1351 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1352 PyObject *ret = NULL;
1353 if (addrobj) {
1354 ret = Py_BuildValue("Oi",
1355 addrobj,
1356 _BT_RC_MEMB(a, channel));
1357 Py_DECREF(addrobj);
1358 }
1359 return ret;
1360 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 case BTPROTO_HCI:
1363 {
1364 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001365#if defined(__NetBSD__) || defined(__DragonFly__)
1366 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001367#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 PyObject *ret = NULL;
1369 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1370 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001371#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001373
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001374#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 case BTPROTO_SCO:
1376 {
1377 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1378 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1379 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001380#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 default:
1383 PyErr_SetString(PyExc_ValueError,
1384 "Unknown Bluetooth protocol");
1385 return NULL;
1386 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001387#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001388
Antoine Pitroub156a462010-10-27 20:13:57 +00001389#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 case AF_PACKET:
1391 {
1392 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001393 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 struct ifreq ifr;
1395 /* need to look up interface name give index */
1396 if (a->sll_ifindex) {
1397 ifr.ifr_ifindex = a->sll_ifindex;
1398 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1399 ifname = ifr.ifr_name;
1400 }
1401 return Py_BuildValue("shbhy#",
1402 ifname,
1403 ntohs(a->sll_protocol),
1404 a->sll_pkttype,
1405 a->sll_hatype,
1406 a->sll_addr,
1407 a->sll_halen);
1408 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001409#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001410
Christian Heimes043d6f62008-01-07 17:19:16 +00001411#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 case AF_TIPC:
1413 {
1414 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1415 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1416 return Py_BuildValue("IIIII",
1417 a->addrtype,
1418 a->addr.nameseq.type,
1419 a->addr.nameseq.lower,
1420 a->addr.nameseq.upper,
1421 a->scope);
1422 } else if (a->addrtype == TIPC_ADDR_NAME) {
1423 return Py_BuildValue("IIIII",
1424 a->addrtype,
1425 a->addr.name.name.type,
1426 a->addr.name.name.instance,
1427 a->addr.name.name.instance,
1428 a->scope);
1429 } else if (a->addrtype == TIPC_ADDR_ID) {
1430 return Py_BuildValue("IIIII",
1431 a->addrtype,
1432 a->addr.id.node,
1433 a->addr.id.ref,
1434 0,
1435 a->scope);
1436 } else {
1437 PyErr_SetString(PyExc_ValueError,
1438 "Invalid address type");
1439 return NULL;
1440 }
1441 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001442#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001443
Serhiy Storchakad3187152017-11-09 18:00:38 +02001444#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001445 case AF_CAN:
1446 {
1447 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001448 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001449 struct ifreq ifr;
1450 /* need to look up interface name given index */
1451 if (a->can_ifindex) {
1452 ifr.ifr_ifindex = a->can_ifindex;
1453 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1454 ifname = ifr.ifr_name;
1455 }
1456
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001457 switch (proto) {
1458#ifdef CAN_ISOTP
1459 case CAN_ISOTP:
1460 {
1461 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1462 ifname,
1463 a->can_addr.tp.rx_id,
1464 a->can_addr.tp.tx_id);
1465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001466#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001467 default:
1468 {
1469 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1470 ifname);
1471 }
1472 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001473 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001474#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001475
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001476#ifdef PF_SYSTEM
1477 case PF_SYSTEM:
1478 switch(proto) {
1479#ifdef SYSPROTO_CONTROL
1480 case SYSPROTO_CONTROL:
1481 {
1482 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1483 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1484 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001485#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001486 default:
1487 PyErr_SetString(PyExc_ValueError,
1488 "Invalid address type");
1489 return 0;
1490 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001491#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001492
Christian Heimesdffa3942016-09-05 23:54:41 +02001493#ifdef HAVE_SOCKADDR_ALG
1494 case AF_ALG:
1495 {
1496 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1497 return Py_BuildValue("s#s#HH",
1498 a->salg_type,
1499 strnlen((const char*)a->salg_type,
1500 sizeof(a->salg_type)),
1501 a->salg_name,
1502 strnlen((const char*)a->salg_name,
1503 sizeof(a->salg_name)),
1504 a->salg_feat,
1505 a->salg_mask);
1506 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001507#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 default:
1512 /* If we don't know the address family, don't raise an
1513 exception -- return it as an (int, bytes) tuple. */
1514 return Py_BuildValue("iy#",
1515 addr->sa_family,
1516 addr->sa_data,
1517 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520}
1521
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001522/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1523 (in particular, numeric IP addresses). */
1524struct maybe_idna {
1525 PyObject *obj;
1526 char *buf;
1527};
1528
1529static void
1530idna_cleanup(struct maybe_idna *data)
1531{
1532 Py_CLEAR(data->obj);
1533}
1534
1535static int
1536idna_converter(PyObject *obj, struct maybe_idna *data)
1537{
1538 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001539 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001540 if (obj == NULL) {
1541 idna_cleanup(data);
1542 return 1;
1543 }
1544 data->obj = NULL;
1545 len = -1;
1546 if (PyBytes_Check(obj)) {
1547 data->buf = PyBytes_AsString(obj);
1548 len = PyBytes_Size(obj);
1549 }
1550 else if (PyByteArray_Check(obj)) {
1551 data->buf = PyByteArray_AsString(obj);
1552 len = PyByteArray_Size(obj);
1553 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001554 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001555 if (PyUnicode_READY(obj) == -1) {
1556 return 0;
1557 }
1558 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001559 data->buf = PyUnicode_DATA(obj);
1560 len = PyUnicode_GET_LENGTH(obj);
1561 }
1562 else {
1563 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1564 if (!obj2) {
1565 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1566 return 0;
1567 }
1568 assert(PyBytes_Check(obj2));
1569 data->obj = obj2;
1570 data->buf = PyBytes_AS_STRING(obj2);
1571 len = PyBytes_GET_SIZE(obj2);
1572 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001573 }
1574 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001575 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1576 obj->ob_type->tp_name);
1577 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001578 }
1579 if (strlen(data->buf) != len) {
1580 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001581 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001582 return 0;
1583 }
1584 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001585}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001586
1587/* Parse a socket address argument according to the socket object's
1588 address family. Return 1 if the address was in the proper format,
1589 0 of not. The address is returned through addr_ret, its length
1590 through len_ret. */
1591
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001592static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001593getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001597
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001598#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 case AF_UNIX:
1600 {
1601 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001602 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001603 int retval = 0;
1604
1605 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1606 allow embedded nulls on Linux. */
1607 if (PyUnicode_Check(args)) {
1608 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1609 return 0;
1610 }
1611 else
1612 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001613 if (!PyArg_Parse(args, "y*", &path)) {
1614 Py_DECREF(args);
1615 return retval;
1616 }
1617 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001620#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001621 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001623 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001624 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001626 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 }
1628 }
1629 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001630#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 {
1632 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001634 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001636 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001638 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 }
1640 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001641 memcpy(addr->sun_path, path.buf, path.len);
1642 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001643 retval = 1;
1644 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001645 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001646 Py_DECREF(args);
1647 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001649#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001650
Martin v. Löwis11017b12006-01-14 18:12:57 +00001651#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 case AF_NETLINK:
1653 {
1654 struct sockaddr_nl* addr;
1655 int pid, groups;
1656 addr = (struct sockaddr_nl *)addr_ret;
1657 if (!PyTuple_Check(args)) {
1658 PyErr_Format(
1659 PyExc_TypeError,
1660 "getsockaddrarg: "
1661 "AF_NETLINK address must be tuple, not %.500s",
1662 Py_TYPE(args)->tp_name);
1663 return 0;
1664 }
1665 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1666 return 0;
1667 addr->nl_family = AF_NETLINK;
1668 addr->nl_pid = pid;
1669 addr->nl_groups = groups;
1670 *len_ret = sizeof(*addr);
1671 return 1;
1672 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001673#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001674
caaveryeffc12f2017-09-06 18:18:10 -04001675#if defined(AF_VSOCK)
1676 case AF_VSOCK:
1677 {
1678 struct sockaddr_vm* addr;
1679 int port, cid;
1680 addr = (struct sockaddr_vm *)addr_ret;
1681 memset(addr, 0, sizeof(struct sockaddr_vm));
1682 if (!PyTuple_Check(args)) {
1683 PyErr_Format(
1684 PyExc_TypeError,
1685 "getsockaddrarg: "
1686 "AF_VSOCK address must be tuple, not %.500s",
1687 Py_TYPE(args)->tp_name);
1688 return 0;
1689 }
1690 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1691 return 0;
1692 addr->svm_family = s->sock_family;
1693 addr->svm_port = port;
1694 addr->svm_cid = cid;
1695 *len_ret = sizeof(*addr);
1696 return 1;
1697 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001698#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001699
1700
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001701#ifdef AF_RDS
1702 case AF_RDS:
1703 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001704#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 case AF_INET:
1707 {
1708 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001709 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 int port, result;
1711 if (!PyTuple_Check(args)) {
1712 PyErr_Format(
1713 PyExc_TypeError,
1714 "getsockaddrarg: "
1715 "AF_INET address must be tuple, not %.500s",
1716 Py_TYPE(args)->tp_name);
1717 return 0;
1718 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001719 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1720 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 return 0;
1722 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001723 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001725 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (result < 0)
1727 return 0;
1728 if (port < 0 || port > 0xffff) {
1729 PyErr_SetString(
1730 PyExc_OverflowError,
1731 "getsockaddrarg: port must be 0-65535.");
1732 return 0;
1733 }
1734 addr->sin_family = AF_INET;
1735 addr->sin_port = htons((short)port);
1736 *len_ret = sizeof *addr;
1737 return 1;
1738 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001740#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 case AF_INET6:
1742 {
1743 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001744 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001745 int port, result;
1746 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 flowinfo = scope_id = 0;
1748 if (!PyTuple_Check(args)) {
1749 PyErr_Format(
1750 PyExc_TypeError,
1751 "getsockaddrarg: "
1752 "AF_INET6 address must be tuple, not %.500s",
1753 Py_TYPE(args)->tp_name);
1754 return 0;
1755 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001756 if (!PyArg_ParseTuple(args, "O&i|II",
1757 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 &scope_id)) {
1759 return 0;
1760 }
1761 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001762 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001764 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (result < 0)
1766 return 0;
1767 if (port < 0 || port > 0xffff) {
1768 PyErr_SetString(
1769 PyExc_OverflowError,
1770 "getsockaddrarg: port must be 0-65535.");
1771 return 0;
1772 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001773 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001774 PyErr_SetString(
1775 PyExc_OverflowError,
1776 "getsockaddrarg: flowinfo must be 0-1048575.");
1777 return 0;
1778 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 addr->sin6_family = s->sock_family;
1780 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001781 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 addr->sin6_scope_id = scope_id;
1783 *len_ret = sizeof *addr;
1784 return 1;
1785 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001786#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001787
Hye-Shik Chang81268602004-02-02 06:05:24 +00001788#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 case AF_BLUETOOTH:
1790 {
1791 switch (s->sock_proto) {
1792 case BTPROTO_L2CAP:
1793 {
1794 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001795 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 addr = (struct sockaddr_l2 *)addr_ret;
1798 memset(addr, 0, sizeof(struct sockaddr_l2));
1799 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1800 if (!PyArg_ParseTuple(args, "si", &straddr,
1801 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001802 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 "wrong format");
1804 return 0;
1805 }
1806 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1807 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 *len_ret = sizeof *addr;
1810 return 1;
1811 }
1812 case BTPROTO_RFCOMM:
1813 {
1814 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001815 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 addr = (struct sockaddr_rc *)addr_ret;
1818 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1819 if (!PyArg_ParseTuple(args, "si", &straddr,
1820 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001821 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 "wrong format");
1823 return 0;
1824 }
1825 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1826 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 *len_ret = sizeof *addr;
1829 return 1;
1830 }
1831 case BTPROTO_HCI:
1832 {
1833 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001834#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001835 const char *straddr;
1836 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1837 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001838 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001839 "wrong format");
1840 return 0;
1841 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001842 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001843 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1844 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001845#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1847 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001848 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 "wrong format");
1850 return 0;
1851 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001852#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 *len_ret = sizeof *addr;
1854 return 1;
1855 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001856#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 case BTPROTO_SCO:
1858 {
1859 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001860 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 addr = (struct sockaddr_sco *)addr_ret;
1863 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1864 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001865 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 "wrong format");
1867 return 0;
1868 }
1869 straddr = PyBytes_AS_STRING(args);
1870 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1871 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 *len_ret = sizeof *addr;
1874 return 1;
1875 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001876#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001878 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return 0;
1880 }
1881 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001882#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001883
Antoine Pitroub156a462010-10-27 20:13:57 +00001884#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 case AF_PACKET:
1886 {
1887 struct sockaddr_ll* addr;
1888 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001889 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 int protoNumber;
1891 int hatype = 0;
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001892 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001893 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 if (!PyTuple_Check(args)) {
1896 PyErr_Format(
1897 PyExc_TypeError,
1898 "getsockaddrarg: "
1899 "AF_PACKET address must be tuple, not %.500s",
1900 Py_TYPE(args)->tp_name);
1901 return 0;
1902 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001903 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001905 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 return 0;
1907 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1908 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1909 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1910 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001911 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 return 0;
1913 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001914 if (haddr.buf && haddr.len > 8) {
1915 PyErr_SetString(PyExc_ValueError,
1916 "Hardware address must be 8 bytes or less");
1917 PyBuffer_Release(&haddr);
1918 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 }
1920 if (protoNumber < 0 || protoNumber > 0xffff) {
1921 PyErr_SetString(
1922 PyExc_OverflowError,
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001923 "getsockaddrarg: proto must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001924 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 return 0;
1926 }
1927 addr = (struct sockaddr_ll*)addr_ret;
1928 addr->sll_family = AF_PACKET;
1929 addr->sll_protocol = htons((short)protoNumber);
1930 addr->sll_ifindex = ifr.ifr_ifindex;
1931 addr->sll_pkttype = pkttype;
1932 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001933 if (haddr.buf) {
1934 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1935 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001937 else
1938 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001940 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 return 1;
1942 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001943#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001944
Christian Heimes043d6f62008-01-07 17:19:16 +00001945#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 case AF_TIPC:
1947 {
1948 unsigned int atype, v1, v2, v3;
1949 unsigned int scope = TIPC_CLUSTER_SCOPE;
1950 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 if (!PyTuple_Check(args)) {
1953 PyErr_Format(
1954 PyExc_TypeError,
1955 "getsockaddrarg: "
1956 "AF_TIPC address must be tuple, not %.500s",
1957 Py_TYPE(args)->tp_name);
1958 return 0;
1959 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 if (!PyArg_ParseTuple(args,
1962 "IIII|I;Invalid TIPC address format",
1963 &atype, &v1, &v2, &v3, &scope))
1964 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 addr = (struct sockaddr_tipc *) addr_ret;
1967 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 addr->family = AF_TIPC;
1970 addr->scope = scope;
1971 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 if (atype == TIPC_ADDR_NAMESEQ) {
1974 addr->addr.nameseq.type = v1;
1975 addr->addr.nameseq.lower = v2;
1976 addr->addr.nameseq.upper = v3;
1977 } else if (atype == TIPC_ADDR_NAME) {
1978 addr->addr.name.name.type = v1;
1979 addr->addr.name.name.instance = v2;
1980 } else if (atype == TIPC_ADDR_ID) {
1981 addr->addr.id.node = v1;
1982 addr->addr.id.ref = v2;
1983 } else {
1984 /* Shouldn't happen */
1985 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1986 return 0;
1987 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 return 1;
1992 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001993#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001994
Serhiy Storchakad3187152017-11-09 18:00:38 +02001995#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001996 case AF_CAN:
1997 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001998#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001999 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002000 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002001#endif
2002#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002003 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002004#endif
2005#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002006 {
2007 struct sockaddr_can *addr;
2008 PyObject *interfaceName;
2009 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002010 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002011 addr = (struct sockaddr_can *)addr_ret;
2012
Charles-François Natali47413c12011-10-06 19:47:44 +02002013 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
2014 &interfaceName))
2015 return 0;
2016
2017 len = PyBytes_GET_SIZE(interfaceName);
2018
2019 if (len == 0) {
2020 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002021 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002022 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2023 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002024 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2025 s->errorhandler();
2026 Py_DECREF(interfaceName);
2027 return 0;
2028 }
2029 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002030 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002031 "AF_CAN interface name too long");
2032 Py_DECREF(interfaceName);
2033 return 0;
2034 }
2035
2036 addr->can_family = AF_CAN;
2037 addr->can_ifindex = ifr.ifr_ifindex;
2038
2039 *len_ret = sizeof(*addr);
2040 Py_DECREF(interfaceName);
2041 return 1;
2042 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002043#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002044
2045#ifdef CAN_ISOTP
2046 case CAN_ISOTP:
2047 {
2048 struct sockaddr_can *addr;
2049 PyObject *interfaceName;
2050 struct ifreq ifr;
2051 Py_ssize_t len;
2052 unsigned long int rx_id, tx_id;
2053
2054 addr = (struct sockaddr_can *)addr_ret;
2055
2056 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2057 &interfaceName,
2058 &rx_id,
2059 &tx_id))
2060 return 0;
2061
2062 len = PyBytes_GET_SIZE(interfaceName);
2063
2064 if (len == 0) {
2065 ifr.ifr_ifindex = 0;
2066 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2067 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2068 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2069 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2070 s->errorhandler();
2071 Py_DECREF(interfaceName);
2072 return 0;
2073 }
2074 } else {
2075 PyErr_SetString(PyExc_OSError,
2076 "AF_CAN interface name too long");
2077 Py_DECREF(interfaceName);
2078 return 0;
2079 }
2080
2081 addr->can_family = AF_CAN;
2082 addr->can_ifindex = ifr.ifr_ifindex;
2083 addr->can_addr.tp.rx_id = rx_id;
2084 addr->can_addr.tp.tx_id = tx_id;
2085
2086 *len_ret = sizeof(*addr);
2087 Py_DECREF(interfaceName);
2088 return 1;
2089 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002090#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002091 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002092 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002093 "getsockaddrarg: unsupported CAN protocol");
2094 return 0;
2095 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002096#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002097
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002098#ifdef PF_SYSTEM
2099 case PF_SYSTEM:
2100 switch (s->sock_proto) {
2101#ifdef SYSPROTO_CONTROL
2102 case SYSPROTO_CONTROL:
2103 {
2104 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002105
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002106 addr = (struct sockaddr_ctl *)addr_ret;
2107 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002108 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002109
2110 if (PyUnicode_Check(args)) {
2111 struct ctl_info info;
2112 PyObject *ctl_name;
2113
2114 if (!PyArg_Parse(args, "O&",
2115 PyUnicode_FSConverter, &ctl_name)) {
2116 return 0;
2117 }
2118
Victor Stinnerf50e1872015-03-20 11:32:24 +01002119 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002120 PyErr_SetString(PyExc_ValueError,
2121 "provided string is too long");
2122 Py_DECREF(ctl_name);
2123 return 0;
2124 }
2125 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2126 sizeof(info.ctl_name));
2127 Py_DECREF(ctl_name);
2128
2129 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2130 PyErr_SetString(PyExc_OSError,
2131 "cannot find kernel control with provided name");
2132 return 0;
2133 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002134
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002135 addr->sc_id = info.ctl_id;
2136 addr->sc_unit = 0;
2137 } else if (!PyArg_ParseTuple(args, "II",
2138 &(addr->sc_id), &(addr->sc_unit))) {
2139 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2140 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002141
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002142 return 0;
2143 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002144
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002145 *len_ret = sizeof(*addr);
2146 return 1;
2147 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002148#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002149 default:
2150 PyErr_SetString(PyExc_OSError,
2151 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2152 return 0;
2153 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002154#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002155#ifdef HAVE_SOCKADDR_ALG
2156 case AF_ALG:
2157 {
2158 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002159 const char *type;
2160 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002161 sa = (struct sockaddr_alg *)addr_ret;
2162
2163 memset(sa, 0, sizeof(*sa));
2164 sa->salg_family = AF_ALG;
2165
2166 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2167 &type, &name, &sa->salg_feat, &sa->salg_mask))
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002168 {
Christian Heimesdffa3942016-09-05 23:54:41 +02002169 return 0;
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002170 }
2171 /* sockaddr_alg has fixed-sized char arrays for type, and name
2172 * both must be NULL terminated.
2173 */
2174 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002175 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2176 return 0;
2177 }
2178 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002179 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002180 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2181 return 0;
2182 }
2183 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2184
2185 *len_ret = sizeof(*sa);
2186 return 1;
2187 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002188#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002193 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197}
2198
Guido van Rossum30a685f1991-06-27 15:51:29 +00002199
Guido van Rossum48a680c2001-03-02 06:34:14 +00002200/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002201 Return 1 if the family is known, 0 otherwise. The length is returned
2202 through len_ret. */
2203
2204static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002205getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002208
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002209#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 case AF_UNIX:
2211 {
2212 *len_ret = sizeof (struct sockaddr_un);
2213 return 1;
2214 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002215#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002216
Martin v. Löwis11017b12006-01-14 18:12:57 +00002217#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002218 case AF_NETLINK:
2219 {
2220 *len_ret = sizeof (struct sockaddr_nl);
2221 return 1;
2222 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002223#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002224
caaveryeffc12f2017-09-06 18:18:10 -04002225#if defined(AF_VSOCK)
2226 case AF_VSOCK:
2227 {
2228 *len_ret = sizeof (struct sockaddr_vm);
2229 return 1;
2230 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002231#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002232
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002233#ifdef AF_RDS
2234 case AF_RDS:
2235 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002236#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 case AF_INET:
2239 {
2240 *len_ret = sizeof (struct sockaddr_in);
2241 return 1;
2242 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002243
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002244#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 case AF_INET6:
2246 {
2247 *len_ret = sizeof (struct sockaddr_in6);
2248 return 1;
2249 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002250#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002251
Hye-Shik Chang81268602004-02-02 06:05:24 +00002252#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 case AF_BLUETOOTH:
2254 {
2255 switch(s->sock_proto)
2256 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 case BTPROTO_L2CAP:
2259 *len_ret = sizeof (struct sockaddr_l2);
2260 return 1;
2261 case BTPROTO_RFCOMM:
2262 *len_ret = sizeof (struct sockaddr_rc);
2263 return 1;
2264 case BTPROTO_HCI:
2265 *len_ret = sizeof (struct sockaddr_hci);
2266 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002267#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 case BTPROTO_SCO:
2269 *len_ret = sizeof (struct sockaddr_sco);
2270 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002271#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002273 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 "unknown BT protocol");
2275 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 }
2278 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002279#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002280
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002281#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 case AF_PACKET:
2283 {
2284 *len_ret = sizeof (struct sockaddr_ll);
2285 return 1;
2286 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002287#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002288
Christian Heimes043d6f62008-01-07 17:19:16 +00002289#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 case AF_TIPC:
2291 {
2292 *len_ret = sizeof (struct sockaddr_tipc);
2293 return 1;
2294 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002295#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002296
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002297#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002298 case AF_CAN:
2299 {
2300 *len_ret = sizeof (struct sockaddr_can);
2301 return 1;
2302 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002303#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002304
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002305#ifdef PF_SYSTEM
2306 case PF_SYSTEM:
2307 switch(s->sock_proto) {
2308#ifdef SYSPROTO_CONTROL
2309 case SYSPROTO_CONTROL:
2310 *len_ret = sizeof (struct sockaddr_ctl);
2311 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002312#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002313 default:
2314 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2315 "unknown PF_SYSTEM protocol");
2316 return 0;
2317 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002318#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002319#ifdef HAVE_SOCKADDR_ALG
2320 case AF_ALG:
2321 {
2322 *len_ret = sizeof (struct sockaddr_alg);
2323 return 1;
2324 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002325#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002330 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002334}
2335
2336
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002337/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2338 Currently, these methods are only compiled if the RFC 2292/3542
2339 CMSG_LEN() macro is available. Older systems seem to have used
2340 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2341 it may be possible to define CMSG_LEN() that way if it's not
2342 provided. Some architectures might need extra padding after the
2343 cmsghdr, however, and CMSG_LEN() would have to take account of
2344 this. */
2345#ifdef CMSG_LEN
2346/* If length is in range, set *result to CMSG_LEN(length) and return
2347 true; otherwise, return false. */
2348static int
2349get_CMSG_LEN(size_t length, size_t *result)
2350{
2351 size_t tmp;
2352
2353 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2354 return 0;
2355 tmp = CMSG_LEN(length);
2356 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2357 return 0;
2358 *result = tmp;
2359 return 1;
2360}
2361
2362#ifdef CMSG_SPACE
2363/* If length is in range, set *result to CMSG_SPACE(length) and return
2364 true; otherwise, return false. */
2365static int
2366get_CMSG_SPACE(size_t length, size_t *result)
2367{
2368 size_t tmp;
2369
2370 /* Use CMSG_SPACE(1) here in order to take account of the padding
2371 necessary before *and* after the data. */
2372 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2373 return 0;
2374 tmp = CMSG_SPACE(length);
2375 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2376 return 0;
2377 *result = tmp;
2378 return 1;
2379}
2380#endif
2381
2382/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2383 pointer in msg->msg_control with at least "space" bytes after it,
2384 and its cmsg_len member inside the buffer. */
2385static int
2386cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2387{
2388 size_t cmsg_offset;
2389 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2390 sizeof(cmsgh->cmsg_len));
2391
Charles-François Natali466517d2011-08-28 18:23:43 +02002392 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002393 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002394 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002395 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2396 annoying under OS X as it's unsigned there and so it triggers a
2397 tautological comparison warning under Clang when compared against 0.
2398 Since the check is valid on other platforms, silence the warning under
2399 Clang. */
2400 #ifdef __clang__
2401 #pragma clang diagnostic push
2402 #pragma clang diagnostic ignored "-Wtautological-compare"
2403 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002404 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002405 #pragma GCC diagnostic push
2406 #pragma GCC diagnostic ignored "-Wtype-limits"
2407 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002408 if (msg->msg_controllen < 0)
2409 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002410 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002411 #pragma GCC diagnostic pop
2412 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002413 #ifdef __clang__
2414 #pragma clang diagnostic pop
2415 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002416 if (space < cmsg_len_end)
2417 space = cmsg_len_end;
2418 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2419 return (cmsg_offset <= (size_t)-1 - space &&
2420 cmsg_offset + space <= msg->msg_controllen);
2421}
2422
2423/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2424 *space to number of bytes following it in the buffer and return
2425 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2426 msg->msg_controllen are valid. */
2427static int
2428get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2429{
2430 size_t data_offset;
2431 char *data_ptr;
2432
2433 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2434 return 0;
2435 data_offset = data_ptr - (char *)msg->msg_control;
2436 if (data_offset > msg->msg_controllen)
2437 return 0;
2438 *space = msg->msg_controllen - data_offset;
2439 return 1;
2440}
2441
2442/* If cmsgh is invalid or not contained in the buffer pointed to by
2443 msg->msg_control, return -1. If cmsgh is valid and its associated
2444 data is entirely contained in the buffer, set *data_len to the
2445 length of the associated data and return 0. If only part of the
2446 associated data is contained in the buffer but cmsgh is otherwise
2447 valid, set *data_len to the length contained in the buffer and
2448 return 1. */
2449static int
2450get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2451{
2452 size_t space, cmsg_data_len;
2453
2454 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2455 cmsgh->cmsg_len < CMSG_LEN(0))
2456 return -1;
2457 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2458 if (!get_cmsg_data_space(msg, cmsgh, &space))
2459 return -1;
2460 if (space >= cmsg_data_len) {
2461 *data_len = cmsg_data_len;
2462 return 0;
2463 }
2464 *data_len = space;
2465 return 1;
2466}
2467#endif /* CMSG_LEN */
2468
2469
Victor Stinner31bf2d52015-04-01 21:57:09 +02002470struct sock_accept {
2471 socklen_t *addrlen;
2472 sock_addr_t *addrbuf;
2473 SOCKET_T result;
2474};
2475
2476#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2477/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2478static int accept4_works = -1;
2479#endif
2480
2481static int
2482sock_accept_impl(PySocketSockObject *s, void *data)
2483{
2484 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002485 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2486 socklen_t *paddrlen = ctx->addrlen;
2487#ifdef HAVE_SOCKADDR_ALG
2488 /* AF_ALG does not support accept() with addr and raises
2489 * ECONNABORTED instead. */
2490 if (s->sock_family == AF_ALG) {
2491 addr = NULL;
2492 paddrlen = NULL;
2493 *ctx->addrlen = 0;
2494 }
2495#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002496
2497#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2498 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002499 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002500 SOCK_CLOEXEC);
2501 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2502 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2503 accept4_works = (errno != ENOSYS);
2504 }
2505 }
2506 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002507 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002508#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002509 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002510#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002511
2512#ifdef MS_WINDOWS
2513 return (ctx->result != INVALID_SOCKET);
2514#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002515 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002516#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002517}
2518
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002519/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002520
Guido van Rossum73624e91994-10-10 17:59:00 +00002521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002525 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 socklen_t addrlen;
2527 PyObject *sock = NULL;
2528 PyObject *addr = NULL;
2529 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002530 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 if (!getsockaddrlen(s, &addrlen))
2533 return NULL;
2534 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 if (!IS_SELECTABLE(s))
2537 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002538
Victor Stinner31bf2d52015-04-01 21:57:09 +02002539 ctx.addrlen = &addrlen;
2540 ctx.addrbuf = &addrbuf;
2541 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002543 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002544
Victor Stinnerdaf45552013-08-28 00:53:59 +02002545#ifdef MS_WINDOWS
2546 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2547 PyErr_SetFromWindowsErr(0);
2548 SOCKETCLOSE(newfd);
2549 goto finally;
2550 }
2551#else
2552
2553#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2554 if (!accept4_works)
2555#endif
2556 {
2557 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2558 SOCKETCLOSE(newfd);
2559 goto finally;
2560 }
2561 }
2562#endif
2563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 sock = PyLong_FromSocket_t(newfd);
2565 if (sock == NULL) {
2566 SOCKETCLOSE(newfd);
2567 goto finally;
2568 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2571 addrlen, s->sock_proto);
2572 if (addr == NULL)
2573 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002576
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 Py_XDECREF(sock);
2579 Py_XDECREF(addr);
2580 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002581}
2582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002584"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002585\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002586Wait for an incoming connection. Return a new socket file descriptor\n\
2587representing the connection, and the address of the client.\n\
2588For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589
Guido van Rossum11ba0942002-06-13 15:07:44 +00002590/* s.setblocking(flag) method. Argument:
2591 False -- non-blocking mode; same as settimeout(0)
2592 True -- blocking mode; same as settimeout(None)
2593*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002594
Guido van Rossum73624e91994-10-10 17:59:00 +00002595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002596sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002597{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002598 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 block = PyLong_AsLong(arg);
2601 if (block == -1 && PyErr_Occurred())
2602 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002603
Victor Stinner9001d802015-04-06 23:06:01 +02002604 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002605 if (internal_setblocking(s, block) == -1) {
2606 return NULL;
2607 }
2608 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002609}
Guido van Rossume4485b01994-09-07 14:32:49 +00002610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002611PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002612"setblocking(flag)\n\
2613\n\
2614Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002615setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002616setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002617
Yury Selivanovf11b4602018-01-28 17:27:38 -05002618/* s.getblocking() method.
2619 Returns True if socket is in blocking mode,
2620 False if it is in non-blocking mode.
2621*/
2622static PyObject *
2623sock_getblocking(PySocketSockObject *s)
2624{
2625 if (s->sock_timeout) {
2626 Py_RETURN_TRUE;
2627 }
2628 else {
2629 Py_RETURN_FALSE;
2630 }
2631}
2632
2633PyDoc_STRVAR(getblocking_doc,
2634"getblocking()\n\
2635\n\
2636Returns True if socket is in blocking mode, or False if it\n\
2637is in non-blocking mode.");
2638
Victor Stinner71694d52015-03-28 01:18:54 +01002639static int
2640socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2641{
2642#ifdef MS_WINDOWS
2643 struct timeval tv;
2644#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002645#ifndef HAVE_POLL
2646 _PyTime_t ms;
2647#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002648 int overflow = 0;
2649
2650 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002651 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002652 return 0;
2653 }
2654
Victor Stinner869e1772015-03-30 03:49:14 +02002655 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002656 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002657 return -1;
2658
2659 if (*timeout < 0) {
2660 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2661 return -1;
2662 }
2663
2664#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002665 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002666#endif
2667#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002668 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002669 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002670#endif
2671 if (overflow) {
2672 PyErr_SetString(PyExc_OverflowError,
2673 "timeout doesn't fit into C timeval");
2674 return -1;
2675 }
2676
2677 return 0;
2678}
2679
Guido van Rossum11ba0942002-06-13 15:07:44 +00002680/* s.settimeout(timeout) method. Argument:
2681 None -- no timeout, blocking mode; same as setblocking(True)
2682 0.0 -- non-blocking mode; same as setblocking(False)
2683 > 0 -- timeout mode; operations time out after timeout seconds
2684 < 0 -- illegal; raises an exception
2685*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002686static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002687sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002688{
Victor Stinner71694d52015-03-28 01:18:54 +01002689 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002690
Victor Stinner71694d52015-03-28 01:18:54 +01002691 if (socket_parse_timeout(&timeout, arg) < 0)
2692 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002695
2696 int block = timeout < 0;
2697 /* Blocking mode for a Python socket object means that operations
2698 like :meth:`recv` or :meth:`sendall` will block the execution of
2699 the current thread until they are complete or aborted with a
2700 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2701 the underlying FD is in a blocking mode. When timeout is a positive
2702 number, the FD is in a non-blocking mode, and socket ops are
2703 implemented with a `select()` call.
2704
2705 When timeout is 0.0, the FD is in a non-blocking mode.
2706
2707 This table summarizes all states in which the socket object and
2708 its underlying FD can be:
2709
2710 ==================== ===================== ==============
2711 `gettimeout()` `getblocking()` FD
2712 ==================== ===================== ==============
2713 ``None`` ``True`` blocking
2714 ``0.0`` ``False`` non-blocking
2715 ``> 0`` ``True`` non-blocking
2716 */
2717
2718 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002719 return NULL;
2720 }
2721 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722}
2723
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002724PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002725"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002726\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002727Set a timeout on socket operations. 'timeout' can be a float,\n\
2728giving in seconds, or None. Setting a timeout of None disables\n\
2729the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002730Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002732/* s.gettimeout() method.
2733 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002734static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002735sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002736{
Victor Stinner71694d52015-03-28 01:18:54 +01002737 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002738 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 }
Victor Stinner71694d52015-03-28 01:18:54 +01002740 else {
2741 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2742 return PyFloat_FromDouble(seconds);
2743 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002744}
2745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002746PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002747"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002748\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002749Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002750operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002751operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002752
Guido van Rossumaee08791992-09-08 09:05:33 +00002753/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002754 With an integer third argument, sets an integer optval with optlen=4.
2755 With None as third argument and an integer fourth argument, set
2756 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002757 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002758 use optional built-in module 'struct' to encode the string.
2759*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002760
Guido van Rossum73624e91994-10-10 17:59:00 +00002761static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 int level;
2765 int optname;
2766 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002767 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002769 unsigned int optlen;
2770 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002771
caaveryeffc12f2017-09-06 18:18:10 -04002772#ifdef AF_VSOCK
2773 if (s->sock_family == AF_VSOCK) {
2774 uint64_t vflag; // Must be set width of 64 bits
2775 /* setsockopt(level, opt, flag) */
2776 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2777 &level, &optname, &vflag)) {
2778 // level should always be set to AF_VSOCK
2779 res = setsockopt(s->sock_fd, level, optname,
2780 (void*)&vflag, sizeof vflag);
2781 goto done;
2782 }
2783 return NULL;
2784 }
2785#endif
2786
Christian Heimesdffa3942016-09-05 23:54:41 +02002787 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 if (PyArg_ParseTuple(args, "iii:setsockopt",
2789 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002790 res = setsockopt(s->sock_fd, level, optname,
2791 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002792 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002794
2795 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002796 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002797 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2798 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2799 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002800 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002801 NULL, (socklen_t)optlen);
2802 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002804
2805 PyErr_Clear();
2806 /* setsockopt(level, opt, buffer) */
2807 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2808 &level, &optname, &optval))
2809 return NULL;
2810
2811#ifdef MS_WINDOWS
2812 if (optval.len > INT_MAX) {
2813 PyBuffer_Release(&optval);
2814 PyErr_Format(PyExc_OverflowError,
2815 "socket option is larger than %i bytes",
2816 INT_MAX);
2817 return NULL;
2818 }
2819 res = setsockopt(s->sock_fd, level, optname,
2820 optval.buf, (int)optval.len);
2821#else
2822 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2823#endif
2824 PyBuffer_Release(&optval);
2825
2826done:
Victor Stinnercc739322016-03-23 21:35:29 +01002827 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002829 }
2830
2831 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002832}
2833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002834PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002835"setsockopt(level, option, value: int)\n\
2836setsockopt(level, option, value: buffer)\n\
2837setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838\n\
2839Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002840The value argument can either be an integer, a string buffer, or \n\
2841None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002843
Guido van Rossumaee08791992-09-08 09:05:33 +00002844/* s.getsockopt() method.
2845 With two arguments, retrieves an integer option.
2846 With a third integer argument, retrieves a string buffer of that size;
2847 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002848
Guido van Rossum73624e91994-10-10 17:59:00 +00002849static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002850sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 int level;
2853 int optname;
2854 int res;
2855 PyObject *buf;
2856 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002857 int flag = 0;
2858 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2861 &level, &optname, &buflen))
2862 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002865#ifdef AF_VSOCK
2866 if (s->sock_family == AF_VSOCK) {
2867 uint64_t vflag = 0; // Must be set width of 64 bits
2868 flagsize = sizeof vflag;
2869 res = getsockopt(s->sock_fd, level, optname,
2870 (void *)&vflag, &flagsize);
2871 if (res < 0)
2872 return s->errorhandler();
2873 return PyLong_FromUnsignedLong(vflag);
2874 }
2875#endif
2876 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 res = getsockopt(s->sock_fd, level, optname,
2878 (void *)&flag, &flagsize);
2879 if (res < 0)
2880 return s->errorhandler();
2881 return PyLong_FromLong(flag);
2882 }
caaveryeffc12f2017-09-06 18:18:10 -04002883#ifdef AF_VSOCK
2884 if (s->sock_family == AF_VSOCK) {
2885 PyErr_SetString(PyExc_OSError,
2886 "getsockopt string buffer not allowed");
2887 return NULL;
2888 }
2889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002891 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 "getsockopt buflen out of range");
2893 return NULL;
2894 }
2895 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2896 if (buf == NULL)
2897 return NULL;
2898 res = getsockopt(s->sock_fd, level, optname,
2899 (void *)PyBytes_AS_STRING(buf), &buflen);
2900 if (res < 0) {
2901 Py_DECREF(buf);
2902 return s->errorhandler();
2903 }
2904 _PyBytes_Resize(&buf, buflen);
2905 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002909"getsockopt(level, option[, buffersize]) -> value\n\
2910\n\
2911Get a socket option. See the Unix manual for level and option.\n\
2912If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002913string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002915
Fred Drake728819a2000-07-01 03:40:12 +00002916/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002917
Guido van Rossum73624e91994-10-10 17:59:00 +00002918static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002919sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 sock_addr_t addrbuf;
2922 int addrlen;
2923 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2926 return NULL;
2927 Py_BEGIN_ALLOW_THREADS
2928 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2929 Py_END_ALLOW_THREADS
2930 if (res < 0)
2931 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002932 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002933}
2934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002935PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002936"bind(address)\n\
2937\n\
2938Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002939pair (host, port); the host must refer to the local host. For raw packet\n\
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07002940sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941
Guido van Rossum30a685f1991-06-27 15:51:29 +00002942
2943/* s.close() method.
2944 Set the file descriptor to -1 so operations tried subsequently
2945 will surely fail. */
2946
Guido van Rossum73624e91994-10-10 17:59:00 +00002947static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002948sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002951 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002952
Victor Stinner19a8e842016-03-21 16:36:48 +01002953 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002954 if (fd != INVALID_SOCKET) {
2955 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002956
2957 /* We do not want to retry upon EINTR: see
2958 http://lwn.net/Articles/576478/ and
2959 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2960 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002962 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002964 /* bpo-30319: The peer can already have closed the connection.
2965 Python ignores ECONNRESET on close(). */
2966 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002967 return s->errorhandler();
2968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002970 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002971}
2972
Christian Heimesd0e31b92018-01-27 09:54:13 +01002973PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002974"close()\n\
2975\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002976Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002977
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002978static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002979sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002980{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002981 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002982 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002983 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002984}
2985
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002986PyDoc_STRVAR(detach_doc,
2987"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002988\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002989Close the socket object without closing the underlying file descriptor.\n\
2990The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002991can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002992
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002993static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002994sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002995{
Victor Stinner81c41db2015-04-02 11:50:57 +02002996 int err;
2997 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002998
Victor Stinner81c41db2015-04-02 11:50:57 +02002999 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3000 /* getsockopt() failed */
3001 return 0;
3002 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003003
Victor Stinner81c41db2015-04-02 11:50:57 +02003004 if (err == EISCONN)
3005 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003006 if (err != 0) {
3007 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3008 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003009 return 0;
3010 }
3011 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003012}
3013
3014static int
3015internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3016 int raise)
3017{
3018 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003019
3020 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003022 Py_END_ALLOW_THREADS
3023
Victor Stinner70a46f62015-03-31 22:03:59 +02003024 if (!res) {
3025 /* connect() succeeded, the socket is connected */
3026 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003028
Victor Stinner81c41db2015-04-02 11:50:57 +02003029 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003030
Victor Stinner81c41db2015-04-02 11:50:57 +02003031 /* save error, PyErr_CheckSignals() can replace it */
3032 err = GET_SOCK_ERROR;
3033 if (CHECK_ERRNO(EINTR)) {
3034 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003035 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003036
3037 /* Issue #23618: when connect() fails with EINTR, the connection is
3038 running asynchronously.
3039
3040 If the socket is blocking or has a timeout, wait until the
3041 connection completes, fails or timed out using select(), and then
3042 get the connection status using getsockopt(SO_ERROR).
3043
3044 If the socket is non-blocking, raise InterruptedError. The caller is
3045 responsible to wait until the connection completes, fails or timed
3046 out (it's the case in asyncio for example). */
3047 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3048 }
3049 else {
3050 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3051 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003052 }
3053
Victor Stinner81c41db2015-04-02 11:50:57 +02003054 if (!wait_connect) {
3055 if (raise) {
3056 /* restore error, maybe replaced by PyErr_CheckSignals() */
3057 SET_SOCK_ERROR(err);
3058 s->errorhandler();
3059 return -1;
3060 }
3061 else
3062 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003063 }
3064
Victor Stinner81c41db2015-04-02 11:50:57 +02003065 if (raise) {
3066 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003067 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3068 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003069 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003070 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003071 else {
3072 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003073 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3074 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003075 return err;
3076 }
3077 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003078}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003079
Fred Drake728819a2000-07-01 03:40:12 +00003080/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003081
Guido van Rossum73624e91994-10-10 17:59:00 +00003082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003083sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 sock_addr_t addrbuf;
3086 int addrlen;
3087 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3090 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003091
Victor Stinner81c41db2015-04-02 11:50:57 +02003092 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003093 if (res < 0)
3094 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003095
Victor Stinneree699e92015-03-31 21:28:42 +02003096 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003097}
3098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003099PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003100"connect(address)\n\
3101\n\
3102Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003103is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003104
Guido van Rossum30a685f1991-06-27 15:51:29 +00003105
Fred Drake728819a2000-07-01 03:40:12 +00003106/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003107
3108static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003109sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 sock_addr_t addrbuf;
3112 int addrlen;
3113 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3116 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003117
Victor Stinner81c41db2015-04-02 11:50:57 +02003118 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003119 if (res < 0)
3120 return NULL;
3121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003123}
3124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003126"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003127\n\
3128This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003129instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003130
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003131
Guido van Rossumed233a51992-06-23 09:07:03 +00003132/* s.fileno() method */
3133
Guido van Rossum73624e91994-10-10 17:59:00 +00003134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003135sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003138}
3139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003140PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003141"fileno() -> integer\n\
3142\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003143Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003144
Guido van Rossumed233a51992-06-23 09:07:03 +00003145
Guido van Rossumc89705d1992-11-26 08:54:07 +00003146/* s.getsockname() method */
3147
Guido van Rossum73624e91994-10-10 17:59:00 +00003148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003149sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 sock_addr_t addrbuf;
3152 int res;
3153 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 if (!getsockaddrlen(s, &addrlen))
3156 return NULL;
3157 memset(&addrbuf, 0, addrlen);
3158 Py_BEGIN_ALLOW_THREADS
3159 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3160 Py_END_ALLOW_THREADS
3161 if (res < 0)
3162 return s->errorhandler();
3163 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3164 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003165}
3166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003167PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003168"getsockname() -> address info\n\
3169\n\
3170Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003171info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003172
Guido van Rossumc89705d1992-11-26 08:54:07 +00003173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003175/* s.getpeername() method */
3176
Guido van Rossum73624e91994-10-10 17:59:00 +00003177static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003178sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 sock_addr_t addrbuf;
3181 int res;
3182 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 if (!getsockaddrlen(s, &addrlen))
3185 return NULL;
3186 memset(&addrbuf, 0, addrlen);
3187 Py_BEGIN_ALLOW_THREADS
3188 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3189 Py_END_ALLOW_THREADS
3190 if (res < 0)
3191 return s->errorhandler();
3192 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3193 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003194}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003196PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003197"getpeername() -> address info\n\
3198\n\
3199Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003200info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003201
Guido van Rossumb6775db1994-08-01 11:34:53 +00003202#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003203
3204
Guido van Rossum30a685f1991-06-27 15:51:29 +00003205/* s.listen(n) method */
3206
Guido van Rossum73624e91994-10-10 17:59:00 +00003207static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003208sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003209{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003210 /* We try to choose a default backlog high enough to avoid connection drops
3211 * for common workloads, yet not too high to limit resource usage. */
3212 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003214
Charles-François Natali644b8f52014-05-22 19:45:39 +01003215 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003219 /* To avoid problems on systems that don't allow a negative backlog
3220 * (which doesn't make sense anyway) we force a minimum value of 0. */
3221 if (backlog < 0)
3222 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 res = listen(s->sock_fd, backlog);
3224 Py_END_ALLOW_THREADS
3225 if (res < 0)
3226 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003227 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003228}
3229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003230PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003231"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003232\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003233Enable a server to accept connections. If backlog is specified, it must be\n\
3234at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003235unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003236connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003237
Victor Stinner31bf2d52015-04-01 21:57:09 +02003238struct sock_recv {
3239 char *cbuf;
3240 Py_ssize_t len;
3241 int flags;
3242 Py_ssize_t result;
3243};
3244
3245static int
3246sock_recv_impl(PySocketSockObject *s, void *data)
3247{
3248 struct sock_recv *ctx = data;
3249
3250#ifdef MS_WINDOWS
3251 if (ctx->len > INT_MAX)
3252 ctx->len = INT_MAX;
3253 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3254#else
3255 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3256#endif
3257 return (ctx->result >= 0);
3258}
3259
Guido van Rossum82a5c661998-07-07 20:45:43 +00003260
Thomas Wouters477c8d52006-05-27 19:21:47 +00003261/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003262 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003263 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003265 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003266 * also possible that we return a number of bytes smaller than the request
3267 * bytes.
3268 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003269
Antoine Pitrou19467d22010-08-17 19:33:30 +00003270static Py_ssize_t
3271sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003272{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003273 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 if (!IS_SELECTABLE(s)) {
3276 select_error();
3277 return -1;
3278 }
3279 if (len == 0) {
3280 /* If 0 bytes were requested, do nothing. */
3281 return 0;
3282 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003283
Victor Stinner31bf2d52015-04-01 21:57:09 +02003284 ctx.cbuf = cbuf;
3285 ctx.len = len;
3286 ctx.flags = flags;
3287 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003289
3290 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003291}
3292
Guido van Rossum48a680c2001-03-02 06:34:14 +00003293
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003294/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003295
Guido van Rossum73624e91994-10-10 17:59:00 +00003296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003297sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003298{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003299 Py_ssize_t recvlen, outlen;
3300 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003302
Antoine Pitrou19467d22010-08-17 19:33:30 +00003303 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (recvlen < 0) {
3307 PyErr_SetString(PyExc_ValueError,
3308 "negative buffersize in recv");
3309 return NULL;
3310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 /* Allocate a new string. */
3313 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3314 if (buf == NULL)
3315 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 /* Call the guts */
3318 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3319 if (outlen < 0) {
3320 /* An error occurred, release the string and return an
3321 error. */
3322 Py_DECREF(buf);
3323 return NULL;
3324 }
3325 if (outlen != recvlen) {
3326 /* We did not read as many bytes as we anticipated, resize the
3327 string if possible and be successful. */
3328 _PyBytes_Resize(&buf, outlen);
3329 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003332}
3333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003334PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003335"recv(buffersize[, flags]) -> data\n\
3336\n\
3337Receive up to buffersize bytes from the socket. For the optional flags\n\
3338argument, see the Unix manual. When no data is available, block until\n\
3339at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003340the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003341
Guido van Rossum30a685f1991-06-27 15:51:29 +00003342
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003343/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003344
Thomas Wouters477c8d52006-05-27 19:21:47 +00003345static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003346sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003349
Antoine Pitrou19467d22010-08-17 19:33:30 +00003350 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 Py_buffer pbuf;
3352 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003353 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003356 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 &pbuf, &recvlen, &flags))
3358 return NULL;
3359 buf = pbuf.buf;
3360 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 if (recvlen < 0) {
3363 PyBuffer_Release(&pbuf);
3364 PyErr_SetString(PyExc_ValueError,
3365 "negative buffersize in recv_into");
3366 return NULL;
3367 }
3368 if (recvlen == 0) {
3369 /* If nbytes was not specified, use the buffer's length */
3370 recvlen = buflen;
3371 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 /* Check if the buffer is large enough */
3374 if (buflen < recvlen) {
3375 PyBuffer_Release(&pbuf);
3376 PyErr_SetString(PyExc_ValueError,
3377 "buffer too small for requested bytes");
3378 return NULL;
3379 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 /* Call the guts */
3382 readlen = sock_recv_guts(s, buf, recvlen, flags);
3383 if (readlen < 0) {
3384 /* Return an error. */
3385 PyBuffer_Release(&pbuf);
3386 return NULL;
3387 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 PyBuffer_Release(&pbuf);
3390 /* Return the number of bytes read. Note that we do not do anything
3391 special here in the case that readlen < recvlen. */
3392 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003393}
3394
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003395PyDoc_STRVAR(recv_into_doc,
3396"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003397\n\
3398A version of recv() that stores its data into a buffer rather than creating \n\
3399a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3400is not specified (or 0), receive up to the size available in the given buffer.\n\
3401\n\
3402See recv() for documentation about the flags.");
3403
Victor Stinner31bf2d52015-04-01 21:57:09 +02003404struct sock_recvfrom {
3405 char* cbuf;
3406 Py_ssize_t len;
3407 int flags;
3408 socklen_t *addrlen;
3409 sock_addr_t *addrbuf;
3410 Py_ssize_t result;
3411};
3412
3413static int
3414sock_recvfrom_impl(PySocketSockObject *s, void *data)
3415{
3416 struct sock_recvfrom *ctx = data;
3417
3418 memset(ctx->addrbuf, 0, *ctx->addrlen);
3419
3420#ifdef MS_WINDOWS
3421 if (ctx->len > INT_MAX)
3422 ctx->len = INT_MAX;
3423 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3424 SAS2SA(ctx->addrbuf), ctx->addrlen);
3425#else
3426 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3427 SAS2SA(ctx->addrbuf), ctx->addrlen);
3428#endif
3429 return (ctx->result >= 0);
3430}
3431
Thomas Wouters477c8d52006-05-27 19:21:47 +00003432
3433/*
Christian Heimes99170a52007-12-19 02:07:34 +00003434 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3435 * into a char buffer. If you have any inc/def ref to do to the objects that
3436 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003437 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003438 * that it is also possible that we return a number of bytes smaller than the
3439 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440 *
3441 * 'addr' is a return value for the address object. Note that you must decref
3442 * it yourself.
3443 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003444static Py_ssize_t
3445sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003450 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 if (!getsockaddrlen(s, &addrlen))
3455 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 if (!IS_SELECTABLE(s)) {
3458 select_error();
3459 return -1;
3460 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003461
Victor Stinner31bf2d52015-04-01 21:57:09 +02003462 ctx.cbuf = cbuf;
3463 ctx.len = len;
3464 ctx.flags = flags;
3465 ctx.addrbuf = &addrbuf;
3466 ctx.addrlen = &addrlen;
3467 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003469
Victor Stinner31bf2d52015-04-01 21:57:09 +02003470 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3471 s->sock_proto);
3472 if (*addr == NULL)
3473 return -1;
3474
3475 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003476}
3477
3478/* s.recvfrom(nbytes [,flags]) method */
3479
3480static PyObject *
3481sock_recvfrom(PySocketSockObject *s, PyObject *args)
3482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 PyObject *buf = NULL;
3484 PyObject *addr = NULL;
3485 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003486 int flags = 0;
3487 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003488
Antoine Pitrou19467d22010-08-17 19:33:30 +00003489 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 if (recvlen < 0) {
3493 PyErr_SetString(PyExc_ValueError,
3494 "negative buffersize in recvfrom");
3495 return NULL;
3496 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3499 if (buf == NULL)
3500 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3503 recvlen, flags, &addr);
3504 if (outlen < 0) {
3505 goto finally;
3506 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 if (outlen != recvlen) {
3509 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003510 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003512 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 goto finally;
3514 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003517
3518finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 Py_XDECREF(buf);
3520 Py_XDECREF(addr);
3521 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003522}
3523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003524PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003525"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3526\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003527Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003528
Thomas Wouters477c8d52006-05-27 19:21:47 +00003529
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003530/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003531
3532static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003533sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003536
Antoine Pitrou19467d22010-08-17 19:33:30 +00003537 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 Py_buffer pbuf;
3539 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003540 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003543
Antoine Pitrou19467d22010-08-17 19:33:30 +00003544 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 kwlist, &pbuf,
3546 &recvlen, &flags))
3547 return NULL;
3548 buf = pbuf.buf;
3549 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 if (recvlen < 0) {
3552 PyBuffer_Release(&pbuf);
3553 PyErr_SetString(PyExc_ValueError,
3554 "negative buffersize in recvfrom_into");
3555 return NULL;
3556 }
3557 if (recvlen == 0) {
3558 /* If nbytes was not specified, use the buffer's length */
3559 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003560 } else if (recvlen > buflen) {
3561 PyBuffer_Release(&pbuf);
3562 PyErr_SetString(PyExc_ValueError,
3563 "nbytes is greater than the length of the buffer");
3564 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3568 if (readlen < 0) {
3569 PyBuffer_Release(&pbuf);
3570 /* Return an error */
3571 Py_XDECREF(addr);
3572 return NULL;
3573 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 PyBuffer_Release(&pbuf);
3576 /* Return the number of bytes read and the address. Note that we do
3577 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003578 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003579}
3580
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003581PyDoc_STRVAR(recvfrom_into_doc,
3582"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003583\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003584Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003585
Victor Stinner35bee932015-04-02 12:28:07 +02003586/* The sendmsg() and recvmsg[_into]() methods require a working
3587 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3588#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003589struct sock_recvmsg {
3590 struct msghdr *msg;
3591 int flags;
3592 ssize_t result;
3593};
3594
3595static int
3596sock_recvmsg_impl(PySocketSockObject *s, void *data)
3597{
3598 struct sock_recvmsg *ctx = data;
3599
3600 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3601 return (ctx->result >= 0);
3602}
3603
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003604/*
3605 * Call recvmsg() with the supplied iovec structures, flags, and
3606 * ancillary data buffer size (controllen). Returns the tuple return
3607 * value for recvmsg() or recvmsg_into(), with the first item provided
3608 * by the supplied makeval() function. makeval() will be called with
3609 * the length read and makeval_data as arguments, and must return a
3610 * new reference (which will be decrefed if there is a subsequent
3611 * error). On error, closes any file descriptors received via
3612 * SCM_RIGHTS.
3613 */
3614static PyObject *
3615sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3616 int flags, Py_ssize_t controllen,
3617 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3618{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003619 sock_addr_t addrbuf;
3620 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003621 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003622 PyObject *cmsg_list = NULL, *retval = NULL;
3623 void *controlbuf = NULL;
3624 struct cmsghdr *cmsgh;
3625 size_t cmsgdatalen = 0;
3626 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003627 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628
3629 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3630 ignored" when the socket is connected (Linux fills them in
3631 anyway for AF_UNIX sockets at least). Normally msg_namelen
3632 seems to be set to 0 if there's no address, but try to
3633 initialize msg_name to something that won't be mistaken for a
3634 real address if that doesn't happen. */
3635 if (!getsockaddrlen(s, &addrbuflen))
3636 return NULL;
3637 memset(&addrbuf, 0, addrbuflen);
3638 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3639
3640 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3641 PyErr_SetString(PyExc_ValueError,
3642 "invalid ancillary data buffer length");
3643 return NULL;
3644 }
3645 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3646 return PyErr_NoMemory();
3647
3648 /* Make the system call. */
3649 if (!IS_SELECTABLE(s)) {
3650 select_error();
3651 goto finally;
3652 }
3653
Victor Stinner31bf2d52015-04-01 21:57:09 +02003654 msg.msg_name = SAS2SA(&addrbuf);
3655 msg.msg_namelen = addrbuflen;
3656 msg.msg_iov = iov;
3657 msg.msg_iovlen = iovlen;
3658 msg.msg_control = controlbuf;
3659 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003660
Victor Stinner31bf2d52015-04-01 21:57:09 +02003661 ctx.msg = &msg;
3662 ctx.flags = flags;
3663 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003664 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003665
3666 /* Make list of (level, type, data) tuples from control messages. */
3667 if ((cmsg_list = PyList_New(0)) == NULL)
3668 goto err_closefds;
3669 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3670 implementations didn't do so. */
3671 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3672 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3673 PyObject *bytes, *tuple;
3674 int tmp;
3675
3676 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3677 if (cmsg_status != 0) {
3678 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3679 "received malformed or improperly-truncated "
3680 "ancillary data", 1) == -1)
3681 goto err_closefds;
3682 }
3683 if (cmsg_status < 0)
3684 break;
3685 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003686 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003687 goto err_closefds;
3688 }
3689
3690 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3691 cmsgdatalen);
3692 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3693 (int)cmsgh->cmsg_type, bytes);
3694 if (tuple == NULL)
3695 goto err_closefds;
3696 tmp = PyList_Append(cmsg_list, tuple);
3697 Py_DECREF(tuple);
3698 if (tmp != 0)
3699 goto err_closefds;
3700
3701 if (cmsg_status != 0)
3702 break;
3703 }
3704
3705 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003706 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003707 cmsg_list,
3708 (int)msg.msg_flags,
3709 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3710 ((msg.msg_namelen > addrbuflen) ?
3711 addrbuflen : msg.msg_namelen),
3712 s->sock_proto));
3713 if (retval == NULL)
3714 goto err_closefds;
3715
3716finally:
3717 Py_XDECREF(cmsg_list);
3718 PyMem_Free(controlbuf);
3719 return retval;
3720
3721err_closefds:
3722#ifdef SCM_RIGHTS
3723 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3724 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3725 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3726 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3727 if (cmsg_status < 0)
3728 break;
3729 if (cmsgh->cmsg_level == SOL_SOCKET &&
3730 cmsgh->cmsg_type == SCM_RIGHTS) {
3731 size_t numfds;
3732 int *fdp;
3733
3734 numfds = cmsgdatalen / sizeof(int);
3735 fdp = (int *)CMSG_DATA(cmsgh);
3736 while (numfds-- > 0)
3737 close(*fdp++);
3738 }
3739 if (cmsg_status != 0)
3740 break;
3741 }
3742#endif /* SCM_RIGHTS */
3743 goto finally;
3744}
3745
3746
3747static PyObject *
3748makeval_recvmsg(ssize_t received, void *data)
3749{
3750 PyObject **buf = data;
3751
3752 if (received < PyBytes_GET_SIZE(*buf))
3753 _PyBytes_Resize(buf, received);
3754 Py_XINCREF(*buf);
3755 return *buf;
3756}
3757
3758/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3759
3760static PyObject *
3761sock_recvmsg(PySocketSockObject *s, PyObject *args)
3762{
3763 Py_ssize_t bufsize, ancbufsize = 0;
3764 int flags = 0;
3765 struct iovec iov;
3766 PyObject *buf = NULL, *retval = NULL;
3767
3768 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3769 return NULL;
3770
3771 if (bufsize < 0) {
3772 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3773 return NULL;
3774 }
3775 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3776 return NULL;
3777 iov.iov_base = PyBytes_AS_STRING(buf);
3778 iov.iov_len = bufsize;
3779
3780 /* Note that we're passing a pointer to *our pointer* to the bytes
3781 object here (&buf); makeval_recvmsg() may incref the object, or
3782 deallocate it and set our pointer to NULL. */
3783 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3784 &makeval_recvmsg, &buf);
3785 Py_XDECREF(buf);
3786 return retval;
3787}
3788
3789PyDoc_STRVAR(recvmsg_doc,
3790"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3791\n\
3792Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3793socket. The ancbufsize argument sets the size in bytes of the\n\
3794internal buffer used to receive the ancillary data; it defaults to 0,\n\
3795meaning that no ancillary data will be received. Appropriate buffer\n\
3796sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3797CMSG_LEN(), and items which do not fit into the buffer might be\n\
3798truncated or discarded. The flags argument defaults to 0 and has the\n\
3799same meaning as for recv().\n\
3800\n\
3801The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3802The data item is a bytes object holding the non-ancillary data\n\
3803received. The ancdata item is a list of zero or more tuples\n\
3804(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3805(control messages) received: cmsg_level and cmsg_type are integers\n\
3806specifying the protocol level and protocol-specific type respectively,\n\
3807and cmsg_data is a bytes object holding the associated data. The\n\
3808msg_flags item is the bitwise OR of various flags indicating\n\
3809conditions on the received message; see your system documentation for\n\
3810details. If the receiving socket is unconnected, address is the\n\
3811address of the sending socket, if available; otherwise, its value is\n\
3812unspecified.\n\
3813\n\
3814If recvmsg() raises an exception after the system call returns, it\n\
3815will first attempt to close any file descriptors received via the\n\
3816SCM_RIGHTS mechanism.");
3817
3818
3819static PyObject *
3820makeval_recvmsg_into(ssize_t received, void *data)
3821{
3822 return PyLong_FromSsize_t(received);
3823}
3824
3825/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3826
3827static PyObject *
3828sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3829{
3830 Py_ssize_t ancbufsize = 0;
3831 int flags = 0;
3832 struct iovec *iovs = NULL;
3833 Py_ssize_t i, nitems, nbufs = 0;
3834 Py_buffer *bufs = NULL;
3835 PyObject *buffers_arg, *fast, *retval = NULL;
3836
3837 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3838 &buffers_arg, &ancbufsize, &flags))
3839 return NULL;
3840
3841 if ((fast = PySequence_Fast(buffers_arg,
3842 "recvmsg_into() argument 1 must be an "
3843 "iterable")) == NULL)
3844 return NULL;
3845 nitems = PySequence_Fast_GET_SIZE(fast);
3846 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003847 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003848 goto finally;
3849 }
3850
3851 /* Fill in an iovec for each item, and save the Py_buffer
3852 structs to release afterwards. */
3853 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3854 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3855 PyErr_NoMemory();
3856 goto finally;
3857 }
3858 for (; nbufs < nitems; nbufs++) {
3859 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3860 "w*;recvmsg_into() argument 1 must be an iterable "
3861 "of single-segment read-write buffers",
3862 &bufs[nbufs]))
3863 goto finally;
3864 iovs[nbufs].iov_base = bufs[nbufs].buf;
3865 iovs[nbufs].iov_len = bufs[nbufs].len;
3866 }
3867
3868 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3869 &makeval_recvmsg_into, NULL);
3870finally:
3871 for (i = 0; i < nbufs; i++)
3872 PyBuffer_Release(&bufs[i]);
3873 PyMem_Free(bufs);
3874 PyMem_Free(iovs);
3875 Py_DECREF(fast);
3876 return retval;
3877}
3878
3879PyDoc_STRVAR(recvmsg_into_doc,
3880"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3881\n\
3882Receive normal data and ancillary data from the socket, scattering the\n\
3883non-ancillary data into a series of buffers. The buffers argument\n\
3884must be an iterable of objects that export writable buffers\n\
3885(e.g. bytearray objects); these will be filled with successive chunks\n\
3886of the non-ancillary data until it has all been written or there are\n\
3887no more buffers. The ancbufsize argument sets the size in bytes of\n\
3888the internal buffer used to receive the ancillary data; it defaults to\n\
38890, meaning that no ancillary data will be received. Appropriate\n\
3890buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3891or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3892truncated or discarded. The flags argument defaults to 0 and has the\n\
3893same meaning as for recv().\n\
3894\n\
3895The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3896The nbytes item is the total number of bytes of non-ancillary data\n\
3897written into the buffers. The ancdata item is a list of zero or more\n\
3898tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3899data (control messages) received: cmsg_level and cmsg_type are\n\
3900integers specifying the protocol level and protocol-specific type\n\
3901respectively, and cmsg_data is a bytes object holding the associated\n\
3902data. The msg_flags item is the bitwise OR of various flags\n\
3903indicating conditions on the received message; see your system\n\
3904documentation for details. If the receiving socket is unconnected,\n\
3905address is the address of the sending socket, if available; otherwise,\n\
3906its value is unspecified.\n\
3907\n\
3908If recvmsg_into() raises an exception after the system call returns,\n\
3909it will first attempt to close any file descriptors received via the\n\
3910SCM_RIGHTS mechanism.");
3911#endif /* CMSG_LEN */
3912
3913
Victor Stinner31bf2d52015-04-01 21:57:09 +02003914struct sock_send {
3915 char *buf;
3916 Py_ssize_t len;
3917 int flags;
3918 Py_ssize_t result;
3919};
3920
3921static int
3922sock_send_impl(PySocketSockObject *s, void *data)
3923{
3924 struct sock_send *ctx = data;
3925
3926#ifdef MS_WINDOWS
3927 if (ctx->len > INT_MAX)
3928 ctx->len = INT_MAX;
3929 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3930#else
3931 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3932#endif
3933 return (ctx->result >= 0);
3934}
3935
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003936/* s.send(data [,flags]) 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_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003940{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003941 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003943 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3946 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 if (!IS_SELECTABLE(s)) {
3949 PyBuffer_Release(&pbuf);
3950 return select_error();
3951 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003952 ctx.buf = pbuf.buf;
3953 ctx.len = pbuf.len;
3954 ctx.flags = flags;
3955 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003956 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 return NULL;
3958 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003959 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003960
3961 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003962}
3963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003964PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003965"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003966\n\
3967Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003968argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003969sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003970
3971
3972/* s.sendall(data [,flags]) method */
3973
3974static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003975sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003978 Py_ssize_t len, n;
3979 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003981 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003982 int has_timeout = (s->sock_timeout > 0);
3983 _PyTime_t interval = s->sock_timeout;
3984 _PyTime_t deadline = 0;
3985 int deadline_initialized = 0;
3986 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3989 return NULL;
3990 buf = pbuf.buf;
3991 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 if (!IS_SELECTABLE(s)) {
3994 PyBuffer_Release(&pbuf);
3995 return select_error();
3996 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003999 if (has_timeout) {
4000 if (deadline_initialized) {
4001 /* recompute the timeout */
4002 interval = deadline - _PyTime_GetMonotonicClock();
4003 }
4004 else {
4005 deadline_initialized = 1;
4006 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4007 }
4008
4009 if (interval <= 0) {
4010 PyErr_SetString(socket_timeout, "timed out");
4011 goto done;
4012 }
4013 }
4014
Victor Stinner02f32ab2015-04-01 22:53:26 +02004015 ctx.buf = buf;
4016 ctx.len = len;
4017 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004018 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4019 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004020 n = ctx.result;
4021 assert(n >= 0);
4022
4023 buf += n;
4024 len -= n;
4025
4026 /* We must run our signal handlers before looping again.
4027 send() can return a successful partial write when it is
4028 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004029 if (PyErr_CheckSignals())
4030 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004031 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004033
Victor Stinner8912d142015-04-06 23:16:34 +02004034 Py_INCREF(Py_None);
4035 res = Py_None;
4036
4037done:
4038 PyBuffer_Release(&pbuf);
4039 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004040}
4041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004042PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004043"sendall(data[, flags])\n\
4044\n\
4045Send a data string to the socket. For the optional flags\n\
4046argument, see the Unix manual. This calls send() repeatedly\n\
4047until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004048to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004049
Guido van Rossum30a685f1991-06-27 15:51:29 +00004050
Victor Stinner31bf2d52015-04-01 21:57:09 +02004051struct sock_sendto {
4052 char *buf;
4053 Py_ssize_t len;
4054 int flags;
4055 int addrlen;
4056 sock_addr_t *addrbuf;
4057 Py_ssize_t result;
4058};
4059
4060static int
4061sock_sendto_impl(PySocketSockObject *s, void *data)
4062{
4063 struct sock_sendto *ctx = data;
4064
4065#ifdef MS_WINDOWS
4066 if (ctx->len > INT_MAX)
4067 ctx->len = INT_MAX;
4068 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4069 SAS2SA(ctx->addrbuf), ctx->addrlen);
4070#else
4071 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4072 SAS2SA(ctx->addrbuf), ctx->addrlen);
4073#endif
4074 return (ctx->result >= 0);
4075}
4076
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004077/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004078
Guido van Rossum73624e91994-10-10 17:59:00 +00004079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004080sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 Py_buffer pbuf;
4083 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004084 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004086 int addrlen, flags;
4087 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004090 arglen = PyTuple_Size(args);
4091 switch (arglen) {
4092 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004093 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4094 return NULL;
4095 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004096 break;
4097 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004098 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4099 &pbuf, &flags, &addro)) {
4100 return NULL;
4101 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004102 break;
4103 default:
4104 PyErr_Format(PyExc_TypeError,
4105 "sendto() takes 2 or 3 arguments (%d given)",
4106 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004107 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004108 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004110 if (!IS_SELECTABLE(s)) {
4111 PyBuffer_Release(&pbuf);
4112 return select_error();
4113 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4116 PyBuffer_Release(&pbuf);
4117 return NULL;
4118 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004119
Victor Stinner31bf2d52015-04-01 21:57:09 +02004120 ctx.buf = pbuf.buf;
4121 ctx.len = pbuf.len;
4122 ctx.flags = flags;
4123 ctx.addrlen = addrlen;
4124 ctx.addrbuf = &addrbuf;
4125 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004126 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 return NULL;
4128 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004129 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004130
4131 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004132}
4133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004134PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004135"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004136\n\
4137Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004138For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004139
Guido van Rossum30a685f1991-06-27 15:51:29 +00004140
Victor Stinner35bee932015-04-02 12:28:07 +02004141/* The sendmsg() and recvmsg[_into]() methods require a working
4142 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4143#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004144struct sock_sendmsg {
4145 struct msghdr *msg;
4146 int flags;
4147 ssize_t result;
4148};
4149
4150static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004151sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4152 struct msghdr *msg,
4153 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4154 Py_ssize_t ndataparts, ndatabufs = 0;
4155 int result = -1;
4156 struct iovec *iovs = NULL;
4157 PyObject *data_fast = NULL;
4158 Py_buffer *databufs = NULL;
4159
4160 /* Fill in an iovec for each message part, and save the Py_buffer
4161 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004162 data_fast = PySequence_Fast(data_arg,
4163 "sendmsg() argument 1 must be an "
4164 "iterable");
4165 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004166 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004167 }
4168
Christian Heimesdffa3942016-09-05 23:54:41 +02004169 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4170 if (ndataparts > INT_MAX) {
4171 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4172 goto finally;
4173 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004174
Christian Heimesdffa3942016-09-05 23:54:41 +02004175 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004176 if (ndataparts > 0) {
4177 iovs = PyMem_New(struct iovec, ndataparts);
4178 if (iovs == NULL) {
4179 PyErr_NoMemory();
4180 goto finally;
4181 }
4182 msg->msg_iov = iovs;
4183
4184 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004185 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004186 PyErr_NoMemory();
4187 goto finally;
4188 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004189 }
4190 for (; ndatabufs < ndataparts; ndatabufs++) {
4191 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4192 "y*;sendmsg() argument 1 must be an iterable of "
4193 "bytes-like objects",
4194 &databufs[ndatabufs]))
4195 goto finally;
4196 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4197 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4198 }
4199 result = 0;
4200 finally:
4201 *databufsout = databufs;
4202 *ndatabufsout = ndatabufs;
4203 Py_XDECREF(data_fast);
4204 return result;
4205}
4206
4207static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004208sock_sendmsg_impl(PySocketSockObject *s, void *data)
4209{
4210 struct sock_sendmsg *ctx = data;
4211
4212 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4213 return (ctx->result >= 0);
4214}
4215
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004216/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4217
4218static PyObject *
4219sock_sendmsg(PySocketSockObject *s, PyObject *args)
4220{
Christian Heimesdffa3942016-09-05 23:54:41 +02004221 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004222 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004223 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004224 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004225 struct cmsginfo {
4226 int level;
4227 int type;
4228 Py_buffer data;
4229 } *cmsgs = NULL;
4230 void *controlbuf = NULL;
4231 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004232 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004233 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004234 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004235 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004236
4237 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004238 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004240 }
4241
4242 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004243
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004244 /* Parse destination address. */
4245 if (addr_arg != NULL && addr_arg != Py_None) {
4246 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4247 goto finally;
4248 msg.msg_name = &addrbuf;
4249 msg.msg_namelen = addrlen;
4250 }
4251
4252 /* Fill in an iovec for each message part, and save the Py_buffer
4253 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004254 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004255 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004256 }
4257
4258 if (cmsg_arg == NULL)
4259 ncmsgs = 0;
4260 else {
4261 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4262 "sendmsg() argument 2 must be an "
4263 "iterable")) == NULL)
4264 goto finally;
4265 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4266 }
4267
4268#ifndef CMSG_SPACE
4269 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004270 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004271 "sending multiple control messages is not supported "
4272 "on this system");
4273 goto finally;
4274 }
4275#endif
4276 /* Save level, type and Py_buffer for each control message,
4277 and calculate total size. */
4278 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4279 PyErr_NoMemory();
4280 goto finally;
4281 }
4282 controllen = controllen_last = 0;
4283 while (ncmsgbufs < ncmsgs) {
4284 size_t bufsize, space;
4285
4286 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4287 "(iiy*):[sendmsg() ancillary data items]",
4288 &cmsgs[ncmsgbufs].level,
4289 &cmsgs[ncmsgbufs].type,
4290 &cmsgs[ncmsgbufs].data))
4291 goto finally;
4292 bufsize = cmsgs[ncmsgbufs++].data.len;
4293
4294#ifdef CMSG_SPACE
4295 if (!get_CMSG_SPACE(bufsize, &space)) {
4296#else
4297 if (!get_CMSG_LEN(bufsize, &space)) {
4298#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004299 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004300 goto finally;
4301 }
4302 controllen += space;
4303 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004304 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004305 goto finally;
4306 }
4307 controllen_last = controllen;
4308 }
4309
4310 /* Construct ancillary data block from control message info. */
4311 if (ncmsgbufs > 0) {
4312 struct cmsghdr *cmsgh = NULL;
4313
Victor Stinner52d61e42016-09-12 11:41:58 +02004314 controlbuf = PyMem_Malloc(controllen);
4315 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004316 PyErr_NoMemory();
4317 goto finally;
4318 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004319 msg.msg_control = controlbuf;
4320
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321 msg.msg_controllen = controllen;
4322
4323 /* Need to zero out the buffer as a workaround for glibc's
4324 CMSG_NXTHDR() implementation. After getting the pointer to
4325 the next header, it checks its (uninitialized) cmsg_len
4326 member to see if the "message" fits in the buffer, and
4327 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004328 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004329 memset(controlbuf, 0, controllen);
4330
4331 for (i = 0; i < ncmsgbufs; i++) {
4332 size_t msg_len, data_len = cmsgs[i].data.len;
4333 int enough_space = 0;
4334
4335 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4336 if (cmsgh == NULL) {
4337 PyErr_Format(PyExc_RuntimeError,
4338 "unexpected NULL result from %s()",
4339 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4340 goto finally;
4341 }
4342 if (!get_CMSG_LEN(data_len, &msg_len)) {
4343 PyErr_SetString(PyExc_RuntimeError,
4344 "item size out of range for CMSG_LEN()");
4345 goto finally;
4346 }
4347 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4348 size_t space;
4349
4350 cmsgh->cmsg_len = msg_len;
4351 if (get_cmsg_data_space(&msg, cmsgh, &space))
4352 enough_space = (space >= data_len);
4353 }
4354 if (!enough_space) {
4355 PyErr_SetString(PyExc_RuntimeError,
4356 "ancillary data does not fit in calculated "
4357 "space");
4358 goto finally;
4359 }
4360 cmsgh->cmsg_level = cmsgs[i].level;
4361 cmsgh->cmsg_type = cmsgs[i].type;
4362 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4363 }
4364 }
4365
4366 /* Make the system call. */
4367 if (!IS_SELECTABLE(s)) {
4368 select_error();
4369 goto finally;
4370 }
4371
Victor Stinner31bf2d52015-04-01 21:57:09 +02004372 ctx.msg = &msg;
4373 ctx.flags = flags;
4374 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004375 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004376
4377 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004378
4379finally:
4380 PyMem_Free(controlbuf);
4381 for (i = 0; i < ncmsgbufs; i++)
4382 PyBuffer_Release(&cmsgs[i].data);
4383 PyMem_Free(cmsgs);
4384 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004385 PyMem_Free(msg.msg_iov);
4386 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004387 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004388 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004390 return retval;
4391}
4392
4393PyDoc_STRVAR(sendmsg_doc,
4394"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4395\n\
4396Send normal and ancillary data to the socket, gathering the\n\
4397non-ancillary data from a series of buffers and concatenating it into\n\
4398a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004399data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004400The ancdata argument specifies the ancillary data (control messages)\n\
4401as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4402cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4403protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004404is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004405argument defaults to 0 and has the same meaning as for send(). If\n\
4406address is supplied and not None, it sets a destination address for\n\
4407the message. The return value is the number of bytes of non-ancillary\n\
4408data sent.");
4409#endif /* CMSG_LEN */
4410
Christian Heimesdffa3942016-09-05 23:54:41 +02004411#ifdef HAVE_SOCKADDR_ALG
4412static PyObject*
4413sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4414{
4415 PyObject *retval = NULL;
4416
4417 Py_ssize_t i, ndatabufs = 0;
4418 Py_buffer *databufs = NULL;
4419 PyObject *data_arg = NULL;
4420
4421 Py_buffer iv = {NULL, NULL};
4422
4423 PyObject *opobj = NULL;
4424 int op = -1;
4425
4426 PyObject *assoclenobj = NULL;
4427 int assoclen = -1;
4428
4429 unsigned int *uiptr;
4430 int flags = 0;
4431
4432 struct msghdr msg;
4433 struct cmsghdr *header = NULL;
4434 struct af_alg_iv *alg_iv = NULL;
4435 struct sock_sendmsg ctx;
4436 Py_ssize_t controllen;
4437 void *controlbuf = NULL;
4438 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4439
4440 if (self->sock_family != AF_ALG) {
4441 PyErr_SetString(PyExc_OSError,
4442 "algset is only supported for AF_ALG");
4443 return NULL;
4444 }
4445
4446 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4447 "|O$O!y*O!i:sendmsg_afalg", keywords,
4448 &data_arg,
4449 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004450 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004451 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004452 }
4453
4454 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004455
4456 /* op is a required, keyword-only argument >= 0 */
4457 if (opobj != NULL) {
4458 op = _PyLong_AsInt(opobj);
4459 }
4460 if (op < 0) {
4461 /* override exception from _PyLong_AsInt() */
4462 PyErr_SetString(PyExc_TypeError,
4463 "Invalid or missing argument 'op'");
4464 goto finally;
4465 }
4466 /* assoclen is optional but must be >= 0 */
4467 if (assoclenobj != NULL) {
4468 assoclen = _PyLong_AsInt(assoclenobj);
4469 if (assoclen == -1 && PyErr_Occurred()) {
4470 goto finally;
4471 }
4472 if (assoclen < 0) {
4473 PyErr_SetString(PyExc_TypeError,
4474 "assoclen must be positive");
4475 goto finally;
4476 }
4477 }
4478
4479 controllen = CMSG_SPACE(4);
4480 if (iv.buf != NULL) {
4481 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4482 }
4483 if (assoclen >= 0) {
4484 controllen += CMSG_SPACE(4);
4485 }
4486
4487 controlbuf = PyMem_Malloc(controllen);
4488 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004489 PyErr_NoMemory();
4490 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004491 }
4492 memset(controlbuf, 0, controllen);
4493
Christian Heimesdffa3942016-09-05 23:54:41 +02004494 msg.msg_controllen = controllen;
4495 msg.msg_control = controlbuf;
4496
4497 /* Fill in an iovec for each message part, and save the Py_buffer
4498 structs to release afterwards. */
4499 if (data_arg != NULL) {
4500 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4501 goto finally;
4502 }
4503 }
4504
4505 /* set operation to encrypt or decrypt */
4506 header = CMSG_FIRSTHDR(&msg);
4507 if (header == NULL) {
4508 PyErr_SetString(PyExc_RuntimeError,
4509 "unexpected NULL result from CMSG_FIRSTHDR");
4510 goto finally;
4511 }
4512 header->cmsg_level = SOL_ALG;
4513 header->cmsg_type = ALG_SET_OP;
4514 header->cmsg_len = CMSG_LEN(4);
4515 uiptr = (void*)CMSG_DATA(header);
4516 *uiptr = (unsigned int)op;
4517
4518 /* set initialization vector */
4519 if (iv.buf != NULL) {
4520 header = CMSG_NXTHDR(&msg, header);
4521 if (header == NULL) {
4522 PyErr_SetString(PyExc_RuntimeError,
4523 "unexpected NULL result from CMSG_NXTHDR(iv)");
4524 goto finally;
4525 }
4526 header->cmsg_level = SOL_ALG;
4527 header->cmsg_type = ALG_SET_IV;
4528 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4529 alg_iv = (void*)CMSG_DATA(header);
4530 alg_iv->ivlen = iv.len;
4531 memcpy(alg_iv->iv, iv.buf, iv.len);
4532 }
4533
4534 /* set length of associated data for AEAD */
4535 if (assoclen >= 0) {
4536 header = CMSG_NXTHDR(&msg, header);
4537 if (header == NULL) {
4538 PyErr_SetString(PyExc_RuntimeError,
4539 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4540 goto finally;
4541 }
4542 header->cmsg_level = SOL_ALG;
4543 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4544 header->cmsg_len = CMSG_LEN(4);
4545 uiptr = (void*)CMSG_DATA(header);
4546 *uiptr = (unsigned int)assoclen;
4547 }
4548
4549 ctx.msg = &msg;
4550 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004551 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004552 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004553 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004554
4555 retval = PyLong_FromSsize_t(ctx.result);
4556
4557 finally:
4558 PyMem_Free(controlbuf);
4559 if (iv.buf != NULL) {
4560 PyBuffer_Release(&iv);
4561 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004562 PyMem_Free(msg.msg_iov);
4563 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004564 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004565 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004566 PyMem_Free(databufs);
4567 return retval;
4568}
4569
4570PyDoc_STRVAR(sendmsg_afalg_doc,
4571"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4572\n\
4573Set operation mode, IV and length of associated data for an AF_ALG\n\
4574operation socket.");
4575#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004576
Guido van Rossum30a685f1991-06-27 15:51:29 +00004577/* s.shutdown(how) method */
4578
Guido van Rossum73624e91994-10-10 17:59:00 +00004579static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004580sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 int how;
4583 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004584
Serhiy Storchaka78980432013-01-15 01:12:17 +02004585 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 if (how == -1 && PyErr_Occurred())
4587 return NULL;
4588 Py_BEGIN_ALLOW_THREADS
4589 res = shutdown(s->sock_fd, how);
4590 Py_END_ALLOW_THREADS
4591 if (res < 0)
4592 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004593 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004594}
4595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004596PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004597"shutdown(flag)\n\
4598\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004599Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4600of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004601
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004602#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004603static PyObject*
4604sock_ioctl(PySocketSockObject *s, PyObject *arg)
4605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 unsigned long cmd = SIO_RCVALL;
4607 PyObject *argO;
4608 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4611 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 switch (cmd) {
4614 case SIO_RCVALL: {
4615 unsigned int option = RCVALL_ON;
4616 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4617 return NULL;
4618 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4619 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4620 return set_error();
4621 }
4622 return PyLong_FromUnsignedLong(recv); }
4623 case SIO_KEEPALIVE_VALS: {
4624 struct tcp_keepalive ka;
4625 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4626 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4627 return NULL;
4628 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4629 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4630 return set_error();
4631 }
4632 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004633#if defined(SIO_LOOPBACK_FAST_PATH)
4634 case SIO_LOOPBACK_FAST_PATH: {
4635 unsigned int option;
4636 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4637 return NULL;
4638 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4639 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4640 return set_error();
4641 }
4642 return PyLong_FromUnsignedLong(recv); }
4643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 default:
4645 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4646 return NULL;
4647 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004648}
4649PyDoc_STRVAR(sock_ioctl_doc,
4650"ioctl(cmd, option) -> long\n\
4651\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004652Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4653SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004654SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4655SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004656#endif
4657
4658#if defined(MS_WINDOWS)
4659static PyObject*
4660sock_share(PySocketSockObject *s, PyObject *arg)
4661{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004662 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004663 DWORD processId;
4664 int result;
4665
4666 if (!PyArg_ParseTuple(arg, "I", &processId))
4667 return NULL;
4668
4669 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004670 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004671 Py_END_ALLOW_THREADS
4672 if (result == SOCKET_ERROR)
4673 return set_error();
4674 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4675}
4676PyDoc_STRVAR(sock_share_doc,
4677"share(process_id) -> bytes\n\
4678\n\
4679Share the socket with another process. The target process id\n\
4680must be provided and the resulting bytes object passed to the target\n\
4681process. There the shared socket can be instantiated by calling\n\
4682socket.fromshare().");
4683
Christian Heimesfaf2f632008-01-06 16:59:19 +00004684
4685#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004686
4687/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004688
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004689static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4691 accept_doc},
4692 {"bind", (PyCFunction)sock_bind, METH_O,
4693 bind_doc},
4694 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004695 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 {"connect", (PyCFunction)sock_connect, METH_O,
4697 connect_doc},
4698 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4699 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004700 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4701 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4703 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004704#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 {"getpeername", (PyCFunction)sock_getpeername,
4706 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 {"getsockname", (PyCFunction)sock_getsockname,
4709 METH_NOARGS, getsockname_doc},
4710 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4711 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004712#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4714 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004715#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004716#if defined(MS_WINDOWS)
4717 {"share", (PyCFunction)sock_share, METH_VARARGS,
4718 sock_share_doc},
4719#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004720 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 listen_doc},
4722 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4723 recv_doc},
4724 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4725 recv_into_doc},
4726 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4727 recvfrom_doc},
4728 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4729 recvfrom_into_doc},
4730 {"send", (PyCFunction)sock_send, METH_VARARGS,
4731 send_doc},
4732 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4733 sendall_doc},
4734 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4735 sendto_doc},
4736 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4737 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004738 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4739 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4741 settimeout_doc},
4742 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4743 gettimeout_doc},
4744 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4745 setsockopt_doc},
4746 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4747 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004748#ifdef CMSG_LEN
4749 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4750 recvmsg_doc},
4751 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4752 recvmsg_into_doc,},
4753 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4754 sendmsg_doc},
4755#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004756#ifdef HAVE_SOCKADDR_ALG
4757 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4758 sendmsg_afalg_doc},
4759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004761};
4762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004763/* SockObject members */
4764static PyMemberDef sock_memberlist[] = {
4765 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4766 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4767 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004768 {0},
4769};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004770
Victor Stinner71694d52015-03-28 01:18:54 +01004771static PyGetSetDef sock_getsetlist[] = {
4772 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4773 {NULL} /* sentinel */
4774};
4775
Guido van Rossum73624e91994-10-10 17:59:00 +00004776/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004777 First close the file description. */
4778
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004779static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004780sock_finalize(PySocketSockObject *s)
4781{
4782 SOCKET_T fd;
4783 PyObject *error_type, *error_value, *error_traceback;
4784
4785 /* Save the current exception, if any. */
4786 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4787
Victor Stinnerd3afb622016-07-22 17:47:09 +02004788 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004789 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4790 /* Spurious errors can appear at shutdown */
4791 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4792 PyErr_WriteUnraisable((PyObject *)s);
4793 }
4794 }
4795
4796 /* Only close the socket *after* logging the ResourceWarning warning
4797 to allow the logger to call socket methods like
4798 socket.getsockname(). If the socket is closed before, socket
4799 methods fails with the EBADF error. */
4800 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004801 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004802
4803 /* We do not want to retry upon EINTR: see sock_close() */
4804 Py_BEGIN_ALLOW_THREADS
4805 (void) SOCKETCLOSE(fd);
4806 Py_END_ALLOW_THREADS
4807 }
4808
4809 /* Restore the saved exception. */
4810 PyErr_Restore(error_type, error_value, error_traceback);
4811}
4812
4813static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004814sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004815{
Victor Stinner19a8e842016-03-21 16:36:48 +01004816 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4817 return;
4818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004820}
4821
Guido van Rossum30a685f1991-06-27 15:51:29 +00004822
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004824sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004825{
Victor Stinnere254e532014-07-26 14:36:55 +02004826 long sock_fd;
4827 /* On Windows, this test is needed because SOCKET_T is unsigned */
4828 if (s->sock_fd == INVALID_SOCKET) {
4829 sock_fd = -1;
4830 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004831#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004832 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 /* this can occur on Win64, and actually there is a special
4834 ugly printf formatter for decimal pointer length integer
4835 printing, only bother if necessary*/
4836 PyErr_SetString(PyExc_OverflowError,
4837 "no printf formatter to display "
4838 "the socket descriptor in decimal");
4839 return NULL;
4840 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004841#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004842 else
4843 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 return PyUnicode_FromFormat(
4845 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004846 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 s->sock_type,
4848 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004849}
4850
4851
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004852/* Create a new, uninitialized socket object. */
4853
4854static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004855sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 new = type->tp_alloc(type, 0);
4860 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004861 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004862 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 ((PySocketSockObject *)new)->errorhandler = &set_error;
4864 }
4865 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004866}
4867
4868
4869/* Initialize a new socket object. */
4870
Victor Stinnerdaf45552013-08-28 00:53:59 +02004871#ifdef SOCK_CLOEXEC
4872/* socket() and socketpair() fail with EINVAL on Linux kernel older
4873 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4874static int sock_cloexec_works = -1;
4875#endif
4876
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004877/*ARGSUSED*/
4878static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004879sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 PySocketSockObject *s = (PySocketSockObject *)self;
4882 PyObject *fdobj = NULL;
4883 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004884 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004886#ifndef MS_WINDOWS
4887#ifdef SOCK_CLOEXEC
4888 int *atomic_flag_works = &sock_cloexec_works;
4889#else
4890 int *atomic_flag_works = NULL;
4891#endif
4892#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4895 "|iiiO:socket", keywords,
4896 &family, &type, &proto, &fdobj))
4897 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004900#ifdef MS_WINDOWS
4901 /* recreate a socket that was duplicated */
4902 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004903 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004904 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4905 PyErr_Format(PyExc_ValueError,
4906 "socket descriptor string has wrong size, "
4907 "should be %zu bytes.", sizeof(info));
4908 return -1;
4909 }
4910 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4911 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004912 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004913 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4914 Py_END_ALLOW_THREADS
4915 if (fd == INVALID_SOCKET) {
4916 set_error();
4917 return -1;
4918 }
4919 family = info.iAddressFamily;
4920 type = info.iSocketType;
4921 proto = info.iProtocol;
4922 }
4923 else
4924#endif
4925 {
4926 fd = PyLong_AsSocket_t(fdobj);
4927 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4928 return -1;
4929 if (fd == INVALID_SOCKET) {
4930 PyErr_SetString(PyExc_ValueError,
4931 "can't use invalid socket value");
4932 return -1;
4933 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004934
4935 if (family == -1) {
4936 sock_addr_t addrbuf;
4937 socklen_t addrlen = sizeof(sock_addr_t);
4938
4939 memset(&addrbuf, 0, addrlen);
4940 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4941 family = SAS2SA(&addrbuf)->sa_family;
4942 } else {
4943#ifdef MS_WINDOWS
4944 PyErr_SetFromWindowsErrWithFilename(0, "family");
4945#else
4946 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4947#endif
4948 return -1;
4949 }
4950 }
4951#ifdef SO_TYPE
4952 if (type == -1) {
4953 int tmp;
4954 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004955 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4956 (void *)&tmp, &slen) == 0)
4957 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004958 type = tmp;
4959 } else {
4960#ifdef MS_WINDOWS
4961 PyErr_SetFromWindowsErrWithFilename(0, "type");
4962#else
4963 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4964#endif
4965 return -1;
4966 }
4967 }
4968#else
4969 type = SOCK_STREAM;
4970#endif
4971#ifdef SO_PROTOCOL
4972 if (proto == -1) {
4973 int tmp;
4974 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004975 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4976 (void *)&tmp, &slen) == 0)
4977 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004978 proto = tmp;
4979 } else {
4980#ifdef MS_WINDOWS
4981 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4982#else
4983 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4984#endif
4985 return -1;
4986 }
4987 }
4988#else
4989 proto = 0;
4990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 }
4992 }
4993 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004994 /* No fd, default to AF_INET and SOCK_STREAM */
4995 if (family == -1) {
4996 family = AF_INET;
4997 }
4998 if (type == -1) {
4999 type = SOCK_STREAM;
5000 }
5001 if (proto == -1) {
5002 proto = 0;
5003 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005004#ifdef MS_WINDOWS
5005 /* Windows implementation */
5006#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5007#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5008#endif
5009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005011 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005012 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005013 NULL, 0,
5014 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5015 if (fd == INVALID_SOCKET) {
5016 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5017 support_wsa_no_inherit = 0;
5018 fd = socket(family, type, proto);
5019 }
5020 }
5021 else {
5022 fd = socket(family, type, proto);
5023 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 if (fd == INVALID_SOCKET) {
5027 set_error();
5028 return -1;
5029 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005030
5031 if (!support_wsa_no_inherit) {
5032 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5033 closesocket(fd);
5034 PyErr_SetFromWindowsErr(0);
5035 return -1;
5036 }
5037 }
5038#else
5039 /* UNIX */
5040 Py_BEGIN_ALLOW_THREADS
5041#ifdef SOCK_CLOEXEC
5042 if (sock_cloexec_works != 0) {
5043 fd = socket(family, type | SOCK_CLOEXEC, proto);
5044 if (sock_cloexec_works == -1) {
5045 if (fd >= 0) {
5046 sock_cloexec_works = 1;
5047 }
5048 else if (errno == EINVAL) {
5049 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5050 sock_cloexec_works = 0;
5051 fd = socket(family, type, proto);
5052 }
5053 }
5054 }
5055 else
5056#endif
5057 {
5058 fd = socket(family, type, proto);
5059 }
5060 Py_END_ALLOW_THREADS
5061
5062 if (fd == INVALID_SOCKET) {
5063 set_error();
5064 return -1;
5065 }
5066
5067 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5068 SOCKETCLOSE(fd);
5069 return -1;
5070 }
5071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005073 if (init_sockobject(s, fd, family, type, proto) == -1) {
5074 SOCKETCLOSE(fd);
5075 return -1;
5076 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005080}
5081
5082
Guido van Rossumb6775db1994-08-01 11:34:53 +00005083/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005084
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005085static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5087 "_socket.socket", /* tp_name */
5088 sizeof(PySocketSockObject), /* tp_basicsize */
5089 0, /* tp_itemsize */
5090 (destructor)sock_dealloc, /* tp_dealloc */
5091 0, /* tp_print */
5092 0, /* tp_getattr */
5093 0, /* tp_setattr */
5094 0, /* tp_reserved */
5095 (reprfunc)sock_repr, /* tp_repr */
5096 0, /* tp_as_number */
5097 0, /* tp_as_sequence */
5098 0, /* tp_as_mapping */
5099 0, /* tp_hash */
5100 0, /* tp_call */
5101 0, /* tp_str */
5102 PyObject_GenericGetAttr, /* tp_getattro */
5103 0, /* tp_setattro */
5104 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005105 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5106 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 sock_doc, /* tp_doc */
5108 0, /* tp_traverse */
5109 0, /* tp_clear */
5110 0, /* tp_richcompare */
5111 0, /* tp_weaklistoffset */
5112 0, /* tp_iter */
5113 0, /* tp_iternext */
5114 sock_methods, /* tp_methods */
5115 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005116 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 0, /* tp_base */
5118 0, /* tp_dict */
5119 0, /* tp_descr_get */
5120 0, /* tp_descr_set */
5121 0, /* tp_dictoffset */
5122 sock_initobj, /* tp_init */
5123 PyType_GenericAlloc, /* tp_alloc */
5124 sock_new, /* tp_new */
5125 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005126 0, /* tp_is_gc */
5127 0, /* tp_bases */
5128 0, /* tp_mro */
5129 0, /* tp_cache */
5130 0, /* tp_subclasses */
5131 0, /* tp_weaklist */
5132 0, /* tp_del */
5133 0, /* tp_version_tag */
5134 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005135};
5136
Guido van Rossum30a685f1991-06-27 15:51:29 +00005137
Guido van Rossum81194471991-07-27 21:42:02 +00005138/* Python interface to gethostname(). */
5139
5140/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005141static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005142socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005143{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005144#ifdef MS_WINDOWS
5145 /* Don't use winsock's gethostname, as this returns the ANSI
5146 version of the hostname, whereas we need a Unicode string.
5147 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005148 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005149 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005150 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005151 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005152
5153 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005154 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005155
5156 if (GetLastError() != ERROR_MORE_DATA)
5157 return PyErr_SetFromWindowsErr(0);
5158
5159 if (size == 0)
5160 return PyUnicode_New(0, 0);
5161
5162 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5163 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005164 name = PyMem_New(wchar_t, size);
5165 if (!name) {
5166 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005167 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005168 }
Victor Stinner74168972011-11-17 01:11:36 +01005169 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5170 name,
5171 &size))
5172 {
5173 PyMem_Free(name);
5174 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005175 }
Victor Stinner74168972011-11-17 01:11:36 +01005176
5177 result = PyUnicode_FromWideChar(name, size);
5178 PyMem_Free(name);
5179 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005180#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 char buf[1024];
5182 int res;
5183 Py_BEGIN_ALLOW_THREADS
5184 res = gethostname(buf, (int) sizeof buf - 1);
5185 Py_END_ALLOW_THREADS
5186 if (res < 0)
5187 return set_error();
5188 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005189 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005190#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005191}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005193PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005194"gethostname() -> string\n\
5195\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005196Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005197
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005198#ifdef HAVE_SETHOSTNAME
5199PyDoc_STRVAR(sethostname_doc,
5200"sethostname(name)\n\n\
5201Sets the hostname to name.");
5202
5203static PyObject *
5204socket_sethostname(PyObject *self, PyObject *args)
5205{
5206 PyObject *hnobj;
5207 Py_buffer buf;
5208 int res, flag = 0;
5209
Christian Heimesd2774c72013-06-19 02:06:29 +02005210#ifdef _AIX
5211/* issue #18259, not declared in any useful header file */
5212extern int sethostname(const char *, size_t);
5213#endif
5214
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005215 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5216 PyErr_Clear();
5217 if (!PyArg_ParseTuple(args, "O&:sethostname",
5218 PyUnicode_FSConverter, &hnobj))
5219 return NULL;
5220 flag = 1;
5221 }
5222 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5223 if (!res) {
5224 res = sethostname(buf.buf, buf.len);
5225 PyBuffer_Release(&buf);
5226 }
5227 if (flag)
5228 Py_DECREF(hnobj);
5229 if (res)
5230 return set_error();
5231 Py_RETURN_NONE;
5232}
5233#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005234
Guido van Rossum30a685f1991-06-27 15:51:29 +00005235/* Python interface to gethostbyname(name). */
5236
5237/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005239socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 char *name;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005242 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005243 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005244
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005245 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 return NULL;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005247 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005248 goto finally;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005249 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005250finally:
5251 PyMem_Free(name);
5252 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005253}
5254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005255PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005256"gethostbyname(host) -> address\n\
5257\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005258Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005259
5260
Victor Stinner72400302016-01-28 15:41:01 +01005261static PyObject*
5262sock_decode_hostname(const char *name)
5263{
5264#ifdef MS_WINDOWS
5265 /* Issue #26227: gethostbyaddr() returns a string encoded
5266 * to the ANSI code page */
5267 return PyUnicode_DecodeFSDefault(name);
5268#else
5269 /* Decode from UTF-8 */
5270 return PyUnicode_FromString(name);
5271#endif
5272}
5273
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005274/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5275
5276static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005277gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 char **pch;
5280 PyObject *rtn_tuple = (PyObject *)NULL;
5281 PyObject *name_list = (PyObject *)NULL;
5282 PyObject *addr_list = (PyObject *)NULL;
5283 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005284 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 if (h == NULL) {
5287 /* Let's get real error message to return */
5288 set_herror(h_errno);
5289 return NULL;
5290 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 if (h->h_addrtype != af) {
5293 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005294 errno = EAFNOSUPPORT;
5295 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 return NULL;
5297 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 case AF_INET:
5302 if (alen < sizeof(struct sockaddr_in))
5303 return NULL;
5304 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005305
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005306#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 case AF_INET6:
5308 if (alen < sizeof(struct sockaddr_in6))
5309 return NULL;
5310 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005311#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 if ((name_list = PyList_New(0)) == NULL)
5316 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 if ((addr_list = PyList_New(0)) == NULL)
5319 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 /* SF #1511317: h_aliases can be NULL */
5322 if (h->h_aliases) {
5323 for (pch = h->h_aliases; *pch != NULL; pch++) {
5324 int status;
5325 tmp = PyUnicode_FromString(*pch);
5326 if (tmp == NULL)
5327 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 status = PyList_Append(name_list, tmp);
5330 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 if (status)
5333 goto err;
5334 }
5335 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5338 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 case AF_INET:
5343 {
5344 struct sockaddr_in sin;
5345 memset(&sin, 0, sizeof(sin));
5346 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005347#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005351 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 if (pch == h->h_addr_list && alen >= sizeof(sin))
5354 memcpy((char *) addr, &sin, sizeof(sin));
5355 break;
5356 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005357
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005358#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 case AF_INET6:
5360 {
5361 struct sockaddr_in6 sin6;
5362 memset(&sin6, 0, sizeof(sin6));
5363 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005368 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5371 memcpy((char *) addr, &sin6, sizeof(sin6));
5372 break;
5373 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005374#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005377 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 "unsupported address family");
5379 return NULL;
5380 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 if (tmp == NULL)
5383 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 status = PyList_Append(addr_list, tmp);
5386 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 if (status)
5389 goto err;
5390 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005391
Victor Stinner72400302016-01-28 15:41:01 +01005392 name = sock_decode_hostname(h->h_name);
5393 if (name == NULL)
5394 goto err;
5395 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005396
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005397 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 Py_XDECREF(name_list);
5399 Py_XDECREF(addr_list);
5400 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005401}
5402
5403
5404/* Python interface to gethostbyname_ex(name). */
5405
5406/*ARGSUSED*/
5407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005408socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 char *name;
5411 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005412 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005414 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005415#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005417#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005419#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 char buf[16384];
5421 int buf_len = (sizeof buf) - 1;
5422 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005423#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005424#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005426#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005427#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005428
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005429 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005431 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005432 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005434#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005435#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005436 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005438#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005440#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 memset((void *) &data, '\0', sizeof(data));
5442 result = gethostbyname_r(name, &hp_allocated, &data);
5443 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005444#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005445#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005446#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005448#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005449 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005451#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 Py_END_ALLOW_THREADS
5453 /* Some C libraries would require addr.__ss_family instead of
5454 addr.ss_family.
5455 Therefore, we cast the sockaddr_storage into sockaddr to
5456 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005457 sa = SAS2SA(&addr);
5458 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005460#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005462#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005463finally:
5464 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005466}
5467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005468PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005469"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5470\n\
5471Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005472for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005473
5474
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005475/* Python interface to gethostbyaddr(IP). */
5476
5477/*ARGSUSED*/
5478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005479socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005480{
Charles-François Natali8b759652011-12-23 16:44:51 +01005481 sock_addr_t addr;
5482 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 char *ip_num;
5484 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005485 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005486#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005488#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005490#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 /* glibcs up to 2.10 assume that the buf argument to
5492 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5493 does not ensure. The attribute below instructs the compiler
5494 to maintain this alignment. */
5495 char buf[16384] Py_ALIGNED(8);
5496 int buf_len = (sizeof buf) - 1;
5497 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005498#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005499#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005501#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005502#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005503 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 int al;
5505 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005506
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005507 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 return NULL;
5509 af = AF_UNSPEC;
5510 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005511 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 af = sa->sa_family;
5513 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005514 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 switch (af) {
5516 case AF_INET:
5517 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5518 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5519 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005520#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 case AF_INET6:
5522 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5523 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5524 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005527 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005528 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 }
5530 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005531#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005532#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005533 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 &hp_allocated, buf, buf_len,
5535 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005536#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 h = gethostbyaddr_r(ap, al, af,
5538 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005539#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 memset((void *) &data, '\0', sizeof(data));
5541 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5542 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005543#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005544#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005545#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005547#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005548 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005550#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005552 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005553#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005555#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005556finally:
5557 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005559}
5560
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005561PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005562"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5563\n\
5564Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005565for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005566
Guido van Rossum30a685f1991-06-27 15:51:29 +00005567
5568/* Python interface to getservbyname(name).
5569 This only returns the port number, since the other info is already
5570 known or not useful (like the list of aliases). */
5571
5572/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005574socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005575{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005576 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 struct servent *sp;
5578 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5579 return NULL;
5580 Py_BEGIN_ALLOW_THREADS
5581 sp = getservbyname(name, proto);
5582 Py_END_ALLOW_THREADS
5583 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005584 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 return NULL;
5586 }
5587 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005588}
5589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005590PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005591"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005592\n\
5593Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005594The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5595otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005596
Guido van Rossum30a685f1991-06-27 15:51:29 +00005597
Barry Warsaw11b91a02004-06-28 00:50:43 +00005598/* Python interface to getservbyport(port).
5599 This only returns the service name, since the other info is already
5600 known or not useful (like the list of aliases). */
5601
5602/*ARGSUSED*/
5603static PyObject *
5604socket_getservbyport(PyObject *self, PyObject *args)
5605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005607 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 struct servent *sp;
5609 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5610 return NULL;
5611 if (port < 0 || port > 0xffff) {
5612 PyErr_SetString(
5613 PyExc_OverflowError,
5614 "getservbyport: port must be 0-65535.");
5615 return NULL;
5616 }
5617 Py_BEGIN_ALLOW_THREADS
5618 sp = getservbyport(htons((short)port), proto);
5619 Py_END_ALLOW_THREADS
5620 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005621 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 return NULL;
5623 }
5624 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005625}
5626
5627PyDoc_STRVAR(getservbyport_doc,
5628"getservbyport(port[, protocolname]) -> string\n\
5629\n\
5630Return the service name from a port number and protocol name.\n\
5631The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5632otherwise any protocol will match.");
5633
Guido van Rossum3901d851996-12-19 16:35:04 +00005634/* Python interface to getprotobyname(name).
5635 This only returns the protocol number, since the other info is
5636 already known or not useful (like the list of aliases). */
5637
5638/*ARGSUSED*/
5639static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005640socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005641{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005642 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 struct protoent *sp;
5644 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5645 return NULL;
5646 Py_BEGIN_ALLOW_THREADS
5647 sp = getprotobyname(name);
5648 Py_END_ALLOW_THREADS
5649 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005650 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 return NULL;
5652 }
5653 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005654}
5655
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005656PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005657"getprotobyname(name) -> integer\n\
5658\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005659Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005660
Christian Heimesd0e31b92018-01-27 09:54:13 +01005661static PyObject *
5662socket_close(PyObject *self, PyObject *fdobj)
5663{
5664 SOCKET_T fd;
5665 int res;
5666
5667 fd = PyLong_AsSocket_t(fdobj);
5668 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5669 return NULL;
5670 Py_BEGIN_ALLOW_THREADS
5671 res = SOCKETCLOSE(fd);
5672 Py_END_ALLOW_THREADS
5673 /* bpo-30319: The peer can already have closed the connection.
5674 Python ignores ECONNRESET on close(). */
5675 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5676 return set_error();
5677 }
5678 Py_RETURN_NONE;
5679}
5680
5681PyDoc_STRVAR(close_doc,
5682"close(integer) -> None\n\
5683\n\
5684Close an integer socket file descriptor. This is like os.close(), but for\n\
5685sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005686
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005687#ifndef NO_DUP
5688/* dup() function for socket fds */
5689
5690static PyObject *
5691socket_dup(PyObject *self, PyObject *fdobj)
5692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 SOCKET_T fd, newfd;
5694 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005695#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005696 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005697#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 fd = PyLong_AsSocket_t(fdobj);
5700 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5701 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005702
Victor Stinnerdaf45552013-08-28 00:53:59 +02005703#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005704 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005705 return set_error();
5706
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005707 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005708 FROM_PROTOCOL_INFO,
5709 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 if (newfd == INVALID_SOCKET)
5711 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005712
Victor Stinnerdaf45552013-08-28 00:53:59 +02005713 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5714 closesocket(newfd);
5715 PyErr_SetFromWindowsErr(0);
5716 return NULL;
5717 }
5718#else
5719 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5720 newfd = _Py_dup(fd);
5721 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005722 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005723#endif
5724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 newfdobj = PyLong_FromSocket_t(newfd);
5726 if (newfdobj == NULL)
5727 SOCKETCLOSE(newfd);
5728 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005729}
5730
5731PyDoc_STRVAR(dup_doc,
5732"dup(integer) -> integer\n\
5733\n\
5734Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5735sockets; on some platforms os.dup() won't work for socket file descriptors.");
5736#endif
5737
5738
Dave Cole331708b2004-08-09 04:51:41 +00005739#ifdef HAVE_SOCKETPAIR
5740/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005741 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005742 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005743
5744/*ARGSUSED*/
5745static PyObject *
5746socket_socketpair(PyObject *self, PyObject *args)
5747{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 PySocketSockObject *s0 = NULL, *s1 = NULL;
5749 SOCKET_T sv[2];
5750 int family, type = SOCK_STREAM, proto = 0;
5751 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005752#ifdef SOCK_CLOEXEC
5753 int *atomic_flag_works = &sock_cloexec_works;
5754#else
5755 int *atomic_flag_works = NULL;
5756#endif
5757 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005758
5759#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005761#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5765 &family, &type, &proto))
5766 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005769 Py_BEGIN_ALLOW_THREADS
5770#ifdef SOCK_CLOEXEC
5771 if (sock_cloexec_works != 0) {
5772 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5773 if (sock_cloexec_works == -1) {
5774 if (ret >= 0) {
5775 sock_cloexec_works = 1;
5776 }
5777 else if (errno == EINVAL) {
5778 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5779 sock_cloexec_works = 0;
5780 ret = socketpair(family, type, proto, sv);
5781 }
5782 }
5783 }
5784 else
5785#endif
5786 {
5787 ret = socketpair(family, type, proto, sv);
5788 }
5789 Py_END_ALLOW_THREADS
5790
5791 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005793
5794 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5795 goto finally;
5796 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5797 goto finally;
5798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 s0 = new_sockobject(sv[0], family, type, proto);
5800 if (s0 == NULL)
5801 goto finally;
5802 s1 = new_sockobject(sv[1], family, type, proto);
5803 if (s1 == NULL)
5804 goto finally;
5805 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005806
5807finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 if (res == NULL) {
5809 if (s0 == NULL)
5810 SOCKETCLOSE(sv[0]);
5811 if (s1 == NULL)
5812 SOCKETCLOSE(sv[1]);
5813 }
5814 Py_XDECREF(s0);
5815 Py_XDECREF(s1);
5816 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005817}
5818
5819PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005820"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005821\n\
5822Create a pair of socket objects from the sockets returned by the platform\n\
5823socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005824The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005825AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005826
5827#endif /* HAVE_SOCKETPAIR */
5828
5829
Guido van Rossum006bf911996-06-12 04:04:55 +00005830static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005831socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005832{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005833 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005834
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005835 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 return NULL;
5837 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005838 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005840 "ntohs: can't convert negative Python int to C "
5841 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 return NULL;
5843 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005844 if (x > 0xffff) {
5845 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5846 "ntohs: Python int too large to convert to C "
5847 "16-bit unsigned integer (The silent truncation "
5848 "is deprecated)",
5849 1)) {
5850 return NULL;
5851 }
5852 }
5853 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005854}
5855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005856PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005857"ntohs(integer) -> integer\n\
5858\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005859Convert a 16-bit unsigned integer from network to host byte order.\n\
5860Note that in case the received integer does not fit in 16-bit unsigned\n\
5861integer, but does fit in a positive C int, it is silently truncated to\n\
586216-bit unsigned integer.\n\
5863However, this silent truncation feature is deprecated, and will raise an \n\
5864exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005865
5866
Guido van Rossum006bf911996-06-12 04:04:55 +00005867static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005868socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 if (PyLong_Check(arg)) {
5873 x = PyLong_AsUnsignedLong(arg);
5874 if (x == (unsigned long) -1 && PyErr_Occurred())
5875 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005876#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 {
5878 unsigned long y;
5879 /* only want the trailing 32 bits */
5880 y = x & 0xFFFFFFFFUL;
5881 if (y ^ x)
5882 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005883 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 x = y;
5885 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 }
5888 else
5889 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005890 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005893}
5894
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005895PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005896"ntohl(integer) -> integer\n\
5897\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005898Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005899
5900
Guido van Rossum006bf911996-06-12 04:04:55 +00005901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005902socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005903{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005904 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005905
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005906 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 return NULL;
5908 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005909 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005911 "htons: can't convert negative Python int to C "
5912 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 return NULL;
5914 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005915 if (x > 0xffff) {
5916 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5917 "htons: Python int too large to convert to C "
5918 "16-bit unsigned integer (The silent truncation "
5919 "is deprecated)",
5920 1)) {
5921 return NULL;
5922 }
5923 }
5924 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005925}
5926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005927PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005928"htons(integer) -> integer\n\
5929\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005930Convert a 16-bit unsigned integer from host to network byte order.\n\
5931Note that in case the received integer does not fit in 16-bit unsigned\n\
5932integer, but does fit in a positive C int, it is silently truncated to\n\
593316-bit unsigned integer.\n\
5934However, this silent truncation feature is deprecated, and will raise an \n\
5935exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005936
5937
Guido van Rossum006bf911996-06-12 04:04:55 +00005938static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005939socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 if (PyLong_Check(arg)) {
5944 x = PyLong_AsUnsignedLong(arg);
5945 if (x == (unsigned long) -1 && PyErr_Occurred())
5946 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005947#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 {
5949 unsigned long y;
5950 /* only want the trailing 32 bits */
5951 y = x & 0xFFFFFFFFUL;
5952 if (y ^ x)
5953 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005954 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 x = y;
5956 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 }
5959 else
5960 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005961 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 Py_TYPE(arg)->tp_name);
5963 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005964}
5965
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005966PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005967"htonl(integer) -> integer\n\
5968\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005969Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005970
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005971/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005972
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005973PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005974"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005975\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005976Convert 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 +00005977binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005978
5979static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005980socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005981{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005982#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005984#endif
5985
5986#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005987#if (SIZEOF_INT != 4)
5988#error "Not sure if in_addr_t exists and int is not 32-bits."
5989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 /* Have to use inet_addr() instead */
5991 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005992#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005993 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5996 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005997
Tim Peters1df9fdd2003-02-13 03:13:40 +00005998
5999#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006000
6001#ifdef USE_INET_ATON_WEAKLINK
6002 if (inet_aton != NULL) {
6003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 if (inet_aton(ip_addr, &buf))
6005 return PyBytes_FromStringAndSize((char *)(&buf),
6006 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006007
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006008 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 "illegal IP address string passed to inet_aton");
6010 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006011
Thomas Wouters477c8d52006-05-27 19:21:47 +00006012#ifdef USE_INET_ATON_WEAKLINK
6013 } else {
6014#endif
6015
6016#endif
6017
6018#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 /* special-case this address as inet_addr might return INADDR_NONE
6021 * for this */
6022 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006023 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006025
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006026 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006030 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 "illegal IP address string passed to inet_aton");
6032 return NULL;
6033 }
6034 }
6035 return PyBytes_FromStringAndSize((char *) &packed_addr,
6036 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006037
6038#ifdef USE_INET_ATON_WEAKLINK
6039 }
6040#endif
6041
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006042#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006043}
6044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006045PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006046"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006047\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006048Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006049
6050static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006051socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006052{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006053 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006055
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006056 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 return NULL;
6058 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006059
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006060 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006061 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006063 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 return NULL;
6065 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006066
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006067 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6068 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006069
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006070 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006072}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006073
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006074#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006075
6076PyDoc_STRVAR(inet_pton_doc,
6077"inet_pton(af, ip) -> packed IP address string\n\
6078\n\
6079Convert an IP address from string format to a packed string suitable\n\
6080for use with low-level network functions.");
6081
6082static PyObject *
6083socket_inet_pton(PyObject *self, PyObject *args)
6084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006086 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006088#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006089 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006090#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6094 return NULL;
6095 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006096
Martin v. Löwis04697e82004-06-02 12:35:29 +00006097#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006099 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 "can't use AF_INET6, IPv6 is disabled");
6101 return NULL;
6102 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006103#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 retval = inet_pton(af, ip, packed);
6106 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006107 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 return NULL;
6109 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006110 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 "illegal IP address string passed to inet_pton");
6112 return NULL;
6113 } else if (af == AF_INET) {
6114 return PyBytes_FromStringAndSize(packed,
6115 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006116#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 } else if (af == AF_INET6) {
6118 return PyBytes_FromStringAndSize(packed,
6119 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006122 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 return NULL;
6124 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006125}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006126
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006127PyDoc_STRVAR(inet_ntop_doc,
6128"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6129\n\
6130Convert a packed IP address of the given family to string format.");
6131
6132static PyObject *
6133socket_inet_ntop(PyObject *self, PyObject *args)
6134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006136 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006138#ifdef ENABLE_IPV6
Miss Islington (bot)04425992018-02-12 12:12:24 -08006139 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006140#else
Miss Islington (bot)04425992018-02-12 12:12:24 -08006141 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006142#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006143
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006144 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 return NULL;
6146 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006149 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 PyErr_SetString(PyExc_ValueError,
6151 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006152 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 return NULL;
6154 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006155#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006157 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 PyErr_SetString(PyExc_ValueError,
6159 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006160 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 return NULL;
6162 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 } else {
6165 PyErr_Format(PyExc_ValueError,
6166 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006167 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 return NULL;
6169 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006170
Miss Islington (bot)04425992018-02-12 12:12:24 -08006171 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006172 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6173 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006175 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 return NULL;
6177 } else {
6178 return PyUnicode_FromString(retval);
6179 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006180}
6181
6182#endif /* HAVE_INET_PTON */
6183
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006184/* Python interface to getaddrinfo(host, port). */
6185
6186/*ARGSUSED*/
6187static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006188socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006189{
Victor Stinner77af1722011-05-26 14:05:59 +02006190 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006191 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 struct addrinfo hints, *res;
6193 struct addrinfo *res0 = NULL;
6194 PyObject *hobj = NULL;
6195 PyObject *pobj = (PyObject *)NULL;
6196 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006197 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 int family, socktype, protocol, flags;
6199 int error;
6200 PyObject *all = (PyObject *)NULL;
6201 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006202
Georg Brandl6083a4b2013-10-14 06:51:46 +02006203 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006205 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006206 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 &protocol, &flags)) {
6208 return NULL;
6209 }
6210 if (hobj == Py_None) {
6211 hptr = NULL;
6212 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006213 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 if (!idna)
6215 return NULL;
6216 assert(PyBytes_Check(idna));
6217 hptr = PyBytes_AS_STRING(idna);
6218 } else if (PyBytes_Check(hobj)) {
6219 hptr = PyBytes_AsString(hobj);
6220 } else {
6221 PyErr_SetString(PyExc_TypeError,
6222 "getaddrinfo() argument 1 must be string or None");
6223 return NULL;
6224 }
6225 if (PyLong_CheckExact(pobj)) {
6226 long value = PyLong_AsLong(pobj);
6227 if (value == -1 && PyErr_Occurred())
6228 goto err;
6229 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6230 pptr = pbuf;
6231 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006232 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006233 if (pptr == NULL)
6234 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006236 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 } else if (pobj == Py_None) {
6238 pptr = (char *)NULL;
6239 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006240 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 goto err;
6242 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006243#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006244 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006245 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006246 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6247 * This workaround avoids a segfault in libsystem.
6248 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006249 pptr = "00";
6250 }
6251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 memset(&hints, 0, sizeof(hints));
6253 hints.ai_family = family;
6254 hints.ai_socktype = socktype;
6255 hints.ai_protocol = protocol;
6256 hints.ai_flags = flags;
6257 Py_BEGIN_ALLOW_THREADS
6258 ACQUIRE_GETADDRINFO_LOCK
6259 error = getaddrinfo(hptr, pptr, &hints, &res0);
6260 Py_END_ALLOW_THREADS
6261 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6262 if (error) {
6263 set_gaierror(error);
6264 goto err;
6265 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006266
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006267 all = PyList_New(0);
6268 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 goto err;
6270 for (res = res0; res; res = res->ai_next) {
6271 PyObject *single;
6272 PyObject *addr =
6273 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6274 if (addr == NULL)
6275 goto err;
6276 single = Py_BuildValue("iiisO", res->ai_family,
6277 res->ai_socktype, res->ai_protocol,
6278 res->ai_canonname ? res->ai_canonname : "",
6279 addr);
6280 Py_DECREF(addr);
6281 if (single == NULL)
6282 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006283
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006284 if (PyList_Append(all, single)) {
6285 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 goto err;
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006287 }
6288 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289 }
6290 Py_XDECREF(idna);
6291 if (res0)
6292 freeaddrinfo(res0);
6293 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006294 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 Py_XDECREF(all);
6296 Py_XDECREF(idna);
6297 if (res0)
6298 freeaddrinfo(res0);
6299 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006300}
6301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006302PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006303"getaddrinfo(host, port [, family, type, proto, flags])\n\
6304 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006305\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006306Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006307
6308/* Python interface to getnameinfo(sa, flags). */
6309
6310/*ARGSUSED*/
6311static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006312socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 PyObject *sa = (PyObject *)NULL;
6315 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006316 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006317 int port;
6318 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6320 struct addrinfo hints, *res = NULL;
6321 int error;
6322 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006323 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 flags = flowinfo = scope_id = 0;
6326 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6327 return NULL;
6328 if (!PyTuple_Check(sa)) {
6329 PyErr_SetString(PyExc_TypeError,
6330 "getnameinfo() argument 1 must be a tuple");
6331 return NULL;
6332 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006333 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006335 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006337 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006338 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006339 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006340 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006341 return NULL;
6342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6344 memset(&hints, 0, sizeof(hints));
6345 hints.ai_family = AF_UNSPEC;
6346 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006347 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 Py_BEGIN_ALLOW_THREADS
6349 ACQUIRE_GETADDRINFO_LOCK
6350 error = getaddrinfo(hostp, pbuf, &hints, &res);
6351 Py_END_ALLOW_THREADS
6352 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6353 if (error) {
6354 set_gaierror(error);
6355 goto fail;
6356 }
6357 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006358 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 "sockaddr resolved to multiple addresses");
6360 goto fail;
6361 }
6362 switch (res->ai_family) {
6363 case AF_INET:
6364 {
6365 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006366 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 "IPv4 sockaddr must be 2 tuple");
6368 goto fail;
6369 }
6370 break;
6371 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006372#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 case AF_INET6:
6374 {
6375 struct sockaddr_in6 *sin6;
6376 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006377 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 sin6->sin6_scope_id = scope_id;
6379 break;
6380 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006383 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6385 if (error) {
6386 set_gaierror(error);
6387 goto fail;
6388 }
Victor Stinner72400302016-01-28 15:41:01 +01006389
6390 name = sock_decode_hostname(hbuf);
6391 if (name == NULL)
6392 goto fail;
6393 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006394
6395fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 if (res)
6397 freeaddrinfo(res);
6398 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006399}
6400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006401PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006402"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006403\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006404Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006405
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006406
6407/* Python API to getting and setting the default timeout value. */
6408
6409static PyObject *
6410socket_getdefaulttimeout(PyObject *self)
6411{
Victor Stinner71694d52015-03-28 01:18:54 +01006412 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006413 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 }
Victor Stinner71694d52015-03-28 01:18:54 +01006415 else {
6416 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6417 return PyFloat_FromDouble(seconds);
6418 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006419}
6420
6421PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006422"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006423\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006424Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006425A value of None indicates that new socket objects have no timeout.\n\
6426When the socket module is first imported, the default is None.");
6427
6428static PyObject *
6429socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6430{
Victor Stinner71694d52015-03-28 01:18:54 +01006431 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006432
Victor Stinner71694d52015-03-28 01:18:54 +01006433 if (socket_parse_timeout(&timeout, arg) < 0)
6434 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006437
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006438 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006439}
6440
6441PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006442"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006443\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006444Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006445A value of None indicates that new socket objects have no timeout.\n\
6446When the socket module is first imported, the default is None.");
6447
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006448#ifdef HAVE_IF_NAMEINDEX
6449/* Python API for getting interface indices and names */
6450
6451static PyObject *
6452socket_if_nameindex(PyObject *self, PyObject *arg)
6453{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006454 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006455 int i;
6456 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006457
Charles-François Natali60713592011-05-20 16:55:06 +02006458 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006459 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006460 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006461 return NULL;
6462 }
6463
6464 list = PyList_New(0);
6465 if (list == NULL) {
6466 if_freenameindex(ni);
6467 return NULL;
6468 }
6469
Miss Islington (bot)01b96642018-12-30 17:59:19 -08006470#ifdef _Py_MEMORY_SANITIZER
6471 __msan_unpoison(ni, sizeof(ni));
6472 __msan_unpoison(&ni[0], sizeof(ni[0]));
6473#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006474 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Miss Islington (bot)01b96642018-12-30 17:59:19 -08006475#ifdef _Py_MEMORY_SANITIZER
6476 /* This one isn't the end sentinel, the next one must exist. */
6477 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6478 /* Otherwise Py_BuildValue internals are flagged by MSan when
6479 they access the not-msan-tracked if_name string data. */
6480 {
6481 char *to_sanitize = ni[i].if_name;
6482 do {
6483 __msan_unpoison(to_sanitize, 1);
6484 } while (*to_sanitize++ != '\0');
6485 }
6486#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006487 PyObject *ni_tuple = Py_BuildValue("IO&",
6488 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006489
6490 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6491 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006492 Py_DECREF(list);
6493 if_freenameindex(ni);
6494 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006495 }
6496 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006497 }
6498
6499 if_freenameindex(ni);
6500 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006501}
6502
6503PyDoc_STRVAR(if_nameindex_doc,
6504"if_nameindex()\n\
6505\n\
6506Returns a list of network interface information (index, name) tuples.");
6507
Charles-François Natali60713592011-05-20 16:55:06 +02006508static PyObject *
6509socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006510{
Charles-François Natali60713592011-05-20 16:55:06 +02006511 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006512 unsigned long index;
6513
Charles-François Natali60713592011-05-20 16:55:06 +02006514 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6515 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006516 return NULL;
6517
Charles-François Natali60713592011-05-20 16:55:06 +02006518 index = if_nametoindex(PyBytes_AS_STRING(oname));
6519 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006520 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006521 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006522 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006523 return NULL;
6524 }
6525
6526 return PyLong_FromUnsignedLong(index);
6527}
6528
6529PyDoc_STRVAR(if_nametoindex_doc,
6530"if_nametoindex(if_name)\n\
6531\n\
6532Returns the interface index corresponding to the interface name if_name.");
6533
Charles-François Natali60713592011-05-20 16:55:06 +02006534static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006535socket_if_indextoname(PyObject *self, PyObject *arg)
6536{
Charles-François Natali60713592011-05-20 16:55:06 +02006537 unsigned long index;
6538 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006539
Charles-François Natali60713592011-05-20 16:55:06 +02006540 index = PyLong_AsUnsignedLong(arg);
6541 if (index == (unsigned long) -1)
6542 return NULL;
6543
6544 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006545 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006546 return NULL;
6547 }
6548
Charles-François Natali60713592011-05-20 16:55:06 +02006549 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006550}
6551
6552PyDoc_STRVAR(if_indextoname_doc,
6553"if_indextoname(if_index)\n\
6554\n\
6555Returns the interface name corresponding to the interface index if_index.");
6556
6557#endif /* HAVE_IF_NAMEINDEX */
6558
6559
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006560#ifdef CMSG_LEN
6561/* Python interface to CMSG_LEN(length). */
6562
6563static PyObject *
6564socket_CMSG_LEN(PyObject *self, PyObject *args)
6565{
6566 Py_ssize_t length;
6567 size_t result;
6568
6569 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6570 return NULL;
6571 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6572 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6573 return NULL;
6574 }
6575 return PyLong_FromSize_t(result);
6576}
6577
6578PyDoc_STRVAR(CMSG_LEN_doc,
6579"CMSG_LEN(length) -> control message length\n\
6580\n\
6581Return the total length, without trailing padding, of an ancillary\n\
6582data item with associated data of the given length. This value can\n\
6583often be used as the buffer size for recvmsg() to receive a single\n\
6584item of ancillary data, but RFC 3542 requires portable applications to\n\
6585use CMSG_SPACE() and thus include space for padding, even when the\n\
6586item will be the last in the buffer. Raises OverflowError if length\n\
6587is outside the permissible range of values.");
6588
6589
6590#ifdef CMSG_SPACE
6591/* Python interface to CMSG_SPACE(length). */
6592
6593static PyObject *
6594socket_CMSG_SPACE(PyObject *self, PyObject *args)
6595{
6596 Py_ssize_t length;
6597 size_t result;
6598
6599 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6600 return NULL;
6601 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6602 PyErr_SetString(PyExc_OverflowError,
6603 "CMSG_SPACE() argument out of range");
6604 return NULL;
6605 }
6606 return PyLong_FromSize_t(result);
6607}
6608
6609PyDoc_STRVAR(CMSG_SPACE_doc,
6610"CMSG_SPACE(length) -> buffer size\n\
6611\n\
6612Return the buffer size needed for recvmsg() to receive an ancillary\n\
6613data item with associated data of the given length, along with any\n\
6614trailing padding. The buffer space needed to receive multiple items\n\
6615is the sum of the CMSG_SPACE() values for their associated data\n\
6616lengths. Raises OverflowError if length is outside the permissible\n\
6617range of values.");
6618#endif /* CMSG_SPACE */
6619#endif /* CMSG_LEN */
6620
6621
Guido van Rossum30a685f1991-06-27 15:51:29 +00006622/* List of functions exported by this module. */
6623
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006624static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 {"gethostbyname", socket_gethostbyname,
6626 METH_VARARGS, gethostbyname_doc},
6627 {"gethostbyname_ex", socket_gethostbyname_ex,
6628 METH_VARARGS, ghbn_ex_doc},
6629 {"gethostbyaddr", socket_gethostbyaddr,
6630 METH_VARARGS, gethostbyaddr_doc},
6631 {"gethostname", socket_gethostname,
6632 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006633#ifdef HAVE_SETHOSTNAME
6634 {"sethostname", socket_sethostname,
6635 METH_VARARGS, sethostname_doc},
6636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 {"getservbyname", socket_getservbyname,
6638 METH_VARARGS, getservbyname_doc},
6639 {"getservbyport", socket_getservbyport,
6640 METH_VARARGS, getservbyport_doc},
6641 {"getprotobyname", socket_getprotobyname,
6642 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006643 {"close", socket_close,
6644 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006645#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 {"dup", socket_dup,
6647 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006648#endif
Dave Cole331708b2004-08-09 04:51:41 +00006649#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 {"socketpair", socket_socketpair,
6651 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 {"ntohs", socket_ntohs,
6654 METH_VARARGS, ntohs_doc},
6655 {"ntohl", socket_ntohl,
6656 METH_O, ntohl_doc},
6657 {"htons", socket_htons,
6658 METH_VARARGS, htons_doc},
6659 {"htonl", socket_htonl,
6660 METH_O, htonl_doc},
6661 {"inet_aton", socket_inet_aton,
6662 METH_VARARGS, inet_aton_doc},
6663 {"inet_ntoa", socket_inet_ntoa,
6664 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006665#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 {"inet_pton", socket_inet_pton,
6667 METH_VARARGS, inet_pton_doc},
6668 {"inet_ntop", socket_inet_ntop,
6669 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006670#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006671 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6672 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 {"getnameinfo", socket_getnameinfo,
6674 METH_VARARGS, getnameinfo_doc},
6675 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6676 METH_NOARGS, getdefaulttimeout_doc},
6677 {"setdefaulttimeout", socket_setdefaulttimeout,
6678 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006679#ifdef HAVE_IF_NAMEINDEX
6680 {"if_nameindex", socket_if_nameindex,
6681 METH_NOARGS, if_nameindex_doc},
6682 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006683 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006684 {"if_indextoname", socket_if_indextoname,
6685 METH_O, if_indextoname_doc},
6686#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006687#ifdef CMSG_LEN
6688 {"CMSG_LEN", socket_CMSG_LEN,
6689 METH_VARARGS, CMSG_LEN_doc},
6690#ifdef CMSG_SPACE
6691 {"CMSG_SPACE", socket_CMSG_SPACE,
6692 METH_VARARGS, CMSG_SPACE_doc},
6693#endif
6694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006696};
6697
Guido van Rossum30a685f1991-06-27 15:51:29 +00006698
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006699#ifdef MS_WINDOWS
6700#define OS_INIT_DEFINED
6701
6702/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006703
6704static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006705os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006707 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006708}
6709
6710static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006711os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006713 WSADATA WSAData;
6714 int ret;
6715 ret = WSAStartup(0x0101, &WSAData);
6716 switch (ret) {
6717 case 0: /* No error */
6718 Py_AtExit(os_cleanup);
6719 return 1; /* Success */
6720 case WSASYSNOTREADY:
6721 PyErr_SetString(PyExc_ImportError,
6722 "WSAStartup failed: network not ready");
6723 break;
6724 case WSAVERNOTSUPPORTED:
6725 case WSAEINVAL:
6726 PyErr_SetString(
6727 PyExc_ImportError,
6728 "WSAStartup failed: requested version not supported");
6729 break;
6730 default:
6731 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6732 break;
6733 }
6734 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006735}
6736
Guido van Rossum8d665e61996-06-26 18:22:49 +00006737#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006738
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006739
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006740
6741#ifndef OS_INIT_DEFINED
6742static int
6743os_init(void)
6744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006746}
6747#endif
6748
6749
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006750/* C API table - always add new things to the end for binary
6751 compatibility. */
6752static
6753PySocketModule_APIObject PySocketModuleAPI =
6754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006756 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006758};
6759
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006760
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006761/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006762
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006763 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006764 "socket.py" which implements some additional functionality.
6765 The import of "_socket" may fail with an ImportError exception if
6766 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006767 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006768 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006769*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006771PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006772"Implementation module for socket operations.\n\
6773\n\
6774See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006775
Martin v. Löwis1a214512008-06-11 05:26:20 +00006776static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777 PyModuleDef_HEAD_INIT,
6778 PySocket_MODULE_NAME,
6779 socket_doc,
6780 -1,
6781 socket_methods,
6782 NULL,
6783 NULL,
6784 NULL,
6785 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006786};
6787
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006788PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006789PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793 if (!os_init())
6794 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006795
Victor Stinnerdaf45552013-08-28 00:53:59 +02006796#ifdef MS_WINDOWS
6797 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006798 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006799 }
6800#endif
6801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802 Py_TYPE(&sock_type) = &PyType_Type;
6803 m = PyModule_Create(&socketmodule);
6804 if (m == NULL)
6805 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006806
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006807 Py_INCREF(PyExc_OSError);
6808 PySocketModuleAPI.error = PyExc_OSError;
6809 Py_INCREF(PyExc_OSError);
6810 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006812 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813 if (socket_herror == NULL)
6814 return NULL;
6815 Py_INCREF(socket_herror);
6816 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006817 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 NULL);
6819 if (socket_gaierror == NULL)
6820 return NULL;
6821 Py_INCREF(socket_gaierror);
6822 PyModule_AddObject(m, "gaierror", socket_gaierror);
6823 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006824 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006825 if (socket_timeout == NULL)
6826 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006827 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828 Py_INCREF(socket_timeout);
6829 PyModule_AddObject(m, "timeout", socket_timeout);
6830 Py_INCREF((PyObject *)&sock_type);
6831 if (PyModule_AddObject(m, "SocketType",
6832 (PyObject *)&sock_type) != 0)
6833 return NULL;
6834 Py_INCREF((PyObject *)&sock_type);
6835 if (PyModule_AddObject(m, "socket",
6836 (PyObject *)&sock_type) != 0)
6837 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006838
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006839#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006841#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844 Py_INCREF(has_ipv6);
6845 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 /* Export C API */
6848 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6849 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6850 ) != 0)
6851 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006854#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006856#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006858#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006860#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006861#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#endif
6865#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006867#endif
6868#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006871#endif
6872#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006875#endif
6876#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006879#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006880#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006883#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006884#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006887#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006888#ifdef HAVE_SOCKADDR_ALG
6889 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6890#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006891#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006894#endif
6895#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006897#endif
6898#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006901#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006902#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006905#endif
6906#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006909#endif
6910#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006911 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006913#endif
6914#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006917#endif
6918#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, AF_NETLINK);
6921 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006922#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006924#endif
6925#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006927#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6929 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006930#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006932#endif
6933#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006935#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006936#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006938#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006939#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006941#endif
6942#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006944#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006946#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006948#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006949#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006951#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006952#ifdef NETLINK_CRYPTO
6953 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6954#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006955#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006956
6957#ifdef AF_VSOCK
6958 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6959 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6960 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6961 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6962 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6963 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6964 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6965 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6966 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6967#endif
6968
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006969#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006972#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006973#ifdef AF_LINK
6974 PyModule_AddIntMacro(m, AF_LINK);
6975#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006976#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006979#endif
6980#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006983#endif
6984#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006987#endif
6988#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006991#endif
6992#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006995#endif
6996#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006997 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006999#endif
7000#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007003#endif
7004#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007007#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007008
Hye-Shik Chang81268602004-02-02 06:05:24 +00007009#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7011 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7012 PyModule_AddIntMacro(m, BTPROTO_HCI);
7013 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007014#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007016#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007017#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007018#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007020#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7022 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007023#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007025 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7026 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007027#endif
7028
Charles-François Natali47413c12011-10-06 19:47:44 +02007029#ifdef AF_CAN
7030 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007032#endif
7033#ifdef PF_CAN
7034 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007036#endif
7037
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007038/* Reliable Datagram Sockets */
7039#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007041#endif
7042#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007044#endif
7045
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007046/* Kernel event messages */
7047#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007049#endif
7050#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007052#endif
7053
Antoine Pitroub156a462010-10-27 20:13:57 +00007054#ifdef AF_PACKET
7055 PyModule_AddIntMacro(m, AF_PACKET);
7056#endif
7057#ifdef PF_PACKET
7058 PyModule_AddIntMacro(m, PF_PACKET);
7059#endif
7060#ifdef PACKET_HOST
7061 PyModule_AddIntMacro(m, PACKET_HOST);
7062#endif
7063#ifdef PACKET_BROADCAST
7064 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7065#endif
7066#ifdef PACKET_MULTICAST
7067 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7068#endif
7069#ifdef PACKET_OTHERHOST
7070 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7071#endif
7072#ifdef PACKET_OUTGOING
7073 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7074#endif
7075#ifdef PACKET_LOOPBACK
7076 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7077#endif
7078#ifdef PACKET_FASTROUTE
7079 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007080#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007081
Christian Heimes043d6f62008-01-07 17:19:16 +00007082#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7087 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7088 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007089
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7091 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7092 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, SOL_TIPC);
7096 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7097 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7098 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7099 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007100
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7102 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7103 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7104 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7108 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007109#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007112#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7114 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7115 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7116 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7117 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7118 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007119#endif
7120
Christian Heimesdffa3942016-09-05 23:54:41 +02007121#ifdef HAVE_SOCKADDR_ALG
7122 /* Socket options */
7123 PyModule_AddIntMacro(m, ALG_SET_KEY);
7124 PyModule_AddIntMacro(m, ALG_SET_IV);
7125 PyModule_AddIntMacro(m, ALG_SET_OP);
7126 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7127 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7128 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7129
7130 /* Operations */
7131 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7132 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7133 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7134 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7135#endif
7136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, SOCK_STREAM);
7139 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007140/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007141#ifdef SOCK_RAW
7142 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007144#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007146#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007148#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007149#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007151#endif
7152#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007154#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007164#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007165#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007167#endif
7168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007169#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007186#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007187#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007190#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007218#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007219#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007221#endif
7222#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007224#endif
7225#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007227#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007228#ifdef SO_PASSSEC
7229 PyModule_AddIntMacro(m, SO_PASSSEC);
7230#endif
7231#ifdef SO_PEERSEC
7232 PyModule_AddIntMacro(m, SO_PEERSEC);
7233#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007234#ifdef SO_BINDTODEVICE
7235 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7236#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007237#ifdef SO_PRIORITY
7238 PyModule_AddIntMacro(m, SO_PRIORITY);
7239#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007240#ifdef SO_MARK
7241 PyModule_AddIntMacro(m, SO_MARK);
7242#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007243#ifdef SO_DOMAIN
7244 PyModule_AddIntMacro(m, SO_DOMAIN);
7245#endif
7246#ifdef SO_PROTOCOL
7247 PyModule_AddIntMacro(m, SO_PROTOCOL);
7248#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250 /* Maximum number of connections for "listen" */
7251#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007253#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007255#endif
7256
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007257 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007258#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007260#endif
7261#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007263#endif
7264#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007266#endif
7267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268 /* Flags for send, recv */
7269#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007284#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007298#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007299#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007301#endif
7302#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007304#endif
7305#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007307#endif
7308#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007310#endif
7311#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007313#endif
7314#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007316#endif
7317#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007319#endif
7320#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007322#endif
7323#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007325#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007326#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007328#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330 /* Protocol level and numbers, usable for [gs]etsockopt */
7331#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007356#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007363#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007364#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007366#endif
7367#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7369 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007370#endif
7371#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7373 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7374 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007375
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7377 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7378 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007379#ifdef CAN_ISOTP
7380 PyModule_AddIntMacro(m, CAN_ISOTP);
7381#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007382#endif
7383#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7385 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7386 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7387 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007388#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007389#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7390 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7391#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007392#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007394 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7395 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7396 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7397 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7398 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7399 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7400 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7401 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7402 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7403 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7404 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7405 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7406#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007407#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007409#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007410#ifdef HAVE_SOCKADDR_ALG
7411 PyModule_AddIntMacro(m, SOL_ALG);
7412#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007413#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007415#endif
7416#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007418#endif
7419#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007421#endif
7422#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007424#endif
7425#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007427#endif
7428#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007433#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007442 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007450#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007456#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007459#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007461#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007462 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007472#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007508#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007531#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007532#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007537#endif
7538/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007541#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007546#endif
7547
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007548#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007550#endif
7551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552 /* Some port configuration */
7553#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007555#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007560#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007562#endif
7563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564 /* Some reserved IP v.4 addresses */
7565#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007567#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007570#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007572#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007575#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007582#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef INADDR_ALLHOSTS_GROUP
7586 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7587 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007593#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007596#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007598#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007599 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007600#endif
7601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602 /* IPv4 [gs]etsockopt options */
7603#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007624#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007627#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007630#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007633#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007650#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007651#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007653#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007655 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7656#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007675#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007678 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007679#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007681#endif
7682#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007684#endif
7685#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007687#endif
7688#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007690#endif
7691#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007693#endif
7694#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007696#endif
7697#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007699#endif
7700#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007702#endif
7703#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007705#endif
7706#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007708#endif
7709#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007711#endif
7712#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007714#endif
7715#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007716 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007717#endif
7718#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007719 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007720#endif
7721#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007723#endif
7724#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007725 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007726#endif
7727#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007728 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007729#endif
7730#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007731 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007732#endif
7733#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007734 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007735#endif
7736#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007737 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007738#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007740 /* TCP options */
7741#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007747#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007750#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007751 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007753#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007756#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007757 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007759#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007760 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007762#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007763 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007765#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007766 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007768#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007769 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007771#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007772 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007774#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007775 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007776#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007777#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007778 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007779#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007780#ifdef TCP_CONGESTION
7781 PyModule_AddIntMacro(m, TCP_CONGESTION);
7782#endif
7783#ifdef TCP_USER_TIMEOUT
7784 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7785#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007786#ifdef TCP_NOTSENT_LOWAT
7787 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7788#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007790 /* IPX options */
7791#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007793#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007794
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007795/* Reliable Datagram Sockets */
7796#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007798#endif
7799#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007801#endif
7802#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007804#endif
7805#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007806 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007807#endif
7808#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007809 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007810#endif
7811#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007812 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007813#endif
7814#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007816#endif
7817#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007819#endif
7820#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007822#endif
7823#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007824 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007825#endif
7826#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007827 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007828#endif
7829#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007830 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007831#endif
7832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007833 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007834#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007836#endif
7837#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007839#endif
7840#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007842#endif
7843#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007845#endif
7846#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007848#endif
7849#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007851#endif
7852#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007854#endif
7855#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007857#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007858#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007860#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007861#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007863#endif
7864#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007866#endif
7867#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007869#endif
7870#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007872#endif
7873#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007875#endif
7876#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007878#endif
7879#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007881#endif
7882#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007884#endif
7885#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007887#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007888#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007890#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007891#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007893#endif
7894#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007896#endif
7897#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007899#endif
7900#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007902#endif
7903#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007905#endif
7906#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007908#endif
7909#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007911#endif
7912#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007914#endif
7915#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007917#endif
7918#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007920#endif
7921#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007923#endif
7924#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007926#endif
7927#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007929#endif
7930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007932#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007933 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007934#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007936#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007937 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007938#endif
7939#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007940 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007941#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007942 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007943#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007945#endif
7946#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007947 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007948#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007950#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007951 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007952#endif
7953
Christian Heimesfaf2f632008-01-06 16:59:19 +00007954#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007956 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7957#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007958 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007959#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007960 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007961 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7962#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007963 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007964#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007965 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007967 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968 PyObject *tmp;
7969 tmp = PyLong_FromUnsignedLong(codes[i]);
7970 if (tmp == NULL)
7971 return NULL;
7972 PyModule_AddObject(m, names[i], tmp);
7973 }
7974 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007975 PyModule_AddIntMacro(m, RCVALL_OFF);
7976 PyModule_AddIntMacro(m, RCVALL_ON);
7977 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007978#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007980#endif
7981#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007982 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007983#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007984#endif /* _MSTCPIP_ */
7985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007987#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007989#endif
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08007990
7991#ifdef MS_WINDOWS
7992 /* remove some flags on older version Windows during run-time */
7993 remove_unusable_flags(m);
7994#endif
7995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007996 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007997}