blob: c649fa3c982f95edcaf15499c1d7dbfaff9f15a2 [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
Bjorn Anderssonbb816512018-09-26 06:47:52 -070010 portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are
11 supported 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.
Bjorn Anderssonbb816512018-09-26 06:47:52 -070058- an AF_QIPCRTR socket address is a (node, port) tuple where the
59 node and port are non-negative integers.
Christian Heimes043d6f62008-01-07 17:19:16 +000060- an AF_TIPC socket address is expressed as
61 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000063 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000065 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if addr_type is TIPC_ADDR_NAME:
67 v1 is the server type
68 v2 is the port identifier
69 v3 is ignored
70 if addr_type is TIPC_ADDR_NAMESEQ:
71 v1 is the server type
72 v2 is the lower port number
73 v3 is the upper port number
74 if addr_type is TIPC_ADDR_ID:
75 v1 is the node
76 v2 is the ref
77 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000078
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000082- names starting with sock_ are socket object methods
83- names starting with socket_ are module-level functions
84- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Thomas Wouters477c8d52006-05-27 19:21:47 +000088#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110089#include <AvailabilityMacros.h>
90/* for getaddrinfo thread safety test on old versions of OS X */
91#ifndef MAC_OS_X_VERSION_10_5
92#define MAC_OS_X_VERSION_10_5 1050
93#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 /*
95 * inet_aton is not available on OSX 10.3, yet we want to use a binary
96 * that was build on 10.4 or later to work on that release, weak linking
97 * comes to the rescue.
98 */
99# pragma weak inet_aton
100#endif
101
Inada Naokie9a1dcb2019-03-20 19:02:46 +0900102#define PY_SSIZE_T_CLEAN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000103#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000104#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105
Gregory P. Smithb474e672018-12-30 17:05:36 -0800106#ifdef _Py_MEMORY_SANITIZER
107# include <sanitizer/msan_interface.h>
108#endif
109
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000110/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000111PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100112"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
113socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
115Open a socket of the given type. The family argument specifies the\n\
116address family; it defaults to AF_INET. The type argument specifies\n\
117whether this is a stream (SOCK_STREAM, this is the default)\n\
118or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
119specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200120The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100122When a fileno is passed in, family, type and proto are auto-detected,\n\
123unless they are explicitly set.\n\
124\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125A socket object represents one endpoint of a network connection.\n\
126\n\
127Methods of socket objects (keyword arguments not allowed):\n\
128\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000129_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130bind(addr) -- bind the socket to a local address\n\
131close() -- close the socket\n\
132connect(addr) -- connect the socket to a remote address\n\
133connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200134dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135fileno() -- return underlying file descriptor\n\
136getpeername() -- return remote address [*]\n\
137getsockname() -- return local address\n\
138getsockopt(level, optname[, buflen]) -- get socket options\n\
139gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100140listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000142recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000144recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000145 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000146sendall(data[, flags]) -- send all data\n\
147send(data[, flags]) -- send data, may not send all of it\n\
148sendto(data[, flags], addr) -- send data to a given address\n\
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +0300149setblocking(bool) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500150getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200151setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000152settimeout(None | float) -- set or clear the timeout\n\
153shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700154if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700155if_nametoindex(name) -- return the corresponding interface index\n\
156if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000158 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000159
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000160/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000161 I hope some day someone can clean this up please... */
162
Guido van Rossum9376b741999-09-15 22:01:40 +0000163/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
164 script doesn't get this right, so we hardcode some platform checks below.
165 On the other hand, not all Linux versions agree, so there the settings
166 computed by the configure script are needed! */
167
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700168#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# undef HAVE_GETHOSTBYNAME_R_3_ARG
170# undef HAVE_GETHOSTBYNAME_R_5_ARG
171# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000172#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000173
Victor Stinner710d27e2011-08-23 10:57:32 +0200174#if defined(__OpenBSD__)
175# include <sys/uio.h>
176#endif
177
Stefan Krah1f9eb872016-05-22 17:35:34 +0200178#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000180#endif
181
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000183# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# define HAVE_GETHOSTBYNAME_R_3_ARG
185# elif defined(__sun) || defined(__sgi)
186# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700187# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000188/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000189# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
190# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000191# else
192# undef HAVE_GETHOSTBYNAME_R
193# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000194#endif
195
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200196#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000198#endif
199
Ned Deilye1d4e582016-02-23 22:05:29 +1100200/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000201#ifdef HAVE_SYS_PARAM_H
202#include <sys/param.h>
203#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000204/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100205 (this includes the getaddrinfo emulation) protect access with a lock.
206
207 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
208 a mix of code including an unsafe implementation from an old BSD's
209 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
210 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100212
Ned Deilye1d4e582016-02-23 22:05:29 +1100213 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
214 http://www.openbsd.org/plus54.html
215
216 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
217
218http://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 +1100219 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200220#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100221 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000222 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100223 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
224 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100225 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000226#define USE_GETADDRINFO_LOCK
227#endif
228
229#ifdef USE_GETADDRINFO_LOCK
230#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
231#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
232#else
233#define ACQUIRE_GETADDRINFO_LOCK
234#define RELEASE_GETADDRINFO_LOCK
235#endif
236
237#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000239#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241
Serhiy Storchakad3187152017-11-09 18:00:38 +0200242#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243# include <sys/ioctl.h>
244#endif
245
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248/* make sure that the reentrant (gethostbyaddr_r etc)
249 functions are declared correctly if compiling with
250 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Thomas Wouters477c8d52006-05-27 19:21:47 +0000252/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000255#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000256
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000257#undef _XOPEN_SOURCE
258#include <sys/socket.h>
259#include <sys/types.h>
260#include <netinet/in.h>
261#ifdef _SS_ALIGNSIZE
262#define HAVE_GETADDRINFO 1
263#define HAVE_GETNAMEINFO 1
264#endif
265
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000266#define HAVE_INET_PTON
267#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000268#endif
269
Benjamin Peterson06930632017-09-04 16:36:05 -0700270/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100271#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000272#define INET_ADDRSTRLEN 16
273#endif
274
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000276#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000277#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000278#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700280#ifdef HAVE_SYS_SOCKET_H
281#include <sys/socket.h>
282#endif
283
284#ifdef HAVE_NET_IF_H
285#include <net/if.h>
286#endif
287
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000288/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000290#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291
292/* Addressing includes */
293
Guido van Rossum6f489d91996-06-28 20:15:15 +0000294#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295
296/* Non-MS WINDOWS includes */
297# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000298# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000299
Guido van Rossum9376b741999-09-15 22:01:40 +0000300/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000305#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000308# ifdef HAVE_FCNTL_H
309# include <fcntl.h>
310# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100312/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
313#ifdef MS_WINDOWS
314#define IPPROTO_ICMP IPPROTO_ICMP
315#define IPPROTO_IGMP IPPROTO_IGMP
316#define IPPROTO_GGP IPPROTO_GGP
317#define IPPROTO_TCP IPPROTO_TCP
318#define IPPROTO_PUP IPPROTO_PUP
319#define IPPROTO_UDP IPPROTO_UDP
320#define IPPROTO_IDP IPPROTO_IDP
321#define IPPROTO_ND IPPROTO_ND
322#define IPPROTO_RAW IPPROTO_RAW
323#define IPPROTO_MAX IPPROTO_MAX
324#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
325#define IPPROTO_IPV4 IPPROTO_IPV4
326#define IPPROTO_IPV6 IPPROTO_IPV6
327#define IPPROTO_ROUTING IPPROTO_ROUTING
328#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
329#define IPPROTO_ESP IPPROTO_ESP
330#define IPPROTO_AH IPPROTO_AH
331#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
332#define IPPROTO_NONE IPPROTO_NONE
333#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
334#define IPPROTO_EGP IPPROTO_EGP
335#define IPPROTO_PIM IPPROTO_PIM
336#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
337#define IPPROTO_ST IPPROTO_ST // WinSock2 only
338#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
339#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
340#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
341#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
342#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
343#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
344#endif /* MS_WINDOWS */
345
Steve Dower65e4cb12014-11-22 12:54:57 -0800346/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200347#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600348// For if_nametoindex() and if_indextoname()
349#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800350
animalize19e7d482018-02-27 02:10:36 +0800351/* remove some flags on older version Windows during run-time.
352 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
353typedef struct {
354 DWORD build_number; /* available starting with this Win10 BuildNumber */
355 const char flag_name[20];
356} FlagRuntimeInfo;
357
358/* IMPORTANT: make sure the list ordered by descending build_number */
359static FlagRuntimeInfo win_runtime_flags[] = {
360 /* available starting with Windows 10 1709 */
361 {16299, "TCP_KEEPIDLE"},
362 {16299, "TCP_KEEPINTVL"},
363 /* available starting with Windows 10 1703 */
364 {15063, "TCP_KEEPCNT"},
365 /* available starting with Windows 10 1607 */
366 {14393, "TCP_FASTOPEN"}
367};
368
369static void
370remove_unusable_flags(PyObject *m)
371{
372 PyObject *dict;
373 OSVERSIONINFOEX info;
374 DWORDLONG dwlConditionMask;
375
376 dict = PyModule_GetDict(m);
377 if (dict == NULL) {
378 return;
379 }
380
381 /* set to Windows 10, except BuildNumber. */
382 memset(&info, 0, sizeof(info));
383 info.dwOSVersionInfoSize = sizeof(info);
384 info.dwMajorVersion = 10;
385 info.dwMinorVersion = 0;
386
387 /* set Condition Mask */
388 dwlConditionMask = 0;
389 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
390 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
391 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
392
393 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
394 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100395 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800396 Compatibility Mode will not cheat VerifyVersionInfo(...) */
397 if (VerifyVersionInfo(
398 &info,
399 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
400 dwlConditionMask)) {
401 break;
402 }
403 else {
404 if (PyDict_GetItemString(
405 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200406 win_runtime_flags[i].flag_name) != NULL)
407 {
408 if (PyDict_DelItemString(
409 dict,
410 win_runtime_flags[i].flag_name))
411 {
412 PyErr_Clear();
413 }
animalize19e7d482018-02-27 02:10:36 +0800414 }
415 }
416 }
417}
418
Jeremy Hylton22308652001-02-02 03:23:09 +0000419#endif
420
Skip Montanaro7befb992004-02-10 16:50:21 +0000421#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000422
Neal Norwitz39d22e52002-11-02 19:55:21 +0000423#ifndef O_NONBLOCK
424# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000425#endif
426
Trent Micka708d6e2004-09-07 17:48:26 +0000427/* include Python's addrinfo.h unless it causes trouble */
428#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
429 /* Do not include addinfo.h on some newer IRIX versions.
430 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
431 * for example, but not by 6.5.10.
432 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000433#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000434 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
435 * EAI_* constants are defined in (the already included) ws2tcpip.h.
436 */
437#else
438# include "addrinfo.h"
439#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000440
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000441#ifdef __APPLE__
442/* On OS X, getaddrinfo returns no error indication of lookup
443 failure, so we must use the emulation instead of the libinfo
444 implementation. Unfortunately, performing an autoconf test
445 for this bug would require DNS access for the machine performing
446 the configuration, which is not acceptable. Therefore, we
447 determine the bug just by checking for __APPLE__. If this bug
448 gets ever fixed, perhaps checking for sys/version.h would be
449 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000450#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600451/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000452 Find to check for Jaguar is that it has getnameinfo(), which
453 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000454#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000455#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000456
457#ifdef HAVE_INET_ATON
458#define USE_INET_ATON_WEAKLINK
459#endif
460
Jack Jansen84262fb2002-07-02 14:40:42 +0000461#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000462
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000463/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000464#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000465/* avoid clashes with the C library definition of the symbol. */
466#define getaddrinfo fake_getaddrinfo
467#define gai_strerror fake_gai_strerror
468#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000469#include "getaddrinfo.c"
470#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000471#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000472#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000473#include "getnameinfo.c"
474#endif
475
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000476#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000477#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000478#endif
479
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000481#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482#define EAFNOSUPPORT WSAEAFNOSUPPORT
483#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000484#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000485
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000486#ifndef SOCKETCLOSE
487#define SOCKETCLOSE close
488#endif
489
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000490#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000491#define USE_BLUETOOTH 1
492#if defined(__FreeBSD__)
493#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
494#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000495#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000496#define SOL_HCI SOL_HCI_RAW
497#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000498#define sockaddr_l2 sockaddr_l2cap
499#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000501#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
502#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000503#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000504#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000505#define sockaddr_l2 sockaddr_bt
506#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000507#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000508#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000509#define SOL_HCI BTPROTO_HCI
510#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000511#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
512#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000513#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000515#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000516#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
517#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000518#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000519#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
520#endif
521#endif
522
Greg Bowser8fbece12019-08-02 16:29:52 -0400523#ifdef MS_WINDOWS
524#define sockaddr_rc SOCKADDR_BTH_REDEF
525
526#define USE_BLUETOOTH 1
527#define AF_BLUETOOTH AF_BTH
528#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
529#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
530#endif
531
Charles-François Natali8b759652011-12-23 16:44:51 +0100532/* Convert "sock_addr_t *" to "struct sockaddr *". */
533#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534
Martin v. Löwise9416172003-05-03 10:12:45 +0000535/*
536 * Constants for getnameinfo()
537 */
538#if !defined(NI_MAXHOST)
539#define NI_MAXHOST 1025
540#endif
541#if !defined(NI_MAXSERV)
542#define NI_MAXSERV 32
543#endif
544
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000545#ifndef INVALID_SOCKET /* MS defines this */
546#define INVALID_SOCKET (-1)
547#endif
548
Charles-François Natali0cc86852013-09-13 19:53:08 +0200549#ifndef INADDR_NONE
550#define INADDR_NONE (-1)
551#endif
552
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000553/* XXX There's a problem here: *static* functions are not supposed to have
554 a Py prefix (or use CapitalizedWords). Later... */
555
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556/* Global variable holding the exception type for errors detected
557 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000558static PyObject *socket_herror;
559static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000560static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561
Tim Peters643a7fc2002-02-17 04:13:21 +0000562/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000563 The sock_type variable contains pointers to various functions,
564 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000565 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000566static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000567
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000568#if defined(HAVE_POLL_H)
569#include <poll.h>
570#elif defined(HAVE_SYS_POLL_H)
571#include <sys/poll.h>
572#endif
573
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000574/* Largest value to try to store in a socklen_t (used when handling
575 ancillary data). POSIX requires socklen_t to hold at least
576 (2**31)-1 and recommends against storing larger values, but
577 socklen_t was originally int in the BSD interface, so to be on the
578 safe side we use the smaller of (2**31)-1 and INT_MAX. */
579#if INT_MAX > 0x7fffffff
580#define SOCKLEN_T_LIMIT 0x7fffffff
581#else
582#define SOCKLEN_T_LIMIT INT_MAX
583#endif
584
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200585#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000586/* Instead of select(), we'll use poll() since poll() works on any fd. */
587#define IS_SELECTABLE(s) 1
588/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000589#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200590/* If there's no timeout left, we don't have to call select, so it's a safe,
591 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100592#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000593#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000594
595static PyObject*
596select_error(void)
597{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200598 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000600}
601
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000602#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000603#ifndef WSAEAGAIN
604#define WSAEAGAIN WSAEWOULDBLOCK
605#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000606#define CHECK_ERRNO(expected) \
607 (WSAGetLastError() == WSA ## expected)
608#else
609#define CHECK_ERRNO(expected) \
610 (errno == expected)
611#endif
612
Victor Stinnerdaf45552013-08-28 00:53:59 +0200613#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200614# define GET_SOCK_ERROR WSAGetLastError()
615# define SET_SOCK_ERROR(err) WSASetLastError(err)
616# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
617# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
618#else
619# define GET_SOCK_ERROR errno
620# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
621# define SOCK_TIMEOUT_ERR EWOULDBLOCK
622# define SOCK_INPROGRESS_ERR EINPROGRESS
623#endif
624
Erik Janssens874809e2018-09-05 08:29:42 +0200625#ifdef _MSC_VER
626# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
627#else
628# define SUPPRESS_DEPRECATED_CALL
629#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200630
631#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200632/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
633static int support_wsa_no_inherit = -1;
634#endif
635
Guido van Rossum30a685f1991-06-27 15:51:29 +0000636/* Convenience function to raise an error according to errno
637 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000638
Guido van Rossum73624e91994-10-10 17:59:00 +0000639static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000640set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000642#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int err_no = WSAGetLastError();
644 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
645 recognizes the error codes used by both GetLastError() and
646 WSAGetLastError */
647 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200648 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000649#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000650
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200651 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000652}
653
Guido van Rossum30a685f1991-06-27 15:51:29 +0000654
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000656set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000659
660#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 if (v != NULL) {
666 PyErr_SetObject(socket_herror, v);
667 Py_DECREF(v);
668 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000671}
672
673
674static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000675set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678
Martin v. Löwis272cb402002-03-01 08:31:07 +0000679#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 /* EAI_SYSTEM is not available on Windows XP. */
681 if (error == EAI_SYSTEM)
682 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000683#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000684
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000685#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000687#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 if (v != NULL) {
691 PyErr_SetObject(socket_gaierror, v);
692 Py_DECREF(v);
693 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000696}
697
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000698/* Function to perform the setting of socket blocking mode
699 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000700static int
701internal_setblocking(PySocketSockObject *s, int block)
702{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400703 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200704#ifdef MS_WINDOWS
705 u_long arg;
706#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100707#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100708 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100709 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000710#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100714#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200716 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400717 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100718#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200720 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400721 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100723 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 else
Victor Stinner9a954832013-12-04 00:41:24 +0100725 new_delay_flag = delay_flag | O_NONBLOCK;
726 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200727 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400728 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100729#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000730#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200731 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200732 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400733 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000734#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400735
736 result = 0;
737
738 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740
Yury Selivanovfa22b292016-10-18 16:03:52 -0400741 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200742#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400743 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200744#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400745 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200746#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400747 }
748
749 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000750}
751
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000752static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200753internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
754 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100757#ifdef HAVE_POLL
758 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200759 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100760#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200761 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200762 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100763#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000764
Victor Stinnerb7df3142015-03-27 22:59:32 +0100765 /* must be called with the GIL held */
766 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100767
Victor Stinner416f2e62015-03-31 13:56:29 +0200768 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200772 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 /* Prefer poll, if available, since you can poll() any fd
776 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000777#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100778 pollfd.fd = s->sock_fd;
779 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 if (connect) {
781 /* On Windows, the socket becomes writable on connection success,
782 but a connection failure is notified as an error. On POSIX, the
783 socket becomes writable on connection success or on connection
784 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200785 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200786 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000787
Victor Stinner71694d52015-03-28 01:18:54 +0100788 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200789 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200790 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000791
Artem Khramov28146202019-08-15 03:21:48 +0600792 /* On some OSes, typically BSD-based ones, the timeout parameter of the
793 poll() syscall, when negative, must be exactly INFTIM, where defined,
794 or -1. See issue 37811. */
795 if (ms < 0) {
796#ifdef INFTIM
797 ms = INFTIM;
798#else
799 ms = -1;
800#endif
801 }
802
Victor Stinner71694d52015-03-28 01:18:54 +0100803 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200804 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100805 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000806#else
Victor Stinnerced11742015-04-09 10:27:25 +0200807 if (interval >= 0) {
808 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
809 tvp = &tv;
810 }
811 else
812 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000813
Victor Stinner71694d52015-03-28 01:18:54 +0100814 FD_ZERO(&fds);
815 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200816 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 if (connect) {
818 /* On Windows, the socket becomes writable on connection success,
819 but a connection failure is notified as an error. On POSIX, the
820 socket becomes writable on connection success or on connection
821 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200822 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 }
Victor Stinner71694d52015-03-28 01:18:54 +0100824
825 /* See if the socket is ready */
826 Py_BEGIN_ALLOW_THREADS;
827 if (writing)
828 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200829 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100830 else
831 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200832 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100833 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000834#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 if (n < 0)
837 return -1;
838 if (n == 0)
839 return 1;
840 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000841}
842
Victor Stinner31bf2d52015-04-01 21:57:09 +0200843/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000844
Victor Stinner81c41db2015-04-02 11:50:57 +0200845 On error, raise an exception and return -1 if err is set, or fill err and
846 return -1 otherwise. If a signal was received and the signal handler raised
847 an exception, return -1, and set err to -1 if err is set.
848
849 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100850
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851 If the socket has a timeout, wait until the socket is ready before calling
852 the function: wait until the socket is writable if writing is nonzero, wait
853 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856 the function, except if the signal handler raised an exception (PEP 475).
857
858 When the function is retried, recompute the timeout using a monotonic clock.
859
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 sock_call_ex() must be called with the GIL held. The socket function is
861 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200862static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200863sock_call_ex(PySocketSockObject *s,
864 int writing,
865 int (*sock_func) (PySocketSockObject *s, void *data),
866 void *data,
867 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200868 int *err,
869 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200870{
Victor Stinner8912d142015-04-06 23:16:34 +0200871 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200872 _PyTime_t deadline = 0;
873 int deadline_initialized = 0;
874 int res;
875
876 /* sock_call() must be called with the GIL held. */
877 assert(PyGILState_Check());
878
879 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200881 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200882 /* For connect(), poll even for blocking socket. The connection
883 runs asynchronously. */
884 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200885 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200886 _PyTime_t interval;
887
Victor Stinner81c41db2015-04-02 11:50:57 +0200888 if (deadline_initialized) {
889 /* recompute the timeout */
890 interval = deadline - _PyTime_GetMonotonicClock();
891 }
892 else {
893 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200894 deadline = _PyTime_GetMonotonicClock() + timeout;
895 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200897
Victor Stinner10550cd2015-04-03 13:22:27 +0200898 if (interval >= 0)
899 res = internal_select(s, writing, interval, connect);
900 else
901 res = 1;
902 }
903 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200904 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200905 }
906
Victor Stinner31bf2d52015-04-01 21:57:09 +0200907 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200908 if (err)
909 *err = GET_SOCK_ERROR;
910
Victor Stinner31bf2d52015-04-01 21:57:09 +0200911 if (CHECK_ERRNO(EINTR)) {
912 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200913 if (PyErr_CheckSignals()) {
914 if (err)
915 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200916 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200917 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200918
919 /* retry select() */
920 continue;
921 }
922
923 /* select() failed */
924 s->errorhandler();
925 return -1;
926 }
927
928 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200929 if (err)
930 *err = SOCK_TIMEOUT_ERR;
931 else
932 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200933 return -1;
934 }
935
936 /* the socket is ready */
937 }
938
Victor Stinner81c41db2015-04-02 11:50:57 +0200939 /* inner loop to retry sock_func() when sock_func() is interrupted
940 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200941 while (1) {
942 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200943 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200944 Py_END_ALLOW_THREADS
945
946 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200947 /* sock_func() succeeded */
948 if (err)
949 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200950 return 0;
951 }
952
Victor Stinner81c41db2015-04-02 11:50:57 +0200953 if (err)
954 *err = GET_SOCK_ERROR;
955
Victor Stinner31bf2d52015-04-01 21:57:09 +0200956 if (!CHECK_ERRNO(EINTR))
957 break;
958
Victor Stinner81c41db2015-04-02 11:50:57 +0200959 /* sock_func() was interrupted by a signal */
960 if (PyErr_CheckSignals()) {
961 if (err)
962 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200963 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200964 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200965
Victor Stinner81c41db2015-04-02 11:50:57 +0200966 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200967 }
968
969 if (s->sock_timeout > 0
970 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200971 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200972
973 For example, select() could indicate a socket is ready for
974 reading, but the data then discarded by the OS because of a
975 wrong checksum.
976
977 Loop on select() to recheck for socket readyness. */
978 continue;
979 }
980
Victor Stinner81c41db2015-04-02 11:50:57 +0200981 /* sock_func() failed */
982 if (!err)
983 s->errorhandler();
984 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000985 return -1;
986 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200987}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000988
Victor Stinner81c41db2015-04-02 11:50:57 +0200989static int
990sock_call(PySocketSockObject *s,
991 int writing,
992 int (*func) (PySocketSockObject *s, void *data),
993 void *data)
994{
Victor Stinner8912d142015-04-06 23:16:34 +0200995 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200996}
997
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000998
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000999/* Initialize a new socket object. */
1000
Victor Stinner88ed6402015-04-09 10:23:12 +02001001/* Default timeout for new sockets */
1002static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001003
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001004static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001005init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 s->sock_fd = fd;
1009 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -05001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -05001012
1013 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
1014 on some OSes as part of socket.type. We want to reset them here,
1015 to make socket.type be set to the same value on all platforms.
1016 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
1017 not portable.
1018 */
1019#ifdef SOCK_NONBLOCK
1020 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
1021#endif
1022#ifdef SOCK_CLOEXEC
1023 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1024#endif
1025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001029#ifdef SOCK_NONBLOCK
1030 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001031 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001032 else
1033#endif
1034 {
1035 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001036 if (defaulttimeout >= 0) {
1037 if (internal_setblocking(s, 0) == -1) {
1038 return -1;
1039 }
1040 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001041 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001042 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001043}
1044
1045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046/* Create a new socket object.
1047 This just creates the object and initializes it.
1048 If the creation fails, return NULL and set an exception (implicit
1049 in NEWOBJ()). */
1050
Guido van Rossum73624e91994-10-10 17:59:00 +00001051static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001052new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 PySocketSockObject *s;
1055 s = (PySocketSockObject *)
1056 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001057 if (s == NULL)
1058 return NULL;
1059 if (init_sockobject(s, fd, family, type, proto) == -1) {
1060 Py_DECREF(s);
1061 return NULL;
1062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001064}
1065
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
Guido van Rossum48a680c2001-03-02 06:34:14 +00001067/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001068 thread to be in gethostbyname or getaddrinfo */
1069#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001070static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001071#endif
1072
1073
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074/* Convert a string specifying a host name or one of a few symbolic
1075 names to a numeric IP address. This usually calls gethostbyname()
1076 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001077 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078 an error occurred; then an exception is raised. */
1079
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001081setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 struct addrinfo hints, *res;
1084 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1087 if (name[0] == '\0') {
1088 int siz;
1089 memset(&hints, 0, sizeof(hints));
1090 hints.ai_family = af;
1091 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1092 hints.ai_flags = AI_PASSIVE;
1093 Py_BEGIN_ALLOW_THREADS
1094 ACQUIRE_GETADDRINFO_LOCK
1095 error = getaddrinfo(NULL, "0", &hints, &res);
1096 Py_END_ALLOW_THREADS
1097 /* We assume that those thread-unsafe getaddrinfo() versions
1098 *are* safe regarding their return value, ie. that a
1099 subsequent call to getaddrinfo() does not destroy the
1100 outcome of the first call. */
1101 RELEASE_GETADDRINFO_LOCK
1102 if (error) {
1103 set_gaierror(error);
1104 return -1;
1105 }
1106 switch (res->ai_family) {
1107 case AF_INET:
1108 siz = 4;
1109 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001110#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 case AF_INET6:
1112 siz = 16;
1113 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 default:
1116 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001117 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 "unsupported address family");
1119 return -1;
1120 }
1121 if (res->ai_next) {
1122 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001123 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 "wildcard resolved to multiple address");
1125 return -1;
1126 }
1127 if (res->ai_addrlen < addr_ret_size)
1128 addr_ret_size = res->ai_addrlen;
1129 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1130 freeaddrinfo(res);
1131 return siz;
1132 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001133 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001134 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001135 if (strcmp(name, "255.255.255.255") == 0 ||
1136 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 struct sockaddr_in *sin;
1138 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001139 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 "address family mismatched");
1141 return -1;
1142 }
1143 sin = (struct sockaddr_in *)addr_ret;
1144 memset((void *) sin, '\0', sizeof(*sin));
1145 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001146#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 sin->sin_addr.s_addr = INADDR_BROADCAST;
1150 return sizeof(sin->sin_addr);
1151 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001152
1153 /* avoid a name resolution in case of numeric address */
1154#ifdef HAVE_INET_PTON
1155 /* check for an IPv4 address */
1156 if (af == AF_UNSPEC || af == AF_INET) {
1157 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1158 memset(sin, 0, sizeof(*sin));
1159 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1160 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001161#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001162 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001163#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001164 return 4;
1165 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001167#ifdef ENABLE_IPV6
1168 /* check for an IPv6 address - if the address contains a scope ID, we
1169 * fallback to getaddrinfo(), which can handle translation from interface
1170 * name to interface index */
1171 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1172 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1173 memset(sin, 0, sizeof(*sin));
1174 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1175 sin->sin6_family = AF_INET6;
1176#ifdef HAVE_SOCKADDR_SA_LEN
1177 sin->sin6_len = sizeof(*sin);
1178#endif
1179 return 16;
1180 }
1181 }
1182#endif /* ENABLE_IPV6 */
1183#else /* HAVE_INET_PTON */
1184 /* check for an IPv4 address */
1185 if (af == AF_INET || af == AF_UNSPEC) {
1186 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1187 memset(sin, 0, sizeof(*sin));
1188 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1189 sin->sin_family = AF_INET;
1190#ifdef HAVE_SOCKADDR_SA_LEN
1191 sin->sin_len = sizeof(*sin);
1192#endif
1193 return 4;
1194 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001195 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001196#endif /* HAVE_INET_PTON */
1197
1198 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 memset(&hints, 0, sizeof(hints));
1200 hints.ai_family = af;
1201 Py_BEGIN_ALLOW_THREADS
1202 ACQUIRE_GETADDRINFO_LOCK
1203 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001204#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 if (error == EAI_NONAME && af == AF_UNSPEC) {
1206 /* On Tru64 V5.1, numeric-to-addr conversion fails
1207 if no address family is given. Assume IPv4 for now.*/
1208 hints.ai_family = AF_INET;
1209 error = getaddrinfo(name, NULL, &hints, &res);
1210 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 Py_END_ALLOW_THREADS
1213 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1214 if (error) {
1215 set_gaierror(error);
1216 return -1;
1217 }
1218 if (res->ai_addrlen < addr_ret_size)
1219 addr_ret_size = res->ai_addrlen;
1220 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1221 freeaddrinfo(res);
1222 switch (addr_ret->sa_family) {
1223 case AF_INET:
1224 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001225#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 case AF_INET6:
1227 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001230 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 return -1;
1232 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001233}
1234
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235
Коренберг Марк7766b962018-02-13 00:47:42 +05001236/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001237
Guido van Rossum73624e91994-10-10 17:59:00 +00001238static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001239make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001240{
Коренберг Марк7766b962018-02-13 00:47:42 +05001241 char buf[INET_ADDRSTRLEN];
1242 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1243 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 return NULL;
1245 }
1246 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001247}
1248
Коренберг Марк7766b962018-02-13 00:47:42 +05001249#ifdef ENABLE_IPV6
1250/* Convert IPv6 sockaddr to a Python str. */
1251
1252static PyObject *
1253make_ipv6_addr(const struct sockaddr_in6 *addr)
1254{
1255 char buf[INET6_ADDRSTRLEN];
1256 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1257 PyErr_SetFromErrno(PyExc_OSError);
1258 return NULL;
1259 }
1260 return PyUnicode_FromString(buf);
1261}
1262#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001264#ifdef USE_BLUETOOTH
1265/* Convert a string representation of a Bluetooth address into a numeric
1266 address. Returns the length (6), or raises an exception and returns -1 if
1267 an error occurred. */
1268
1269static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001270setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 unsigned int b0, b1, b2, b3, b4, b5;
1273 char ch;
1274 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1277 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1278 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001279
1280#ifdef MS_WINDOWS
1281 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1282 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1283 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1284 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1285 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1286 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1287#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 bdaddr->b[0] = b0;
1289 bdaddr->b[1] = b1;
1290 bdaddr->b[2] = b2;
1291 bdaddr->b[3] = b3;
1292 bdaddr->b[4] = b4;
1293 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001294#endif
1295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 return 6;
1297 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001298 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 return -1;
1300 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001301}
1302
1303/* Create a string representation of the Bluetooth address. This is always a
1304 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1305 value (zero padded if necessary). */
1306
1307static PyObject *
1308makebdaddr(bdaddr_t *bdaddr)
1309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001311
Greg Bowser8fbece12019-08-02 16:29:52 -04001312#ifdef MS_WINDOWS
1313 int i;
1314 unsigned int octets[6];
1315
1316 for (i = 0; i < 6; ++i) {
1317 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1318 }
1319
1320 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1321 octets[5], octets[4], octets[3],
1322 octets[2], octets[1], octets[0]);
1323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1325 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1326 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001327#endif
1328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001330}
1331#endif
1332
1333
Guido van Rossum30a685f1991-06-27 15:51:29 +00001334/* Create an object representing the given socket address,
1335 suitable for passing it back to bind(), connect() etc.
1336 The family field of the sockaddr structure is inspected
1337 to determine what kind of address it really is. */
1338
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001339/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001341makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 if (addrlen == 0) {
1344 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001345 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 case AF_INET:
1351 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001352 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1353 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 PyObject *ret = NULL;
1355 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1357 Py_DECREF(addrobj);
1358 }
1359 return ret;
1360 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001361
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001362#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 case AF_UNIX:
1364 {
1365 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001366#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001367 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1368 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1369 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 }
1371 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 {
1374 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001375 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 }
1377 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001378#endif /* AF_UNIX */
1379
Martin v. Löwis11017b12006-01-14 18:12:57 +00001380#if defined(AF_NETLINK)
1381 case AF_NETLINK:
1382 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1384 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001385 }
1386#endif /* AF_NETLINK */
1387
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001388#if defined(AF_QIPCRTR)
1389 case AF_QIPCRTR:
1390 {
1391 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1392 return Py_BuildValue("II", a->sq_node, a->sq_port);
1393 }
1394#endif /* AF_QIPCRTR */
1395
caaveryeffc12f2017-09-06 18:18:10 -04001396#if defined(AF_VSOCK)
1397 case AF_VSOCK:
1398 {
1399 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1400 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1401 }
1402#endif /* AF_VSOCK */
1403
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001404#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 case AF_INET6:
1406 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001407 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1408 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 PyObject *ret = NULL;
1410 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001411 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 addrobj,
1413 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001414 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 a->sin6_scope_id);
1416 Py_DECREF(addrobj);
1417 }
1418 return ret;
1419 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001420#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001421
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001422#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 case AF_BLUETOOTH:
1424 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001425
Greg Bowser8fbece12019-08-02 16:29:52 -04001426#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 case BTPROTO_L2CAP:
1428 {
1429 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1430 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1431 PyObject *ret = NULL;
1432 if (addrobj) {
1433 ret = Py_BuildValue("Oi",
1434 addrobj,
1435 _BT_L2_MEMB(a, psm));
1436 Py_DECREF(addrobj);
1437 }
1438 return ret;
1439 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001440
Greg Bowser8fbece12019-08-02 16:29:52 -04001441#endif /* BTPROTO_L2CAP */
1442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 case BTPROTO_RFCOMM:
1444 {
1445 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1446 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1447 PyObject *ret = NULL;
1448 if (addrobj) {
1449 ret = Py_BuildValue("Oi",
1450 addrobj,
1451 _BT_RC_MEMB(a, channel));
1452 Py_DECREF(addrobj);
1453 }
1454 return ret;
1455 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001456
Greg Bowser8fbece12019-08-02 16:29:52 -04001457#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 case BTPROTO_HCI:
1459 {
1460 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001461#if defined(__NetBSD__) || defined(__DragonFly__)
1462 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001463#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 PyObject *ret = NULL;
1465 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1466 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001467#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001469
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001470#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 case BTPROTO_SCO:
1472 {
1473 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1474 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1475 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001476#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001477#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 default:
1480 PyErr_SetString(PyExc_ValueError,
1481 "Unknown Bluetooth protocol");
1482 return NULL;
1483 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001484#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001485
Antoine Pitroub156a462010-10-27 20:13:57 +00001486#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 case AF_PACKET:
1488 {
1489 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001490 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 struct ifreq ifr;
1492 /* need to look up interface name give index */
1493 if (a->sll_ifindex) {
1494 ifr.ifr_ifindex = a->sll_ifindex;
1495 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1496 ifname = ifr.ifr_name;
1497 }
1498 return Py_BuildValue("shbhy#",
1499 ifname,
1500 ntohs(a->sll_protocol),
1501 a->sll_pkttype,
1502 a->sll_hatype,
1503 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001504 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001506#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507
Christian Heimes043d6f62008-01-07 17:19:16 +00001508#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 case AF_TIPC:
1510 {
1511 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1512 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1513 return Py_BuildValue("IIIII",
1514 a->addrtype,
1515 a->addr.nameseq.type,
1516 a->addr.nameseq.lower,
1517 a->addr.nameseq.upper,
1518 a->scope);
1519 } else if (a->addrtype == TIPC_ADDR_NAME) {
1520 return Py_BuildValue("IIIII",
1521 a->addrtype,
1522 a->addr.name.name.type,
1523 a->addr.name.name.instance,
1524 a->addr.name.name.instance,
1525 a->scope);
1526 } else if (a->addrtype == TIPC_ADDR_ID) {
1527 return Py_BuildValue("IIIII",
1528 a->addrtype,
1529 a->addr.id.node,
1530 a->addr.id.ref,
1531 0,
1532 a->scope);
1533 } else {
1534 PyErr_SetString(PyExc_ValueError,
1535 "Invalid address type");
1536 return NULL;
1537 }
1538 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001539#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001540
Serhiy Storchakad3187152017-11-09 18:00:38 +02001541#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001542 case AF_CAN:
1543 {
1544 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001545 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001546 struct ifreq ifr;
1547 /* need to look up interface name given index */
1548 if (a->can_ifindex) {
1549 ifr.ifr_ifindex = a->can_ifindex;
1550 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1551 ifname = ifr.ifr_name;
1552 }
1553
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001554 switch (proto) {
1555#ifdef CAN_ISOTP
1556 case CAN_ISOTP:
1557 {
1558 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1559 ifname,
1560 a->can_addr.tp.rx_id,
1561 a->can_addr.tp.tx_id);
1562 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001563#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001564 default:
1565 {
bggardner954900a2019-09-12 06:02:48 -04001566 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001567 ifname);
1568 }
1569 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001570 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001571#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001572
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001573#ifdef PF_SYSTEM
1574 case PF_SYSTEM:
1575 switch(proto) {
1576#ifdef SYSPROTO_CONTROL
1577 case SYSPROTO_CONTROL:
1578 {
1579 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1580 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1581 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001582#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001583 default:
1584 PyErr_SetString(PyExc_ValueError,
1585 "Invalid address type");
1586 return 0;
1587 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001588#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001589
Christian Heimesdffa3942016-09-05 23:54:41 +02001590#ifdef HAVE_SOCKADDR_ALG
1591 case AF_ALG:
1592 {
1593 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1594 return Py_BuildValue("s#s#HH",
1595 a->salg_type,
1596 strnlen((const char*)a->salg_type,
1597 sizeof(a->salg_type)),
1598 a->salg_name,
1599 strnlen((const char*)a->salg_name,
1600 sizeof(a->salg_name)),
1601 a->salg_feat,
1602 a->salg_mask);
1603 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001604#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 default:
1609 /* If we don't know the address family, don't raise an
1610 exception -- return it as an (int, bytes) tuple. */
1611 return Py_BuildValue("iy#",
1612 addr->sa_family,
1613 addr->sa_data,
1614 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001617}
1618
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001619/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1620 (in particular, numeric IP addresses). */
1621struct maybe_idna {
1622 PyObject *obj;
1623 char *buf;
1624};
1625
1626static void
1627idna_cleanup(struct maybe_idna *data)
1628{
1629 Py_CLEAR(data->obj);
1630}
1631
1632static int
1633idna_converter(PyObject *obj, struct maybe_idna *data)
1634{
1635 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001636 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 if (obj == NULL) {
1638 idna_cleanup(data);
1639 return 1;
1640 }
1641 data->obj = NULL;
1642 len = -1;
1643 if (PyBytes_Check(obj)) {
1644 data->buf = PyBytes_AsString(obj);
1645 len = PyBytes_Size(obj);
1646 }
1647 else if (PyByteArray_Check(obj)) {
1648 data->buf = PyByteArray_AsString(obj);
1649 len = PyByteArray_Size(obj);
1650 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001651 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001652 if (PyUnicode_READY(obj) == -1) {
1653 return 0;
1654 }
1655 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001656 data->buf = PyUnicode_DATA(obj);
1657 len = PyUnicode_GET_LENGTH(obj);
1658 }
1659 else {
1660 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1661 if (!obj2) {
1662 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1663 return 0;
1664 }
1665 assert(PyBytes_Check(obj2));
1666 data->obj = obj2;
1667 data->buf = PyBytes_AS_STRING(obj2);
1668 len = PyBytes_GET_SIZE(obj2);
1669 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001670 }
1671 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001672 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1673 obj->ob_type->tp_name);
1674 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001675 }
1676 if (strlen(data->buf) != len) {
1677 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001678 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001679 return 0;
1680 }
1681 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001682}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001683
1684/* Parse a socket address argument according to the socket object's
1685 address family. Return 1 if the address was in the proper format,
1686 0 of not. The address is returned through addr_ret, its length
1687 through len_ret. */
1688
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001689static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001690getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001691 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001695#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 case AF_UNIX:
1697 {
1698 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001699 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001700 int retval = 0;
1701
1702 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1703 allow embedded nulls on Linux. */
1704 if (PyUnicode_Check(args)) {
1705 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1706 return 0;
1707 }
1708 else
1709 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001710 if (!PyArg_Parse(args, "y*", &path)) {
1711 Py_DECREF(args);
1712 return retval;
1713 }
1714 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001717#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001718 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001720 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001721 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001723 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 }
1725 }
1726 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001727#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 {
1729 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001730 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001731 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001733 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001735 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 }
1737 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001738 memcpy(addr->sun_path, path.buf, path.len);
1739 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001740 retval = 1;
1741 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001742 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001743 Py_DECREF(args);
1744 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001746#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001747
Martin v. Löwis11017b12006-01-14 18:12:57 +00001748#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 case AF_NETLINK:
1750 {
1751 struct sockaddr_nl* addr;
1752 int pid, groups;
1753 addr = (struct sockaddr_nl *)addr_ret;
1754 if (!PyTuple_Check(args)) {
1755 PyErr_Format(
1756 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001757 "%s(): AF_NETLINK address must be tuple, not %.500s",
1758 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return 0;
1760 }
Oren Milman735171e2018-09-11 19:51:29 +03001761 if (!PyArg_ParseTuple(args,
1762 "II;AF_NETLINK address must be a pair "
1763 "(pid, groups)",
1764 &pid, &groups))
1765 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 addr->nl_family = AF_NETLINK;
1769 addr->nl_pid = pid;
1770 addr->nl_groups = groups;
1771 *len_ret = sizeof(*addr);
1772 return 1;
1773 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001774#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001775
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001776#if defined(AF_QIPCRTR)
1777 case AF_QIPCRTR:
1778 {
1779 struct sockaddr_qrtr* addr;
1780 unsigned int node, port;
1781 addr = (struct sockaddr_qrtr *)addr_ret;
1782 if (!PyTuple_Check(args)) {
1783 PyErr_Format(
1784 PyExc_TypeError,
1785 "getsockaddrarg: "
1786 "AF_QIPCRTR address must be tuple, not %.500s",
1787 Py_TYPE(args)->tp_name);
1788 return 0;
1789 }
1790 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1791 return 0;
1792 addr->sq_family = AF_QIPCRTR;
1793 addr->sq_node = node;
1794 addr->sq_port = port;
1795 *len_ret = sizeof(*addr);
1796 return 1;
1797 }
1798#endif /* AF_QIPCRTR */
1799
caaveryeffc12f2017-09-06 18:18:10 -04001800#if defined(AF_VSOCK)
1801 case AF_VSOCK:
1802 {
1803 struct sockaddr_vm* addr;
1804 int port, cid;
1805 addr = (struct sockaddr_vm *)addr_ret;
1806 memset(addr, 0, sizeof(struct sockaddr_vm));
1807 if (!PyTuple_Check(args)) {
1808 PyErr_Format(
1809 PyExc_TypeError,
1810 "getsockaddrarg: "
1811 "AF_VSOCK address must be tuple, not %.500s",
1812 Py_TYPE(args)->tp_name);
1813 return 0;
1814 }
1815 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1816 return 0;
1817 addr->svm_family = s->sock_family;
1818 addr->svm_port = port;
1819 addr->svm_cid = cid;
1820 *len_ret = sizeof(*addr);
1821 return 1;
1822 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001823#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001824
1825
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001826#ifdef AF_RDS
1827 case AF_RDS:
1828 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001829#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 case AF_INET:
1832 {
1833 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001834 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 int port, result;
1836 if (!PyTuple_Check(args)) {
1837 PyErr_Format(
1838 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001839 "%s(): AF_INET address must be tuple, not %.500s",
1840 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 return 0;
1842 }
Oren Milman735171e2018-09-11 19:51:29 +03001843 if (!PyArg_ParseTuple(args,
1844 "O&i;AF_INET address must be a pair "
1845 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001846 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001847 {
1848 assert(PyErr_Occurred());
1849 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1850 PyErr_Format(PyExc_OverflowError,
1851 "%s(): port must be 0-65535.", caller);
1852 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001854 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001856 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001858 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (result < 0)
1860 return 0;
1861 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001862 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001864 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 return 0;
1866 }
1867 addr->sin_family = AF_INET;
1868 addr->sin_port = htons((short)port);
1869 *len_ret = sizeof *addr;
1870 return 1;
1871 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001872
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001873#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 case AF_INET6:
1875 {
1876 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001877 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001878 int port, result;
1879 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 flowinfo = scope_id = 0;
1881 if (!PyTuple_Check(args)) {
1882 PyErr_Format(
1883 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001884 "%s(): AF_INET6 address must be tuple, not %.500s",
1885 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 return 0;
1887 }
Oren Milman735171e2018-09-11 19:51:29 +03001888 if (!PyArg_ParseTuple(args,
1889 "O&i|II;AF_INET6 address must be a tuple "
1890 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001891 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001892 &scope_id))
1893 {
1894 assert(PyErr_Occurred());
1895 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1896 PyErr_Format(PyExc_OverflowError,
1897 "%s(): port must be 0-65535.", caller);
1898 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 return 0;
1900 }
1901 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001902 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001904 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 if (result < 0)
1906 return 0;
1907 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001908 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001910 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 return 0;
1912 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001913 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001914 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001915 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001916 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001917 return 0;
1918 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 addr->sin6_family = s->sock_family;
1920 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001921 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 addr->sin6_scope_id = scope_id;
1923 *len_ret = sizeof *addr;
1924 return 1;
1925 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001926#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001927
Hye-Shik Chang81268602004-02-02 06:05:24 +00001928#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 case AF_BLUETOOTH:
1930 {
1931 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001932#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 case BTPROTO_L2CAP:
1934 {
1935 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001936 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 addr = (struct sockaddr_l2 *)addr_ret;
1939 memset(addr, 0, sizeof(struct sockaddr_l2));
1940 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1941 if (!PyArg_ParseTuple(args, "si", &straddr,
1942 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001943 PyErr_Format(PyExc_OSError,
1944 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 return 0;
1946 }
1947 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1948 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 *len_ret = sizeof *addr;
1951 return 1;
1952 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001953#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 case BTPROTO_RFCOMM:
1955 {
1956 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001957 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 addr = (struct sockaddr_rc *)addr_ret;
1960 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1961 if (!PyArg_ParseTuple(args, "si", &straddr,
1962 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001963 PyErr_Format(PyExc_OSError,
1964 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 return 0;
1966 }
1967 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1968 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 *len_ret = sizeof *addr;
1971 return 1;
1972 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001973#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 case BTPROTO_HCI:
1975 {
1976 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001977#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001978 const char *straddr;
1979 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1980 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001981 PyErr_Format(PyExc_OSError, "%s: "
1982 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001983 return 0;
1984 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001985 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001986 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1987 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001988#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1990 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001991 PyErr_Format(PyExc_OSError,
1992 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 return 0;
1994 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001995#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 *len_ret = sizeof *addr;
1997 return 1;
1998 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001999#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 case BTPROTO_SCO:
2001 {
2002 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002003 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 addr = (struct sockaddr_sco *)addr_ret;
2006 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
2007 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03002008 PyErr_Format(PyExc_OSError,
2009 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 return 0;
2011 }
2012 straddr = PyBytes_AS_STRING(args);
2013 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
2014 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 *len_ret = sizeof *addr;
2017 return 1;
2018 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002019#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002020#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 default:
Oren Milman735171e2018-09-11 19:51:29 +03002022 PyErr_Format(PyExc_OSError,
2023 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 return 0;
2025 }
2026 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002027#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002028
Antoine Pitroub156a462010-10-27 20:13:57 +00002029#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 case AF_PACKET:
2031 {
2032 struct sockaddr_ll* addr;
2033 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002034 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 int protoNumber;
2036 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04002037 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002038 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (!PyTuple_Check(args)) {
2041 PyErr_Format(
2042 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002043 "%s(): AF_PACKET address must be tuple, not %.500s",
2044 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 return 0;
2046 }
Oren Milman735171e2018-09-11 19:51:29 +03002047 /* XXX: improve the default error message according to the
2048 documentation of AF_PACKET, which would be added as part
2049 of bpo-25041. */
2050 if (!PyArg_ParseTuple(args,
2051 "si|iiy*;AF_PACKET address must be a tuple of "
2052 "two to five elements",
2053 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002054 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002055 {
2056 assert(PyErr_Occurred());
2057 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2058 PyErr_Format(PyExc_OverflowError,
2059 "%s(): address argument out of range", caller);
2060 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2064 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2065 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2066 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002067 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 return 0;
2069 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002070 if (haddr.buf && haddr.len > 8) {
2071 PyErr_SetString(PyExc_ValueError,
2072 "Hardware address must be 8 bytes or less");
2073 PyBuffer_Release(&haddr);
2074 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 }
2076 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002077 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002079 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002080 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 return 0;
2082 }
2083 addr = (struct sockaddr_ll*)addr_ret;
2084 addr->sll_family = AF_PACKET;
2085 addr->sll_protocol = htons((short)protoNumber);
2086 addr->sll_ifindex = ifr.ifr_ifindex;
2087 addr->sll_pkttype = pkttype;
2088 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002089 if (haddr.buf) {
2090 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2091 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002093 else
2094 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002096 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 return 1;
2098 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002099#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002100
Christian Heimes043d6f62008-01-07 17:19:16 +00002101#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 case AF_TIPC:
2103 {
2104 unsigned int atype, v1, v2, v3;
2105 unsigned int scope = TIPC_CLUSTER_SCOPE;
2106 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (!PyTuple_Check(args)) {
2109 PyErr_Format(
2110 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002111 "%s(): AF_TIPC address must be tuple, not %.500s",
2112 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 return 0;
2114 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002117 "IIII|I;AF_TIPC address must be a tuple "
2118 "(addr_type, v1, v2, v3[, scope])",
2119 &atype, &v1, &v2, &v3, &scope))
2120 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002122 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 addr = (struct sockaddr_tipc *) addr_ret;
2125 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 addr->family = AF_TIPC;
2128 addr->scope = scope;
2129 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 if (atype == TIPC_ADDR_NAMESEQ) {
2132 addr->addr.nameseq.type = v1;
2133 addr->addr.nameseq.lower = v2;
2134 addr->addr.nameseq.upper = v3;
2135 } else if (atype == TIPC_ADDR_NAME) {
2136 addr->addr.name.name.type = v1;
2137 addr->addr.name.name.instance = v2;
2138 } else if (atype == TIPC_ADDR_ID) {
2139 addr->addr.id.node = v1;
2140 addr->addr.id.ref = v2;
2141 } else {
2142 /* Shouldn't happen */
2143 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2144 return 0;
2145 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 return 1;
2150 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002151#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002152
Serhiy Storchakad3187152017-11-09 18:00:38 +02002153#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002154 case AF_CAN:
2155 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002156#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002157 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002158 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002159#endif
2160#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002161 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002162#endif
2163#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002164 {
2165 struct sockaddr_can *addr;
2166 PyObject *interfaceName;
2167 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002168 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002169 addr = (struct sockaddr_can *)addr_ret;
2170
Oren Milman735171e2018-09-11 19:51:29 +03002171 if (!PyTuple_Check(args)) {
2172 PyErr_Format(PyExc_TypeError,
2173 "%s(): AF_CAN address must be tuple, not %.500s",
2174 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002175 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002176 }
2177 if (!PyArg_ParseTuple(args,
2178 "O&;AF_CAN address must be a tuple "
2179 "(interface, )",
2180 PyUnicode_FSConverter, &interfaceName))
2181 {
2182 return 0;
2183 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002184
2185 len = PyBytes_GET_SIZE(interfaceName);
2186
2187 if (len == 0) {
2188 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002189 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002190 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2191 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002192 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2193 s->errorhandler();
2194 Py_DECREF(interfaceName);
2195 return 0;
2196 }
2197 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002198 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002199 "AF_CAN interface name too long");
2200 Py_DECREF(interfaceName);
2201 return 0;
2202 }
2203
2204 addr->can_family = AF_CAN;
2205 addr->can_ifindex = ifr.ifr_ifindex;
2206
2207 *len_ret = sizeof(*addr);
2208 Py_DECREF(interfaceName);
2209 return 1;
2210 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002211#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002212
2213#ifdef CAN_ISOTP
2214 case CAN_ISOTP:
2215 {
2216 struct sockaddr_can *addr;
2217 PyObject *interfaceName;
2218 struct ifreq ifr;
2219 Py_ssize_t len;
2220 unsigned long int rx_id, tx_id;
2221
2222 addr = (struct sockaddr_can *)addr_ret;
2223
2224 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2225 &interfaceName,
2226 &rx_id,
2227 &tx_id))
2228 return 0;
2229
2230 len = PyBytes_GET_SIZE(interfaceName);
2231
2232 if (len == 0) {
2233 ifr.ifr_ifindex = 0;
2234 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2235 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2236 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2237 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2238 s->errorhandler();
2239 Py_DECREF(interfaceName);
2240 return 0;
2241 }
2242 } else {
2243 PyErr_SetString(PyExc_OSError,
2244 "AF_CAN interface name too long");
2245 Py_DECREF(interfaceName);
2246 return 0;
2247 }
2248
2249 addr->can_family = AF_CAN;
2250 addr->can_ifindex = ifr.ifr_ifindex;
2251 addr->can_addr.tp.rx_id = rx_id;
2252 addr->can_addr.tp.tx_id = tx_id;
2253
2254 *len_ret = sizeof(*addr);
2255 Py_DECREF(interfaceName);
2256 return 1;
2257 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002258#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002259 default:
Oren Milman735171e2018-09-11 19:51:29 +03002260 PyErr_Format(PyExc_OSError,
2261 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002262 return 0;
2263 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002264#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002265
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002266#ifdef PF_SYSTEM
2267 case PF_SYSTEM:
2268 switch (s->sock_proto) {
2269#ifdef SYSPROTO_CONTROL
2270 case SYSPROTO_CONTROL:
2271 {
2272 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002273
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002274 addr = (struct sockaddr_ctl *)addr_ret;
2275 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002276 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002277
2278 if (PyUnicode_Check(args)) {
2279 struct ctl_info info;
2280 PyObject *ctl_name;
2281
2282 if (!PyArg_Parse(args, "O&",
2283 PyUnicode_FSConverter, &ctl_name)) {
2284 return 0;
2285 }
2286
Victor Stinnerf50e1872015-03-20 11:32:24 +01002287 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002288 PyErr_SetString(PyExc_ValueError,
2289 "provided string is too long");
2290 Py_DECREF(ctl_name);
2291 return 0;
2292 }
2293 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2294 sizeof(info.ctl_name));
2295 Py_DECREF(ctl_name);
2296
2297 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2298 PyErr_SetString(PyExc_OSError,
2299 "cannot find kernel control with provided name");
2300 return 0;
2301 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002302
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002303 addr->sc_id = info.ctl_id;
2304 addr->sc_unit = 0;
2305 } else if (!PyArg_ParseTuple(args, "II",
2306 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002307 PyErr_Format(PyExc_TypeError,
2308 "%s(): PF_SYSTEM address must be a str or "
2309 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002310 return 0;
2311 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002312
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002313 *len_ret = sizeof(*addr);
2314 return 1;
2315 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002316#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002317 default:
Oren Milman735171e2018-09-11 19:51:29 +03002318 PyErr_Format(PyExc_OSError,
2319 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002320 return 0;
2321 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002322#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002323#ifdef HAVE_SOCKADDR_ALG
2324 case AF_ALG:
2325 {
2326 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002327 const char *type;
2328 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002329 sa = (struct sockaddr_alg *)addr_ret;
2330
2331 memset(sa, 0, sizeof(*sa));
2332 sa->salg_family = AF_ALG;
2333
Oren Milman735171e2018-09-11 19:51:29 +03002334 if (!PyTuple_Check(args)) {
2335 PyErr_Format(PyExc_TypeError,
2336 "%s(): AF_ALG address must be tuple, not %.500s",
2337 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002338 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002339 }
2340 if (!PyArg_ParseTuple(args,
2341 "ss|HH;AF_ALG address must be a tuple "
2342 "(type, name[, feat[, mask]])",
2343 &type, &name, &sa->salg_feat, &sa->salg_mask))
2344 {
2345 return 0;
2346 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002347 /* sockaddr_alg has fixed-sized char arrays for type, and name
2348 * both must be NULL terminated.
2349 */
2350 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002351 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2352 return 0;
2353 }
2354 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002355 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002356 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2357 return 0;
2358 }
2359 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2360
2361 *len_ret = sizeof(*sa);
2362 return 1;
2363 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002364#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 default:
Oren Milman735171e2018-09-11 19:51:29 +03002369 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002373}
2374
Guido van Rossum30a685f1991-06-27 15:51:29 +00002375
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002377 Return 1 if the family is known, 0 otherwise. The length is returned
2378 through len_ret. */
2379
2380static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002381getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002384
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002385#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 case AF_UNIX:
2387 {
2388 *len_ret = sizeof (struct sockaddr_un);
2389 return 1;
2390 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002391#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002392
Martin v. Löwis11017b12006-01-14 18:12:57 +00002393#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002394 case AF_NETLINK:
2395 {
2396 *len_ret = sizeof (struct sockaddr_nl);
2397 return 1;
2398 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002399#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002400
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002401#if defined(AF_QIPCRTR)
2402 case AF_QIPCRTR:
2403 {
2404 *len_ret = sizeof (struct sockaddr_qrtr);
2405 return 1;
2406 }
2407#endif /* AF_QIPCRTR */
2408
caaveryeffc12f2017-09-06 18:18:10 -04002409#if defined(AF_VSOCK)
2410 case AF_VSOCK:
2411 {
2412 *len_ret = sizeof (struct sockaddr_vm);
2413 return 1;
2414 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002415#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002416
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002417#ifdef AF_RDS
2418 case AF_RDS:
2419 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002420#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 case AF_INET:
2423 {
2424 *len_ret = sizeof (struct sockaddr_in);
2425 return 1;
2426 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002427
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002428#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 case AF_INET6:
2430 {
2431 *len_ret = sizeof (struct sockaddr_in6);
2432 return 1;
2433 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002434#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002435
Hye-Shik Chang81268602004-02-02 06:05:24 +00002436#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 case AF_BLUETOOTH:
2438 {
2439 switch(s->sock_proto)
2440 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002441
Greg Bowser8fbece12019-08-02 16:29:52 -04002442#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 case BTPROTO_L2CAP:
2444 *len_ret = sizeof (struct sockaddr_l2);
2445 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002446#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 case BTPROTO_RFCOMM:
2448 *len_ret = sizeof (struct sockaddr_rc);
2449 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002450#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 case BTPROTO_HCI:
2452 *len_ret = sizeof (struct sockaddr_hci);
2453 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002454#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 case BTPROTO_SCO:
2456 *len_ret = sizeof (struct sockaddr_sco);
2457 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002458#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002459#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002461 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 "unknown BT protocol");
2463 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 }
2466 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002467#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002468
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002469#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 case AF_PACKET:
2471 {
2472 *len_ret = sizeof (struct sockaddr_ll);
2473 return 1;
2474 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002475#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002476
Christian Heimes043d6f62008-01-07 17:19:16 +00002477#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 case AF_TIPC:
2479 {
2480 *len_ret = sizeof (struct sockaddr_tipc);
2481 return 1;
2482 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002483#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002484
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002485#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002486 case AF_CAN:
2487 {
2488 *len_ret = sizeof (struct sockaddr_can);
2489 return 1;
2490 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002491#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002492
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002493#ifdef PF_SYSTEM
2494 case PF_SYSTEM:
2495 switch(s->sock_proto) {
2496#ifdef SYSPROTO_CONTROL
2497 case SYSPROTO_CONTROL:
2498 *len_ret = sizeof (struct sockaddr_ctl);
2499 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002500#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002501 default:
2502 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2503 "unknown PF_SYSTEM protocol");
2504 return 0;
2505 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002506#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002507#ifdef HAVE_SOCKADDR_ALG
2508 case AF_ALG:
2509 {
2510 *len_ret = sizeof (struct sockaddr_alg);
2511 return 1;
2512 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002513#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002518 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002522}
2523
2524
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002525/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2526 Currently, these methods are only compiled if the RFC 2292/3542
2527 CMSG_LEN() macro is available. Older systems seem to have used
2528 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2529 it may be possible to define CMSG_LEN() that way if it's not
2530 provided. Some architectures might need extra padding after the
2531 cmsghdr, however, and CMSG_LEN() would have to take account of
2532 this. */
2533#ifdef CMSG_LEN
2534/* If length is in range, set *result to CMSG_LEN(length) and return
2535 true; otherwise, return false. */
2536static int
2537get_CMSG_LEN(size_t length, size_t *result)
2538{
2539 size_t tmp;
2540
2541 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2542 return 0;
2543 tmp = CMSG_LEN(length);
2544 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2545 return 0;
2546 *result = tmp;
2547 return 1;
2548}
2549
2550#ifdef CMSG_SPACE
2551/* If length is in range, set *result to CMSG_SPACE(length) and return
2552 true; otherwise, return false. */
2553static int
2554get_CMSG_SPACE(size_t length, size_t *result)
2555{
2556 size_t tmp;
2557
2558 /* Use CMSG_SPACE(1) here in order to take account of the padding
2559 necessary before *and* after the data. */
2560 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2561 return 0;
2562 tmp = CMSG_SPACE(length);
2563 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2564 return 0;
2565 *result = tmp;
2566 return 1;
2567}
2568#endif
2569
2570/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2571 pointer in msg->msg_control with at least "space" bytes after it,
2572 and its cmsg_len member inside the buffer. */
2573static int
2574cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2575{
2576 size_t cmsg_offset;
2577 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2578 sizeof(cmsgh->cmsg_len));
2579
Charles-François Natali466517d2011-08-28 18:23:43 +02002580 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002581 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002582 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002583 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2584 annoying under OS X as it's unsigned there and so it triggers a
2585 tautological comparison warning under Clang when compared against 0.
2586 Since the check is valid on other platforms, silence the warning under
2587 Clang. */
2588 #ifdef __clang__
2589 #pragma clang diagnostic push
2590 #pragma clang diagnostic ignored "-Wtautological-compare"
2591 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002592 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002593 #pragma GCC diagnostic push
2594 #pragma GCC diagnostic ignored "-Wtype-limits"
2595 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002596 if (msg->msg_controllen < 0)
2597 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002598 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002599 #pragma GCC diagnostic pop
2600 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002601 #ifdef __clang__
2602 #pragma clang diagnostic pop
2603 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002604 if (space < cmsg_len_end)
2605 space = cmsg_len_end;
2606 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2607 return (cmsg_offset <= (size_t)-1 - space &&
2608 cmsg_offset + space <= msg->msg_controllen);
2609}
2610
2611/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2612 *space to number of bytes following it in the buffer and return
2613 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2614 msg->msg_controllen are valid. */
2615static int
2616get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2617{
2618 size_t data_offset;
2619 char *data_ptr;
2620
2621 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2622 return 0;
2623 data_offset = data_ptr - (char *)msg->msg_control;
2624 if (data_offset > msg->msg_controllen)
2625 return 0;
2626 *space = msg->msg_controllen - data_offset;
2627 return 1;
2628}
2629
2630/* If cmsgh is invalid or not contained in the buffer pointed to by
2631 msg->msg_control, return -1. If cmsgh is valid and its associated
2632 data is entirely contained in the buffer, set *data_len to the
2633 length of the associated data and return 0. If only part of the
2634 associated data is contained in the buffer but cmsgh is otherwise
2635 valid, set *data_len to the length contained in the buffer and
2636 return 1. */
2637static int
2638get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2639{
2640 size_t space, cmsg_data_len;
2641
2642 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2643 cmsgh->cmsg_len < CMSG_LEN(0))
2644 return -1;
2645 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2646 if (!get_cmsg_data_space(msg, cmsgh, &space))
2647 return -1;
2648 if (space >= cmsg_data_len) {
2649 *data_len = cmsg_data_len;
2650 return 0;
2651 }
2652 *data_len = space;
2653 return 1;
2654}
2655#endif /* CMSG_LEN */
2656
2657
Victor Stinner31bf2d52015-04-01 21:57:09 +02002658struct sock_accept {
2659 socklen_t *addrlen;
2660 sock_addr_t *addrbuf;
2661 SOCKET_T result;
2662};
2663
2664#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2665/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2666static int accept4_works = -1;
2667#endif
2668
2669static int
2670sock_accept_impl(PySocketSockObject *s, void *data)
2671{
2672 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002673 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2674 socklen_t *paddrlen = ctx->addrlen;
2675#ifdef HAVE_SOCKADDR_ALG
2676 /* AF_ALG does not support accept() with addr and raises
2677 * ECONNABORTED instead. */
2678 if (s->sock_family == AF_ALG) {
2679 addr = NULL;
2680 paddrlen = NULL;
2681 *ctx->addrlen = 0;
2682 }
2683#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002684
2685#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2686 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002687 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002688 SOCK_CLOEXEC);
2689 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2690 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2691 accept4_works = (errno != ENOSYS);
2692 }
2693 }
2694 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002695 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002696#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002697 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002698#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002699
2700#ifdef MS_WINDOWS
2701 return (ctx->result != INVALID_SOCKET);
2702#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002703 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002704#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002705}
2706
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002707/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002708
Guido van Rossum73624e91994-10-10 17:59:00 +00002709static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302710sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002713 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 socklen_t addrlen;
2715 PyObject *sock = NULL;
2716 PyObject *addr = NULL;
2717 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002718 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (!getsockaddrlen(s, &addrlen))
2721 return NULL;
2722 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (!IS_SELECTABLE(s))
2725 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002726
Victor Stinner31bf2d52015-04-01 21:57:09 +02002727 ctx.addrlen = &addrlen;
2728 ctx.addrbuf = &addrbuf;
2729 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002731 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002732
Victor Stinnerdaf45552013-08-28 00:53:59 +02002733#ifdef MS_WINDOWS
2734 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2735 PyErr_SetFromWindowsErr(0);
2736 SOCKETCLOSE(newfd);
2737 goto finally;
2738 }
2739#else
2740
2741#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2742 if (!accept4_works)
2743#endif
2744 {
2745 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2746 SOCKETCLOSE(newfd);
2747 goto finally;
2748 }
2749 }
2750#endif
2751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 sock = PyLong_FromSocket_t(newfd);
2753 if (sock == NULL) {
2754 SOCKETCLOSE(newfd);
2755 goto finally;
2756 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2759 addrlen, s->sock_proto);
2760 if (addr == NULL)
2761 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002764
Guido van Rossum67f7a382002-06-06 21:08:16 +00002765finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 Py_XDECREF(sock);
2767 Py_XDECREF(addr);
2768 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002769}
2770
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002771PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002772"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002773\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002774Wait for an incoming connection. Return a new socket file descriptor\n\
2775representing the connection, and the address of the client.\n\
2776For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002777
Guido van Rossum11ba0942002-06-13 15:07:44 +00002778/* s.setblocking(flag) method. Argument:
2779 False -- non-blocking mode; same as settimeout(0)
2780 True -- blocking mode; same as settimeout(None)
2781*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002782
Guido van Rossum73624e91994-10-10 17:59:00 +00002783static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002784sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002785{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002786 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 block = PyLong_AsLong(arg);
2789 if (block == -1 && PyErr_Occurred())
2790 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002791
Victor Stinner9001d802015-04-06 23:06:01 +02002792 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002793 if (internal_setblocking(s, block) == -1) {
2794 return NULL;
2795 }
2796 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002797}
Guido van Rossume4485b01994-09-07 14:32:49 +00002798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002800"setblocking(flag)\n\
2801\n\
2802Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002803setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002804setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002805
Yury Selivanovf11b4602018-01-28 17:27:38 -05002806/* s.getblocking() method.
2807 Returns True if socket is in blocking mode,
2808 False if it is in non-blocking mode.
2809*/
2810static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302811sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002812{
2813 if (s->sock_timeout) {
2814 Py_RETURN_TRUE;
2815 }
2816 else {
2817 Py_RETURN_FALSE;
2818 }
2819}
2820
2821PyDoc_STRVAR(getblocking_doc,
2822"getblocking()\n\
2823\n\
2824Returns True if socket is in blocking mode, or False if it\n\
2825is in non-blocking mode.");
2826
Victor Stinner71694d52015-03-28 01:18:54 +01002827static int
2828socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2829{
2830#ifdef MS_WINDOWS
2831 struct timeval tv;
2832#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002833#ifndef HAVE_POLL
2834 _PyTime_t ms;
2835#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002836 int overflow = 0;
2837
2838 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002839 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002840 return 0;
2841 }
2842
Victor Stinner869e1772015-03-30 03:49:14 +02002843 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002844 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002845 return -1;
2846
2847 if (*timeout < 0) {
2848 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2849 return -1;
2850 }
2851
2852#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002853 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002854#endif
2855#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002856 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002857 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002858#endif
2859 if (overflow) {
2860 PyErr_SetString(PyExc_OverflowError,
2861 "timeout doesn't fit into C timeval");
2862 return -1;
2863 }
2864
2865 return 0;
2866}
2867
Guido van Rossum11ba0942002-06-13 15:07:44 +00002868/* s.settimeout(timeout) method. Argument:
2869 None -- no timeout, blocking mode; same as setblocking(True)
2870 0.0 -- non-blocking mode; same as setblocking(False)
2871 > 0 -- timeout mode; operations time out after timeout seconds
2872 < 0 -- illegal; raises an exception
2873*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002874static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002875sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002876{
Victor Stinner71694d52015-03-28 01:18:54 +01002877 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002878
Victor Stinner71694d52015-03-28 01:18:54 +01002879 if (socket_parse_timeout(&timeout, arg) < 0)
2880 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002883
2884 int block = timeout < 0;
2885 /* Blocking mode for a Python socket object means that operations
2886 like :meth:`recv` or :meth:`sendall` will block the execution of
2887 the current thread until they are complete or aborted with a
2888 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2889 the underlying FD is in a blocking mode. When timeout is a positive
2890 number, the FD is in a non-blocking mode, and socket ops are
2891 implemented with a `select()` call.
2892
2893 When timeout is 0.0, the FD is in a non-blocking mode.
2894
2895 This table summarizes all states in which the socket object and
2896 its underlying FD can be:
2897
2898 ==================== ===================== ==============
2899 `gettimeout()` `getblocking()` FD
2900 ==================== ===================== ==============
2901 ``None`` ``True`` blocking
2902 ``0.0`` ``False`` non-blocking
2903 ``> 0`` ``True`` non-blocking
2904 */
2905
2906 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002907 return NULL;
2908 }
2909 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910}
2911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002912PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002913"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002915Set a timeout on socket operations. 'timeout' can be a float,\n\
2916giving in seconds, or None. Setting a timeout of None disables\n\
2917the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002918Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002919
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002920/* s.gettimeout() method.
2921 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002922static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302923sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002924{
Victor Stinner71694d52015-03-28 01:18:54 +01002925 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002926 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 }
Victor Stinner71694d52015-03-28 01:18:54 +01002928 else {
2929 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2930 return PyFloat_FromDouble(seconds);
2931 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002932}
2933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002935"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002936\n\
oldkaa0735f2018-02-02 16:52:55 +08002937Returns the timeout in seconds (float) associated with socket\n\
2938operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002939operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002940
Guido van Rossumaee08791992-09-08 09:05:33 +00002941/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002942 With an integer third argument, sets an integer optval with optlen=4.
2943 With None as third argument and an integer fourth argument, set
2944 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002945 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002946 use optional built-in module 'struct' to encode the string.
2947*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002948
Guido van Rossum73624e91994-10-10 17:59:00 +00002949static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002950sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 int level;
2953 int optname;
2954 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002955 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002957 unsigned int optlen;
2958 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002959
caaveryeffc12f2017-09-06 18:18:10 -04002960#ifdef AF_VSOCK
2961 if (s->sock_family == AF_VSOCK) {
2962 uint64_t vflag; // Must be set width of 64 bits
2963 /* setsockopt(level, opt, flag) */
2964 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2965 &level, &optname, &vflag)) {
2966 // level should always be set to AF_VSOCK
2967 res = setsockopt(s->sock_fd, level, optname,
2968 (void*)&vflag, sizeof vflag);
2969 goto done;
2970 }
2971 return NULL;
2972 }
2973#endif
2974
Christian Heimesdffa3942016-09-05 23:54:41 +02002975 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 if (PyArg_ParseTuple(args, "iii:setsockopt",
2977 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002978 res = setsockopt(s->sock_fd, level, optname,
2979 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002980 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002982
2983 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002984 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002985 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2986 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2987 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002988 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002989 NULL, (socklen_t)optlen);
2990 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002992
2993 PyErr_Clear();
2994 /* setsockopt(level, opt, buffer) */
2995 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2996 &level, &optname, &optval))
2997 return NULL;
2998
2999#ifdef MS_WINDOWS
3000 if (optval.len > INT_MAX) {
3001 PyBuffer_Release(&optval);
3002 PyErr_Format(PyExc_OverflowError,
3003 "socket option is larger than %i bytes",
3004 INT_MAX);
3005 return NULL;
3006 }
3007 res = setsockopt(s->sock_fd, level, optname,
3008 optval.buf, (int)optval.len);
3009#else
3010 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3011#endif
3012 PyBuffer_Release(&optval);
3013
3014done:
Victor Stinnercc739322016-03-23 21:35:29 +01003015 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003017 }
3018
3019 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003020}
3021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003022PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003023"setsockopt(level, option, value: int)\n\
3024setsockopt(level, option, value: buffer)\n\
3025setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003026\n\
3027Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003028The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003029None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003030
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003031
Guido van Rossumaee08791992-09-08 09:05:33 +00003032/* s.getsockopt() method.
3033 With two arguments, retrieves an integer option.
3034 With a third integer argument, retrieves a string buffer of that size;
3035 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003036
Guido van Rossum73624e91994-10-10 17:59:00 +00003037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 int level;
3041 int optname;
3042 int res;
3043 PyObject *buf;
3044 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003045 int flag = 0;
3046 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3049 &level, &optname, &buflen))
3050 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003053#ifdef AF_VSOCK
3054 if (s->sock_family == AF_VSOCK) {
3055 uint64_t vflag = 0; // Must be set width of 64 bits
3056 flagsize = sizeof vflag;
3057 res = getsockopt(s->sock_fd, level, optname,
3058 (void *)&vflag, &flagsize);
3059 if (res < 0)
3060 return s->errorhandler();
3061 return PyLong_FromUnsignedLong(vflag);
3062 }
3063#endif
3064 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 res = getsockopt(s->sock_fd, level, optname,
3066 (void *)&flag, &flagsize);
3067 if (res < 0)
3068 return s->errorhandler();
3069 return PyLong_FromLong(flag);
3070 }
caaveryeffc12f2017-09-06 18:18:10 -04003071#ifdef AF_VSOCK
3072 if (s->sock_family == AF_VSOCK) {
3073 PyErr_SetString(PyExc_OSError,
3074 "getsockopt string buffer not allowed");
3075 return NULL;
3076 }
3077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003079 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 "getsockopt buflen out of range");
3081 return NULL;
3082 }
3083 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3084 if (buf == NULL)
3085 return NULL;
3086 res = getsockopt(s->sock_fd, level, optname,
3087 (void *)PyBytes_AS_STRING(buf), &buflen);
3088 if (res < 0) {
3089 Py_DECREF(buf);
3090 return s->errorhandler();
3091 }
3092 _PyBytes_Resize(&buf, buflen);
3093 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003094}
3095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003096PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003097"getsockopt(level, option[, buffersize]) -> value\n\
3098\n\
3099Get a socket option. See the Unix manual for level and option.\n\
3100If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003101string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003102
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003103
Fred Drake728819a2000-07-01 03:40:12 +00003104/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003105
Guido van Rossum73624e91994-10-10 17:59:00 +00003106static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003107sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 sock_addr_t addrbuf;
3110 int addrlen;
3111 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003112
Oren Milman735171e2018-09-11 19:51:29 +03003113 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003115 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003116
3117 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3118 return NULL;
3119 }
3120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 Py_BEGIN_ALLOW_THREADS
3122 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3123 Py_END_ALLOW_THREADS
3124 if (res < 0)
3125 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003126 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003127}
3128
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003129PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003130"bind(address)\n\
3131\n\
3132Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003133pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003134sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003135
Guido van Rossum30a685f1991-06-27 15:51:29 +00003136
3137/* s.close() method.
3138 Set the file descriptor to -1 so operations tried subsequently
3139 will surely fail. */
3140
Guido van Rossum73624e91994-10-10 17:59:00 +00003141static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303142sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003145 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003146
Victor Stinner19a8e842016-03-21 16:36:48 +01003147 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003148 if (fd != INVALID_SOCKET) {
3149 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003150
3151 /* We do not want to retry upon EINTR: see
3152 http://lwn.net/Articles/576478/ and
3153 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3154 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003156 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003158 /* bpo-30319: The peer can already have closed the connection.
3159 Python ignores ECONNRESET on close(). */
3160 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003161 return s->errorhandler();
3162 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003164 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003165}
3166
Christian Heimesd0e31b92018-01-27 09:54:13 +01003167PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003168"close()\n\
3169\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003170Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003171
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003172static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303173sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003174{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003175 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003176 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003177 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003178}
3179
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003180PyDoc_STRVAR(detach_doc,
3181"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003182\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003183Close the socket object without closing the underlying file descriptor.\n\
3184The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003185can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003186
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003187static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003188sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003189{
Victor Stinner81c41db2015-04-02 11:50:57 +02003190 int err;
3191 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003192
Victor Stinner81c41db2015-04-02 11:50:57 +02003193 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3194 /* getsockopt() failed */
3195 return 0;
3196 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003197
Victor Stinner81c41db2015-04-02 11:50:57 +02003198 if (err == EISCONN)
3199 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003200 if (err != 0) {
3201 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3202 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003203 return 0;
3204 }
3205 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003206}
3207
3208static int
3209internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3210 int raise)
3211{
3212 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003213
3214 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003216 Py_END_ALLOW_THREADS
3217
Victor Stinner70a46f62015-03-31 22:03:59 +02003218 if (!res) {
3219 /* connect() succeeded, the socket is connected */
3220 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003222
Victor Stinner81c41db2015-04-02 11:50:57 +02003223 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003224
Victor Stinner81c41db2015-04-02 11:50:57 +02003225 /* save error, PyErr_CheckSignals() can replace it */
3226 err = GET_SOCK_ERROR;
3227 if (CHECK_ERRNO(EINTR)) {
3228 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003229 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003230
3231 /* Issue #23618: when connect() fails with EINTR, the connection is
3232 running asynchronously.
3233
3234 If the socket is blocking or has a timeout, wait until the
3235 connection completes, fails or timed out using select(), and then
3236 get the connection status using getsockopt(SO_ERROR).
3237
3238 If the socket is non-blocking, raise InterruptedError. The caller is
3239 responsible to wait until the connection completes, fails or timed
3240 out (it's the case in asyncio for example). */
3241 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3242 }
3243 else {
3244 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3245 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003246 }
3247
Victor Stinner81c41db2015-04-02 11:50:57 +02003248 if (!wait_connect) {
3249 if (raise) {
3250 /* restore error, maybe replaced by PyErr_CheckSignals() */
3251 SET_SOCK_ERROR(err);
3252 s->errorhandler();
3253 return -1;
3254 }
3255 else
3256 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003257 }
3258
Victor Stinner81c41db2015-04-02 11:50:57 +02003259 if (raise) {
3260 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003261 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3262 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003263 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003264 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003265 else {
3266 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003267 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3268 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003269 return err;
3270 }
3271 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003272}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273
Fred Drake728819a2000-07-01 03:40:12 +00003274/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003275
Guido van Rossum73624e91994-10-10 17:59:00 +00003276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003277sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 sock_addr_t addrbuf;
3280 int addrlen;
3281 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003282
Oren Milman735171e2018-09-11 19:51:29 +03003283 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003285 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003286
Steve Dowerb82e17e2019-05-23 08:45:22 -07003287 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3288 return NULL;
3289 }
3290
Victor Stinner81c41db2015-04-02 11:50:57 +02003291 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003292 if (res < 0)
3293 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003294
Victor Stinneree699e92015-03-31 21:28:42 +02003295 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003296}
3297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003298PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003299"connect(address)\n\
3300\n\
3301Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003302is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003303
Guido van Rossum30a685f1991-06-27 15:51:29 +00003304
Fred Drake728819a2000-07-01 03:40:12 +00003305/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003306
3307static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 sock_addr_t addrbuf;
3311 int addrlen;
3312 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003313
Oren Milman735171e2018-09-11 19:51:29 +03003314 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003316 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Steve Dowerb82e17e2019-05-23 08:45:22 -07003318 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3319 return NULL;
3320 }
3321
Victor Stinner81c41db2015-04-02 11:50:57 +02003322 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003323 if (res < 0)
3324 return NULL;
3325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003327}
3328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003329PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003330"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003331\n\
3332This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003333instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003334
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003335
Guido van Rossumed233a51992-06-23 09:07:03 +00003336/* s.fileno() method */
3337
Guido van Rossum73624e91994-10-10 17:59:00 +00003338static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303339sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003342}
3343
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003344PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003345"fileno() -> integer\n\
3346\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003347Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003348
Guido van Rossumed233a51992-06-23 09:07:03 +00003349
Guido van Rossumc89705d1992-11-26 08:54:07 +00003350/* s.getsockname() method */
3351
Guido van Rossum73624e91994-10-10 17:59:00 +00003352static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303353sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 sock_addr_t addrbuf;
3356 int res;
3357 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 if (!getsockaddrlen(s, &addrlen))
3360 return NULL;
3361 memset(&addrbuf, 0, addrlen);
3362 Py_BEGIN_ALLOW_THREADS
3363 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3364 Py_END_ALLOW_THREADS
3365 if (res < 0)
3366 return s->errorhandler();
3367 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3368 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003369}
3370
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003371PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003372"getsockname() -> address info\n\
3373\n\
3374Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003375info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003376
Guido van Rossumc89705d1992-11-26 08:54:07 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003379/* s.getpeername() method */
3380
Guido van Rossum73624e91994-10-10 17:59:00 +00003381static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303382sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 sock_addr_t addrbuf;
3385 int res;
3386 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 if (!getsockaddrlen(s, &addrlen))
3389 return NULL;
3390 memset(&addrbuf, 0, addrlen);
3391 Py_BEGIN_ALLOW_THREADS
3392 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3393 Py_END_ALLOW_THREADS
3394 if (res < 0)
3395 return s->errorhandler();
3396 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3397 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003398}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003400PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003401"getpeername() -> address info\n\
3402\n\
3403Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003404info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003405
Guido van Rossumb6775db1994-08-01 11:34:53 +00003406#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003407
3408
Guido van Rossum30a685f1991-06-27 15:51:29 +00003409/* s.listen(n) method */
3410
Guido van Rossum73624e91994-10-10 17:59:00 +00003411static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003412sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003413{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003414 /* We try to choose a default backlog high enough to avoid connection drops
3415 * for common workloads, yet not too high to limit resource usage. */
3416 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003418
Charles-François Natali644b8f52014-05-22 19:45:39 +01003419 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003423 /* To avoid problems on systems that don't allow a negative backlog
3424 * (which doesn't make sense anyway) we force a minimum value of 0. */
3425 if (backlog < 0)
3426 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 res = listen(s->sock_fd, backlog);
3428 Py_END_ALLOW_THREADS
3429 if (res < 0)
3430 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003431 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003432}
3433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003434PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003435"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003436\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003437Enable a server to accept connections. If backlog is specified, it must be\n\
3438at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003439unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003440connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003441
Victor Stinner31bf2d52015-04-01 21:57:09 +02003442struct sock_recv {
3443 char *cbuf;
3444 Py_ssize_t len;
3445 int flags;
3446 Py_ssize_t result;
3447};
3448
3449static int
3450sock_recv_impl(PySocketSockObject *s, void *data)
3451{
3452 struct sock_recv *ctx = data;
3453
3454#ifdef MS_WINDOWS
3455 if (ctx->len > INT_MAX)
3456 ctx->len = INT_MAX;
3457 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3458#else
3459 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3460#endif
3461 return (ctx->result >= 0);
3462}
3463
Guido van Rossum82a5c661998-07-07 20:45:43 +00003464
Thomas Wouters477c8d52006-05-27 19:21:47 +00003465/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003466 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003467 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003468 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003469 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003470 * also possible that we return a number of bytes smaller than the request
3471 * bytes.
3472 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003473
Antoine Pitrou19467d22010-08-17 19:33:30 +00003474static Py_ssize_t
3475sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003476{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003477 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 if (!IS_SELECTABLE(s)) {
3480 select_error();
3481 return -1;
3482 }
3483 if (len == 0) {
3484 /* If 0 bytes were requested, do nothing. */
3485 return 0;
3486 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003487
Victor Stinner31bf2d52015-04-01 21:57:09 +02003488 ctx.cbuf = cbuf;
3489 ctx.len = len;
3490 ctx.flags = flags;
3491 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003493
3494 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003495}
3496
Guido van Rossum48a680c2001-03-02 06:34:14 +00003497
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003498/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003499
Guido van Rossum73624e91994-10-10 17:59:00 +00003500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003501sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003502{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003503 Py_ssize_t recvlen, outlen;
3504 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003506
Antoine Pitrou19467d22010-08-17 19:33:30 +00003507 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 if (recvlen < 0) {
3511 PyErr_SetString(PyExc_ValueError,
3512 "negative buffersize in recv");
3513 return NULL;
3514 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 /* Allocate a new string. */
3517 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3518 if (buf == NULL)
3519 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 /* Call the guts */
3522 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3523 if (outlen < 0) {
3524 /* An error occurred, release the string and return an
3525 error. */
3526 Py_DECREF(buf);
3527 return NULL;
3528 }
3529 if (outlen != recvlen) {
3530 /* We did not read as many bytes as we anticipated, resize the
3531 string if possible and be successful. */
3532 _PyBytes_Resize(&buf, outlen);
3533 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003536}
3537
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003538PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003539"recv(buffersize[, flags]) -> data\n\
3540\n\
3541Receive up to buffersize bytes from the socket. For the optional flags\n\
3542argument, see the Unix manual. When no data is available, block until\n\
3543at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003544the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003545
Guido van Rossum30a685f1991-06-27 15:51:29 +00003546
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003547/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003548
Thomas Wouters477c8d52006-05-27 19:21:47 +00003549static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003550sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003553
Antoine Pitrou19467d22010-08-17 19:33:30 +00003554 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 Py_buffer pbuf;
3556 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003557 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003560 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 &pbuf, &recvlen, &flags))
3562 return NULL;
3563 buf = pbuf.buf;
3564 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 if (recvlen < 0) {
3567 PyBuffer_Release(&pbuf);
3568 PyErr_SetString(PyExc_ValueError,
3569 "negative buffersize in recv_into");
3570 return NULL;
3571 }
3572 if (recvlen == 0) {
3573 /* If nbytes was not specified, use the buffer's length */
3574 recvlen = buflen;
3575 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 /* Check if the buffer is large enough */
3578 if (buflen < recvlen) {
3579 PyBuffer_Release(&pbuf);
3580 PyErr_SetString(PyExc_ValueError,
3581 "buffer too small for requested bytes");
3582 return NULL;
3583 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 /* Call the guts */
3586 readlen = sock_recv_guts(s, buf, recvlen, flags);
3587 if (readlen < 0) {
3588 /* Return an error. */
3589 PyBuffer_Release(&pbuf);
3590 return NULL;
3591 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 PyBuffer_Release(&pbuf);
3594 /* Return the number of bytes read. Note that we do not do anything
3595 special here in the case that readlen < recvlen. */
3596 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003597}
3598
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003599PyDoc_STRVAR(recv_into_doc,
3600"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003601\n\
oldkaa0735f2018-02-02 16:52:55 +08003602A version of recv() that stores its data into a buffer rather than creating\n\
3603a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003604is not specified (or 0), receive up to the size available in the given buffer.\n\
3605\n\
3606See recv() for documentation about the flags.");
3607
Victor Stinner31bf2d52015-04-01 21:57:09 +02003608struct sock_recvfrom {
3609 char* cbuf;
3610 Py_ssize_t len;
3611 int flags;
3612 socklen_t *addrlen;
3613 sock_addr_t *addrbuf;
3614 Py_ssize_t result;
3615};
3616
3617static int
3618sock_recvfrom_impl(PySocketSockObject *s, void *data)
3619{
3620 struct sock_recvfrom *ctx = data;
3621
3622 memset(ctx->addrbuf, 0, *ctx->addrlen);
3623
3624#ifdef MS_WINDOWS
3625 if (ctx->len > INT_MAX)
3626 ctx->len = INT_MAX;
3627 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3628 SAS2SA(ctx->addrbuf), ctx->addrlen);
3629#else
3630 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3631 SAS2SA(ctx->addrbuf), ctx->addrlen);
3632#endif
3633 return (ctx->result >= 0);
3634}
3635
Thomas Wouters477c8d52006-05-27 19:21:47 +00003636
3637/*
Christian Heimes99170a52007-12-19 02:07:34 +00003638 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3639 * into a char buffer. If you have any inc/def ref to do to the objects that
3640 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003641 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003642 * that it is also possible that we return a number of bytes smaller than the
3643 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003644 *
3645 * 'addr' is a return value for the address object. Note that you must decref
3646 * it yourself.
3647 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003648static Py_ssize_t
3649sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003654 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 if (!getsockaddrlen(s, &addrlen))
3659 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 if (!IS_SELECTABLE(s)) {
3662 select_error();
3663 return -1;
3664 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003665
Victor Stinner31bf2d52015-04-01 21:57:09 +02003666 ctx.cbuf = cbuf;
3667 ctx.len = len;
3668 ctx.flags = flags;
3669 ctx.addrbuf = &addrbuf;
3670 ctx.addrlen = &addrlen;
3671 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003673
Victor Stinner31bf2d52015-04-01 21:57:09 +02003674 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3675 s->sock_proto);
3676 if (*addr == NULL)
3677 return -1;
3678
3679 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003680}
3681
3682/* s.recvfrom(nbytes [,flags]) method */
3683
3684static PyObject *
3685sock_recvfrom(PySocketSockObject *s, PyObject *args)
3686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 PyObject *buf = NULL;
3688 PyObject *addr = NULL;
3689 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003690 int flags = 0;
3691 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003692
Antoine Pitrou19467d22010-08-17 19:33:30 +00003693 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 if (recvlen < 0) {
3697 PyErr_SetString(PyExc_ValueError,
3698 "negative buffersize in recvfrom");
3699 return NULL;
3700 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3703 if (buf == NULL)
3704 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3707 recvlen, flags, &addr);
3708 if (outlen < 0) {
3709 goto finally;
3710 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 if (outlen != recvlen) {
3713 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003714 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003716 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 goto finally;
3718 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003721
3722finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 Py_XDECREF(buf);
3724 Py_XDECREF(addr);
3725 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003726}
3727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003728PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003729"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3730\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003731Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003732
Thomas Wouters477c8d52006-05-27 19:21:47 +00003733
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003734/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003735
3736static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003737sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003740
Antoine Pitrou19467d22010-08-17 19:33:30 +00003741 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 Py_buffer pbuf;
3743 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003744 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003747
Antoine Pitrou19467d22010-08-17 19:33:30 +00003748 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 kwlist, &pbuf,
3750 &recvlen, &flags))
3751 return NULL;
3752 buf = pbuf.buf;
3753 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 if (recvlen < 0) {
3756 PyBuffer_Release(&pbuf);
3757 PyErr_SetString(PyExc_ValueError,
3758 "negative buffersize in recvfrom_into");
3759 return NULL;
3760 }
3761 if (recvlen == 0) {
3762 /* If nbytes was not specified, use the buffer's length */
3763 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003764 } else if (recvlen > buflen) {
3765 PyBuffer_Release(&pbuf);
3766 PyErr_SetString(PyExc_ValueError,
3767 "nbytes is greater than the length of the buffer");
3768 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3772 if (readlen < 0) {
3773 PyBuffer_Release(&pbuf);
3774 /* Return an error */
3775 Py_XDECREF(addr);
3776 return NULL;
3777 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 PyBuffer_Release(&pbuf);
3780 /* Return the number of bytes read and the address. Note that we do
3781 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003782 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003783}
3784
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003785PyDoc_STRVAR(recvfrom_into_doc,
3786"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003787\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003788Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003789
Victor Stinner35bee932015-04-02 12:28:07 +02003790/* The sendmsg() and recvmsg[_into]() methods require a working
3791 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3792#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003793struct sock_recvmsg {
3794 struct msghdr *msg;
3795 int flags;
3796 ssize_t result;
3797};
3798
3799static int
3800sock_recvmsg_impl(PySocketSockObject *s, void *data)
3801{
3802 struct sock_recvmsg *ctx = data;
3803
3804 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3805 return (ctx->result >= 0);
3806}
3807
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003808/*
3809 * Call recvmsg() with the supplied iovec structures, flags, and
3810 * ancillary data buffer size (controllen). Returns the tuple return
3811 * value for recvmsg() or recvmsg_into(), with the first item provided
3812 * by the supplied makeval() function. makeval() will be called with
3813 * the length read and makeval_data as arguments, and must return a
3814 * new reference (which will be decrefed if there is a subsequent
3815 * error). On error, closes any file descriptors received via
3816 * SCM_RIGHTS.
3817 */
3818static PyObject *
3819sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3820 int flags, Py_ssize_t controllen,
3821 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3822{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003823 sock_addr_t addrbuf;
3824 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003825 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826 PyObject *cmsg_list = NULL, *retval = NULL;
3827 void *controlbuf = NULL;
3828 struct cmsghdr *cmsgh;
3829 size_t cmsgdatalen = 0;
3830 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003831 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003832
3833 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3834 ignored" when the socket is connected (Linux fills them in
3835 anyway for AF_UNIX sockets at least). Normally msg_namelen
3836 seems to be set to 0 if there's no address, but try to
3837 initialize msg_name to something that won't be mistaken for a
3838 real address if that doesn't happen. */
3839 if (!getsockaddrlen(s, &addrbuflen))
3840 return NULL;
3841 memset(&addrbuf, 0, addrbuflen);
3842 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3843
3844 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3845 PyErr_SetString(PyExc_ValueError,
3846 "invalid ancillary data buffer length");
3847 return NULL;
3848 }
3849 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3850 return PyErr_NoMemory();
3851
3852 /* Make the system call. */
3853 if (!IS_SELECTABLE(s)) {
3854 select_error();
3855 goto finally;
3856 }
3857
Victor Stinner31bf2d52015-04-01 21:57:09 +02003858 msg.msg_name = SAS2SA(&addrbuf);
3859 msg.msg_namelen = addrbuflen;
3860 msg.msg_iov = iov;
3861 msg.msg_iovlen = iovlen;
3862 msg.msg_control = controlbuf;
3863 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003864
Victor Stinner31bf2d52015-04-01 21:57:09 +02003865 ctx.msg = &msg;
3866 ctx.flags = flags;
3867 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003868 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869
3870 /* Make list of (level, type, data) tuples from control messages. */
3871 if ((cmsg_list = PyList_New(0)) == NULL)
3872 goto err_closefds;
3873 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3874 implementations didn't do so. */
3875 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3876 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3877 PyObject *bytes, *tuple;
3878 int tmp;
3879
3880 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3881 if (cmsg_status != 0) {
3882 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3883 "received malformed or improperly-truncated "
3884 "ancillary data", 1) == -1)
3885 goto err_closefds;
3886 }
3887 if (cmsg_status < 0)
3888 break;
3889 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003890 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003891 goto err_closefds;
3892 }
3893
3894 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3895 cmsgdatalen);
3896 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3897 (int)cmsgh->cmsg_type, bytes);
3898 if (tuple == NULL)
3899 goto err_closefds;
3900 tmp = PyList_Append(cmsg_list, tuple);
3901 Py_DECREF(tuple);
3902 if (tmp != 0)
3903 goto err_closefds;
3904
3905 if (cmsg_status != 0)
3906 break;
3907 }
3908
3909 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003910 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003911 cmsg_list,
3912 (int)msg.msg_flags,
3913 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3914 ((msg.msg_namelen > addrbuflen) ?
3915 addrbuflen : msg.msg_namelen),
3916 s->sock_proto));
3917 if (retval == NULL)
3918 goto err_closefds;
3919
3920finally:
3921 Py_XDECREF(cmsg_list);
3922 PyMem_Free(controlbuf);
3923 return retval;
3924
3925err_closefds:
3926#ifdef SCM_RIGHTS
3927 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3928 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3929 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3930 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3931 if (cmsg_status < 0)
3932 break;
3933 if (cmsgh->cmsg_level == SOL_SOCKET &&
3934 cmsgh->cmsg_type == SCM_RIGHTS) {
3935 size_t numfds;
3936 int *fdp;
3937
3938 numfds = cmsgdatalen / sizeof(int);
3939 fdp = (int *)CMSG_DATA(cmsgh);
3940 while (numfds-- > 0)
3941 close(*fdp++);
3942 }
3943 if (cmsg_status != 0)
3944 break;
3945 }
3946#endif /* SCM_RIGHTS */
3947 goto finally;
3948}
3949
3950
3951static PyObject *
3952makeval_recvmsg(ssize_t received, void *data)
3953{
3954 PyObject **buf = data;
3955
3956 if (received < PyBytes_GET_SIZE(*buf))
3957 _PyBytes_Resize(buf, received);
3958 Py_XINCREF(*buf);
3959 return *buf;
3960}
3961
3962/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3963
3964static PyObject *
3965sock_recvmsg(PySocketSockObject *s, PyObject *args)
3966{
3967 Py_ssize_t bufsize, ancbufsize = 0;
3968 int flags = 0;
3969 struct iovec iov;
3970 PyObject *buf = NULL, *retval = NULL;
3971
3972 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3973 return NULL;
3974
3975 if (bufsize < 0) {
3976 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3977 return NULL;
3978 }
3979 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3980 return NULL;
3981 iov.iov_base = PyBytes_AS_STRING(buf);
3982 iov.iov_len = bufsize;
3983
3984 /* Note that we're passing a pointer to *our pointer* to the bytes
3985 object here (&buf); makeval_recvmsg() may incref the object, or
3986 deallocate it and set our pointer to NULL. */
3987 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3988 &makeval_recvmsg, &buf);
3989 Py_XDECREF(buf);
3990 return retval;
3991}
3992
3993PyDoc_STRVAR(recvmsg_doc,
3994"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3995\n\
3996Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3997socket. The ancbufsize argument sets the size in bytes of the\n\
3998internal buffer used to receive the ancillary data; it defaults to 0,\n\
3999meaning that no ancillary data will be received. Appropriate buffer\n\
4000sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
4001CMSG_LEN(), and items which do not fit into the buffer might be\n\
4002truncated or discarded. The flags argument defaults to 0 and has the\n\
4003same meaning as for recv().\n\
4004\n\
4005The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4006The data item is a bytes object holding the non-ancillary data\n\
4007received. The ancdata item is a list of zero or more tuples\n\
4008(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4009(control messages) received: cmsg_level and cmsg_type are integers\n\
4010specifying the protocol level and protocol-specific type respectively,\n\
4011and cmsg_data is a bytes object holding the associated data. The\n\
4012msg_flags item is the bitwise OR of various flags indicating\n\
4013conditions on the received message; see your system documentation for\n\
4014details. If the receiving socket is unconnected, address is the\n\
4015address of the sending socket, if available; otherwise, its value is\n\
4016unspecified.\n\
4017\n\
4018If recvmsg() raises an exception after the system call returns, it\n\
4019will first attempt to close any file descriptors received via the\n\
4020SCM_RIGHTS mechanism.");
4021
4022
4023static PyObject *
4024makeval_recvmsg_into(ssize_t received, void *data)
4025{
4026 return PyLong_FromSsize_t(received);
4027}
4028
4029/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4030
4031static PyObject *
4032sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4033{
4034 Py_ssize_t ancbufsize = 0;
4035 int flags = 0;
4036 struct iovec *iovs = NULL;
4037 Py_ssize_t i, nitems, nbufs = 0;
4038 Py_buffer *bufs = NULL;
4039 PyObject *buffers_arg, *fast, *retval = NULL;
4040
4041 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4042 &buffers_arg, &ancbufsize, &flags))
4043 return NULL;
4044
4045 if ((fast = PySequence_Fast(buffers_arg,
4046 "recvmsg_into() argument 1 must be an "
4047 "iterable")) == NULL)
4048 return NULL;
4049 nitems = PySequence_Fast_GET_SIZE(fast);
4050 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004051 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004052 goto finally;
4053 }
4054
4055 /* Fill in an iovec for each item, and save the Py_buffer
4056 structs to release afterwards. */
4057 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4058 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4059 PyErr_NoMemory();
4060 goto finally;
4061 }
4062 for (; nbufs < nitems; nbufs++) {
4063 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4064 "w*;recvmsg_into() argument 1 must be an iterable "
4065 "of single-segment read-write buffers",
4066 &bufs[nbufs]))
4067 goto finally;
4068 iovs[nbufs].iov_base = bufs[nbufs].buf;
4069 iovs[nbufs].iov_len = bufs[nbufs].len;
4070 }
4071
4072 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4073 &makeval_recvmsg_into, NULL);
4074finally:
4075 for (i = 0; i < nbufs; i++)
4076 PyBuffer_Release(&bufs[i]);
4077 PyMem_Free(bufs);
4078 PyMem_Free(iovs);
4079 Py_DECREF(fast);
4080 return retval;
4081}
4082
4083PyDoc_STRVAR(recvmsg_into_doc,
4084"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4085\n\
4086Receive normal data and ancillary data from the socket, scattering the\n\
4087non-ancillary data into a series of buffers. The buffers argument\n\
4088must be an iterable of objects that export writable buffers\n\
4089(e.g. bytearray objects); these will be filled with successive chunks\n\
4090of the non-ancillary data until it has all been written or there are\n\
4091no more buffers. The ancbufsize argument sets the size in bytes of\n\
4092the internal buffer used to receive the ancillary data; it defaults to\n\
40930, meaning that no ancillary data will be received. Appropriate\n\
4094buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4095or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4096truncated or discarded. The flags argument defaults to 0 and has the\n\
4097same meaning as for recv().\n\
4098\n\
4099The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4100The nbytes item is the total number of bytes of non-ancillary data\n\
4101written into the buffers. The ancdata item is a list of zero or more\n\
4102tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4103data (control messages) received: cmsg_level and cmsg_type are\n\
4104integers specifying the protocol level and protocol-specific type\n\
4105respectively, and cmsg_data is a bytes object holding the associated\n\
4106data. The msg_flags item is the bitwise OR of various flags\n\
4107indicating conditions on the received message; see your system\n\
4108documentation for details. If the receiving socket is unconnected,\n\
4109address is the address of the sending socket, if available; otherwise,\n\
4110its value is unspecified.\n\
4111\n\
4112If recvmsg_into() raises an exception after the system call returns,\n\
4113it will first attempt to close any file descriptors received via the\n\
4114SCM_RIGHTS mechanism.");
4115#endif /* CMSG_LEN */
4116
4117
Victor Stinner31bf2d52015-04-01 21:57:09 +02004118struct sock_send {
4119 char *buf;
4120 Py_ssize_t len;
4121 int flags;
4122 Py_ssize_t result;
4123};
4124
4125static int
4126sock_send_impl(PySocketSockObject *s, void *data)
4127{
4128 struct sock_send *ctx = data;
4129
4130#ifdef MS_WINDOWS
4131 if (ctx->len > INT_MAX)
4132 ctx->len = INT_MAX;
4133 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4134#else
4135 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4136#endif
4137 return (ctx->result >= 0);
4138}
4139
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004140/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004141
Guido van Rossum73624e91994-10-10 17:59:00 +00004142static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004143sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004144{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004145 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004147 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4150 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 if (!IS_SELECTABLE(s)) {
4153 PyBuffer_Release(&pbuf);
4154 return select_error();
4155 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004156 ctx.buf = pbuf.buf;
4157 ctx.len = pbuf.len;
4158 ctx.flags = flags;
4159 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004160 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 return NULL;
4162 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004163 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004164
4165 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004166}
4167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004168PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004169"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004170\n\
4171Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004172argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004173sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004174
4175
4176/* s.sendall(data [,flags]) method */
4177
4178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004179sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004182 Py_ssize_t len, n;
4183 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004185 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004186 int has_timeout = (s->sock_timeout > 0);
4187 _PyTime_t interval = s->sock_timeout;
4188 _PyTime_t deadline = 0;
4189 int deadline_initialized = 0;
4190 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4193 return NULL;
4194 buf = pbuf.buf;
4195 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (!IS_SELECTABLE(s)) {
4198 PyBuffer_Release(&pbuf);
4199 return select_error();
4200 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004203 if (has_timeout) {
4204 if (deadline_initialized) {
4205 /* recompute the timeout */
4206 interval = deadline - _PyTime_GetMonotonicClock();
4207 }
4208 else {
4209 deadline_initialized = 1;
4210 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4211 }
4212
4213 if (interval <= 0) {
4214 PyErr_SetString(socket_timeout, "timed out");
4215 goto done;
4216 }
4217 }
4218
Victor Stinner02f32ab2015-04-01 22:53:26 +02004219 ctx.buf = buf;
4220 ctx.len = len;
4221 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004222 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4223 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004224 n = ctx.result;
4225 assert(n >= 0);
4226
4227 buf += n;
4228 len -= n;
4229
4230 /* We must run our signal handlers before looping again.
4231 send() can return a successful partial write when it is
4232 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004233 if (PyErr_CheckSignals())
4234 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004235 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004237
Victor Stinner8912d142015-04-06 23:16:34 +02004238 Py_INCREF(Py_None);
4239 res = Py_None;
4240
4241done:
4242 PyBuffer_Release(&pbuf);
4243 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004244}
4245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004246PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004247"sendall(data[, flags])\n\
4248\n\
4249Send a data string to the socket. For the optional flags\n\
4250argument, see the Unix manual. This calls send() repeatedly\n\
4251until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004252to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004253
Guido van Rossum30a685f1991-06-27 15:51:29 +00004254
Victor Stinner31bf2d52015-04-01 21:57:09 +02004255struct sock_sendto {
4256 char *buf;
4257 Py_ssize_t len;
4258 int flags;
4259 int addrlen;
4260 sock_addr_t *addrbuf;
4261 Py_ssize_t result;
4262};
4263
4264static int
4265sock_sendto_impl(PySocketSockObject *s, void *data)
4266{
4267 struct sock_sendto *ctx = data;
4268
4269#ifdef MS_WINDOWS
4270 if (ctx->len > INT_MAX)
4271 ctx->len = INT_MAX;
4272 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4273 SAS2SA(ctx->addrbuf), ctx->addrlen);
4274#else
4275 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4276 SAS2SA(ctx->addrbuf), ctx->addrlen);
4277#endif
4278 return (ctx->result >= 0);
4279}
4280
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004281/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004282
Guido van Rossum73624e91994-10-10 17:59:00 +00004283static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004284sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 Py_buffer pbuf;
4287 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004288 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004290 int addrlen, flags;
4291 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004294 arglen = PyTuple_Size(args);
4295 switch (arglen) {
4296 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004297 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4298 return NULL;
4299 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004300 break;
4301 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004302 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4303 &pbuf, &flags, &addro)) {
4304 return NULL;
4305 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004306 break;
4307 default:
4308 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004309 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004310 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004311 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 if (!IS_SELECTABLE(s)) {
4315 PyBuffer_Release(&pbuf);
4316 return select_error();
4317 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004318
Oren Milman735171e2018-09-11 19:51:29 +03004319 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 PyBuffer_Release(&pbuf);
4321 return NULL;
4322 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004323
Steve Dowerb82e17e2019-05-23 08:45:22 -07004324 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4325 return NULL;
4326 }
4327
Victor Stinner31bf2d52015-04-01 21:57:09 +02004328 ctx.buf = pbuf.buf;
4329 ctx.len = pbuf.len;
4330 ctx.flags = flags;
4331 ctx.addrlen = addrlen;
4332 ctx.addrbuf = &addrbuf;
4333 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004334 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 return NULL;
4336 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004337 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004338
4339 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004340}
4341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004342PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004343"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004344\n\
4345Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004346For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004347
Guido van Rossum30a685f1991-06-27 15:51:29 +00004348
Victor Stinner35bee932015-04-02 12:28:07 +02004349/* The sendmsg() and recvmsg[_into]() methods require a working
4350 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4351#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004352struct sock_sendmsg {
4353 struct msghdr *msg;
4354 int flags;
4355 ssize_t result;
4356};
4357
4358static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004359sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4360 struct msghdr *msg,
4361 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4362 Py_ssize_t ndataparts, ndatabufs = 0;
4363 int result = -1;
4364 struct iovec *iovs = NULL;
4365 PyObject *data_fast = NULL;
4366 Py_buffer *databufs = NULL;
4367
4368 /* Fill in an iovec for each message part, and save the Py_buffer
4369 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004370 data_fast = PySequence_Fast(data_arg,
4371 "sendmsg() argument 1 must be an "
4372 "iterable");
4373 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004374 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004375 }
4376
Christian Heimesdffa3942016-09-05 23:54:41 +02004377 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4378 if (ndataparts > INT_MAX) {
4379 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4380 goto finally;
4381 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004382
Christian Heimesdffa3942016-09-05 23:54:41 +02004383 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004384 if (ndataparts > 0) {
4385 iovs = PyMem_New(struct iovec, ndataparts);
4386 if (iovs == NULL) {
4387 PyErr_NoMemory();
4388 goto finally;
4389 }
4390 msg->msg_iov = iovs;
4391
4392 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004393 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004394 PyErr_NoMemory();
4395 goto finally;
4396 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004397 }
4398 for (; ndatabufs < ndataparts; ndatabufs++) {
4399 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4400 "y*;sendmsg() argument 1 must be an iterable of "
4401 "bytes-like objects",
4402 &databufs[ndatabufs]))
4403 goto finally;
4404 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4405 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4406 }
4407 result = 0;
4408 finally:
4409 *databufsout = databufs;
4410 *ndatabufsout = ndatabufs;
4411 Py_XDECREF(data_fast);
4412 return result;
4413}
4414
4415static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004416sock_sendmsg_impl(PySocketSockObject *s, void *data)
4417{
4418 struct sock_sendmsg *ctx = data;
4419
4420 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4421 return (ctx->result >= 0);
4422}
4423
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004424/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4425
4426static PyObject *
4427sock_sendmsg(PySocketSockObject *s, PyObject *args)
4428{
Christian Heimesdffa3942016-09-05 23:54:41 +02004429 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004431 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004432 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004433 struct cmsginfo {
4434 int level;
4435 int type;
4436 Py_buffer data;
4437 } *cmsgs = NULL;
4438 void *controlbuf = NULL;
4439 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004440 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004441 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004442 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004443 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004444
4445 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004446 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004447 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004448 }
4449
4450 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004451
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004452 /* Parse destination address. */
4453 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004454 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4455 "sendmsg"))
4456 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004457 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004458 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004459 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4460 return NULL;
4461 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004462 msg.msg_name = &addrbuf;
4463 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004464 } else {
4465 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4466 return NULL;
4467 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468 }
4469
4470 /* Fill in an iovec for each message part, and save the Py_buffer
4471 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004472 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004473 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004474 }
4475
4476 if (cmsg_arg == NULL)
4477 ncmsgs = 0;
4478 else {
4479 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4480 "sendmsg() argument 2 must be an "
4481 "iterable")) == NULL)
4482 goto finally;
4483 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4484 }
4485
4486#ifndef CMSG_SPACE
4487 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004488 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004489 "sending multiple control messages is not supported "
4490 "on this system");
4491 goto finally;
4492 }
4493#endif
4494 /* Save level, type and Py_buffer for each control message,
4495 and calculate total size. */
4496 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4497 PyErr_NoMemory();
4498 goto finally;
4499 }
4500 controllen = controllen_last = 0;
4501 while (ncmsgbufs < ncmsgs) {
4502 size_t bufsize, space;
4503
4504 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4505 "(iiy*):[sendmsg() ancillary data items]",
4506 &cmsgs[ncmsgbufs].level,
4507 &cmsgs[ncmsgbufs].type,
4508 &cmsgs[ncmsgbufs].data))
4509 goto finally;
4510 bufsize = cmsgs[ncmsgbufs++].data.len;
4511
4512#ifdef CMSG_SPACE
4513 if (!get_CMSG_SPACE(bufsize, &space)) {
4514#else
4515 if (!get_CMSG_LEN(bufsize, &space)) {
4516#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004517 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004518 goto finally;
4519 }
4520 controllen += space;
4521 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004522 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004523 goto finally;
4524 }
4525 controllen_last = controllen;
4526 }
4527
4528 /* Construct ancillary data block from control message info. */
4529 if (ncmsgbufs > 0) {
4530 struct cmsghdr *cmsgh = NULL;
4531
Victor Stinner52d61e42016-09-12 11:41:58 +02004532 controlbuf = PyMem_Malloc(controllen);
4533 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004534 PyErr_NoMemory();
4535 goto finally;
4536 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004537 msg.msg_control = controlbuf;
4538
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004539 msg.msg_controllen = controllen;
4540
4541 /* Need to zero out the buffer as a workaround for glibc's
4542 CMSG_NXTHDR() implementation. After getting the pointer to
4543 the next header, it checks its (uninitialized) cmsg_len
4544 member to see if the "message" fits in the buffer, and
4545 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004546 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004547 memset(controlbuf, 0, controllen);
4548
4549 for (i = 0; i < ncmsgbufs; i++) {
4550 size_t msg_len, data_len = cmsgs[i].data.len;
4551 int enough_space = 0;
4552
4553 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4554 if (cmsgh == NULL) {
4555 PyErr_Format(PyExc_RuntimeError,
4556 "unexpected NULL result from %s()",
4557 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4558 goto finally;
4559 }
4560 if (!get_CMSG_LEN(data_len, &msg_len)) {
4561 PyErr_SetString(PyExc_RuntimeError,
4562 "item size out of range for CMSG_LEN()");
4563 goto finally;
4564 }
4565 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4566 size_t space;
4567
4568 cmsgh->cmsg_len = msg_len;
4569 if (get_cmsg_data_space(&msg, cmsgh, &space))
4570 enough_space = (space >= data_len);
4571 }
4572 if (!enough_space) {
4573 PyErr_SetString(PyExc_RuntimeError,
4574 "ancillary data does not fit in calculated "
4575 "space");
4576 goto finally;
4577 }
4578 cmsgh->cmsg_level = cmsgs[i].level;
4579 cmsgh->cmsg_type = cmsgs[i].type;
4580 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4581 }
4582 }
4583
4584 /* Make the system call. */
4585 if (!IS_SELECTABLE(s)) {
4586 select_error();
4587 goto finally;
4588 }
4589
Victor Stinner31bf2d52015-04-01 21:57:09 +02004590 ctx.msg = &msg;
4591 ctx.flags = flags;
4592 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004593 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004594
4595 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004596
4597finally:
4598 PyMem_Free(controlbuf);
4599 for (i = 0; i < ncmsgbufs; i++)
4600 PyBuffer_Release(&cmsgs[i].data);
4601 PyMem_Free(cmsgs);
4602 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004603 PyMem_Free(msg.msg_iov);
4604 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004605 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004606 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004607 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004608 return retval;
4609}
4610
4611PyDoc_STRVAR(sendmsg_doc,
4612"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4613\n\
4614Send normal and ancillary data to the socket, gathering the\n\
4615non-ancillary data from a series of buffers and concatenating it into\n\
4616a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004617data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004618The ancdata argument specifies the ancillary data (control messages)\n\
4619as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4620cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4621protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004622is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004623argument defaults to 0 and has the same meaning as for send(). If\n\
4624address is supplied and not None, it sets a destination address for\n\
4625the message. The return value is the number of bytes of non-ancillary\n\
4626data sent.");
4627#endif /* CMSG_LEN */
4628
Christian Heimesdffa3942016-09-05 23:54:41 +02004629#ifdef HAVE_SOCKADDR_ALG
4630static PyObject*
4631sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4632{
4633 PyObject *retval = NULL;
4634
4635 Py_ssize_t i, ndatabufs = 0;
4636 Py_buffer *databufs = NULL;
4637 PyObject *data_arg = NULL;
4638
4639 Py_buffer iv = {NULL, NULL};
4640
4641 PyObject *opobj = NULL;
4642 int op = -1;
4643
4644 PyObject *assoclenobj = NULL;
4645 int assoclen = -1;
4646
4647 unsigned int *uiptr;
4648 int flags = 0;
4649
4650 struct msghdr msg;
4651 struct cmsghdr *header = NULL;
4652 struct af_alg_iv *alg_iv = NULL;
4653 struct sock_sendmsg ctx;
4654 Py_ssize_t controllen;
4655 void *controlbuf = NULL;
4656 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4657
4658 if (self->sock_family != AF_ALG) {
4659 PyErr_SetString(PyExc_OSError,
4660 "algset is only supported for AF_ALG");
4661 return NULL;
4662 }
4663
4664 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4665 "|O$O!y*O!i:sendmsg_afalg", keywords,
4666 &data_arg,
4667 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004668 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004669 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004670 }
4671
4672 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004673
4674 /* op is a required, keyword-only argument >= 0 */
4675 if (opobj != NULL) {
4676 op = _PyLong_AsInt(opobj);
4677 }
4678 if (op < 0) {
4679 /* override exception from _PyLong_AsInt() */
4680 PyErr_SetString(PyExc_TypeError,
4681 "Invalid or missing argument 'op'");
4682 goto finally;
4683 }
4684 /* assoclen is optional but must be >= 0 */
4685 if (assoclenobj != NULL) {
4686 assoclen = _PyLong_AsInt(assoclenobj);
4687 if (assoclen == -1 && PyErr_Occurred()) {
4688 goto finally;
4689 }
4690 if (assoclen < 0) {
4691 PyErr_SetString(PyExc_TypeError,
4692 "assoclen must be positive");
4693 goto finally;
4694 }
4695 }
4696
4697 controllen = CMSG_SPACE(4);
4698 if (iv.buf != NULL) {
4699 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4700 }
4701 if (assoclen >= 0) {
4702 controllen += CMSG_SPACE(4);
4703 }
4704
4705 controlbuf = PyMem_Malloc(controllen);
4706 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004707 PyErr_NoMemory();
4708 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004709 }
4710 memset(controlbuf, 0, controllen);
4711
Christian Heimesdffa3942016-09-05 23:54:41 +02004712 msg.msg_controllen = controllen;
4713 msg.msg_control = controlbuf;
4714
4715 /* Fill in an iovec for each message part, and save the Py_buffer
4716 structs to release afterwards. */
4717 if (data_arg != NULL) {
4718 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4719 goto finally;
4720 }
4721 }
4722
4723 /* set operation to encrypt or decrypt */
4724 header = CMSG_FIRSTHDR(&msg);
4725 if (header == NULL) {
4726 PyErr_SetString(PyExc_RuntimeError,
4727 "unexpected NULL result from CMSG_FIRSTHDR");
4728 goto finally;
4729 }
4730 header->cmsg_level = SOL_ALG;
4731 header->cmsg_type = ALG_SET_OP;
4732 header->cmsg_len = CMSG_LEN(4);
4733 uiptr = (void*)CMSG_DATA(header);
4734 *uiptr = (unsigned int)op;
4735
4736 /* set initialization vector */
4737 if (iv.buf != NULL) {
4738 header = CMSG_NXTHDR(&msg, header);
4739 if (header == NULL) {
4740 PyErr_SetString(PyExc_RuntimeError,
4741 "unexpected NULL result from CMSG_NXTHDR(iv)");
4742 goto finally;
4743 }
4744 header->cmsg_level = SOL_ALG;
4745 header->cmsg_type = ALG_SET_IV;
4746 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4747 alg_iv = (void*)CMSG_DATA(header);
4748 alg_iv->ivlen = iv.len;
4749 memcpy(alg_iv->iv, iv.buf, iv.len);
4750 }
4751
4752 /* set length of associated data for AEAD */
4753 if (assoclen >= 0) {
4754 header = CMSG_NXTHDR(&msg, header);
4755 if (header == NULL) {
4756 PyErr_SetString(PyExc_RuntimeError,
4757 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4758 goto finally;
4759 }
4760 header->cmsg_level = SOL_ALG;
4761 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4762 header->cmsg_len = CMSG_LEN(4);
4763 uiptr = (void*)CMSG_DATA(header);
4764 *uiptr = (unsigned int)assoclen;
4765 }
4766
4767 ctx.msg = &msg;
4768 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004769 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004770 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004771 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004772
4773 retval = PyLong_FromSsize_t(ctx.result);
4774
4775 finally:
4776 PyMem_Free(controlbuf);
4777 if (iv.buf != NULL) {
4778 PyBuffer_Release(&iv);
4779 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004780 PyMem_Free(msg.msg_iov);
4781 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004782 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004783 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004784 PyMem_Free(databufs);
4785 return retval;
4786}
4787
4788PyDoc_STRVAR(sendmsg_afalg_doc,
4789"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4790\n\
4791Set operation mode, IV and length of associated data for an AF_ALG\n\
4792operation socket.");
4793#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004794
Guido van Rossum30a685f1991-06-27 15:51:29 +00004795/* s.shutdown(how) method */
4796
Guido van Rossum73624e91994-10-10 17:59:00 +00004797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004798sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 int how;
4801 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004802
Serhiy Storchaka78980432013-01-15 01:12:17 +02004803 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 if (how == -1 && PyErr_Occurred())
4805 return NULL;
4806 Py_BEGIN_ALLOW_THREADS
4807 res = shutdown(s->sock_fd, how);
4808 Py_END_ALLOW_THREADS
4809 if (res < 0)
4810 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004811 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004812}
4813
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004814PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004815"shutdown(flag)\n\
4816\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004817Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4818of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004819
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004820#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004821static PyObject*
4822sock_ioctl(PySocketSockObject *s, PyObject *arg)
4823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 unsigned long cmd = SIO_RCVALL;
4825 PyObject *argO;
4826 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4829 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 switch (cmd) {
4832 case SIO_RCVALL: {
4833 unsigned int option = RCVALL_ON;
4834 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4835 return NULL;
4836 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4837 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4838 return set_error();
4839 }
4840 return PyLong_FromUnsignedLong(recv); }
4841 case SIO_KEEPALIVE_VALS: {
4842 struct tcp_keepalive ka;
4843 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4844 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4845 return NULL;
4846 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4847 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4848 return set_error();
4849 }
4850 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004851#if defined(SIO_LOOPBACK_FAST_PATH)
4852 case SIO_LOOPBACK_FAST_PATH: {
4853 unsigned int option;
4854 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4855 return NULL;
4856 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4857 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4858 return set_error();
4859 }
4860 return PyLong_FromUnsignedLong(recv); }
4861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004863 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 return NULL;
4865 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004866}
4867PyDoc_STRVAR(sock_ioctl_doc,
4868"ioctl(cmd, option) -> long\n\
4869\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004870Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4871SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004872SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4873SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004874#endif
4875
4876#if defined(MS_WINDOWS)
4877static PyObject*
4878sock_share(PySocketSockObject *s, PyObject *arg)
4879{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004880 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004881 DWORD processId;
4882 int result;
4883
4884 if (!PyArg_ParseTuple(arg, "I", &processId))
4885 return NULL;
4886
4887 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004888 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004889 Py_END_ALLOW_THREADS
4890 if (result == SOCKET_ERROR)
4891 return set_error();
4892 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4893}
4894PyDoc_STRVAR(sock_share_doc,
4895"share(process_id) -> bytes\n\
4896\n\
4897Share the socket with another process. The target process id\n\
4898must be provided and the resulting bytes object passed to the target\n\
4899process. There the shared socket can be instantiated by calling\n\
4900socket.fromshare().");
4901
Christian Heimesfaf2f632008-01-06 16:59:19 +00004902
4903#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004904
4905/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004906
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004907static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4909 accept_doc},
4910 {"bind", (PyCFunction)sock_bind, METH_O,
4911 bind_doc},
4912 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004913 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 {"connect", (PyCFunction)sock_connect, METH_O,
4915 connect_doc},
4916 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4917 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004918 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4919 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4921 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004922#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 {"getpeername", (PyCFunction)sock_getpeername,
4924 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 {"getsockname", (PyCFunction)sock_getsockname,
4927 METH_NOARGS, getsockname_doc},
4928 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4929 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004930#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4932 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004933#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004934#if defined(MS_WINDOWS)
4935 {"share", (PyCFunction)sock_share, METH_VARARGS,
4936 sock_share_doc},
4937#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004938 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 listen_doc},
4940 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4941 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004942 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 recv_into_doc},
4944 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4945 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004946 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 recvfrom_into_doc},
4948 {"send", (PyCFunction)sock_send, METH_VARARGS,
4949 send_doc},
4950 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4951 sendall_doc},
4952 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4953 sendto_doc},
4954 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4955 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004956 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4957 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4959 settimeout_doc},
4960 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4961 gettimeout_doc},
4962 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4963 setsockopt_doc},
4964 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4965 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004966#ifdef CMSG_LEN
4967 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4968 recvmsg_doc},
4969 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4970 recvmsg_into_doc,},
4971 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4972 sendmsg_doc},
4973#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004974#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004975 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004976 sendmsg_afalg_doc},
4977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004979};
4980
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004981/* SockObject members */
4982static PyMemberDef sock_memberlist[] = {
4983 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4984 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4985 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004986 {0},
4987};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004988
Victor Stinner71694d52015-03-28 01:18:54 +01004989static PyGetSetDef sock_getsetlist[] = {
4990 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4991 {NULL} /* sentinel */
4992};
4993
Guido van Rossum73624e91994-10-10 17:59:00 +00004994/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004995 First close the file description. */
4996
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004997static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004998sock_finalize(PySocketSockObject *s)
4999{
5000 SOCKET_T fd;
5001 PyObject *error_type, *error_value, *error_traceback;
5002
5003 /* Save the current exception, if any. */
5004 PyErr_Fetch(&error_type, &error_value, &error_traceback);
5005
Victor Stinnerd3afb622016-07-22 17:47:09 +02005006 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005007 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5008 /* Spurious errors can appear at shutdown */
5009 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5010 PyErr_WriteUnraisable((PyObject *)s);
5011 }
5012 }
5013
5014 /* Only close the socket *after* logging the ResourceWarning warning
5015 to allow the logger to call socket methods like
5016 socket.getsockname(). If the socket is closed before, socket
5017 methods fails with the EBADF error. */
5018 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005019 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005020
5021 /* We do not want to retry upon EINTR: see sock_close() */
5022 Py_BEGIN_ALLOW_THREADS
5023 (void) SOCKETCLOSE(fd);
5024 Py_END_ALLOW_THREADS
5025 }
5026
5027 /* Restore the saved exception. */
5028 PyErr_Restore(error_type, error_value, error_traceback);
5029}
5030
5031static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005032sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005033{
Victor Stinner19a8e842016-03-21 16:36:48 +01005034 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5035 return;
5036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005038}
5039
Guido van Rossum30a685f1991-06-27 15:51:29 +00005040
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005042sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005043{
Victor Stinnere254e532014-07-26 14:36:55 +02005044 long sock_fd;
5045 /* On Windows, this test is needed because SOCKET_T is unsigned */
5046 if (s->sock_fd == INVALID_SOCKET) {
5047 sock_fd = -1;
5048 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005049#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005050 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 /* this can occur on Win64, and actually there is a special
5052 ugly printf formatter for decimal pointer length integer
5053 printing, only bother if necessary*/
5054 PyErr_SetString(PyExc_OverflowError,
5055 "no printf formatter to display "
5056 "the socket descriptor in decimal");
5057 return NULL;
5058 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005059#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005060 else
5061 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062 return PyUnicode_FromFormat(
5063 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005064 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 s->sock_type,
5066 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005067}
5068
5069
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005070/* Create a new, uninitialized socket object. */
5071
5072static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005073sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 new = type->tp_alloc(type, 0);
5078 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005079 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005080 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 ((PySocketSockObject *)new)->errorhandler = &set_error;
5082 }
5083 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005084}
5085
5086
5087/* Initialize a new socket object. */
5088
Victor Stinnerdaf45552013-08-28 00:53:59 +02005089#ifdef SOCK_CLOEXEC
5090/* socket() and socketpair() fail with EINVAL on Linux kernel older
5091 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5092static int sock_cloexec_works = -1;
5093#endif
5094
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005095/*ARGSUSED*/
5096static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005097sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 PySocketSockObject *s = (PySocketSockObject *)self;
5100 PyObject *fdobj = NULL;
5101 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005102 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005104#ifndef MS_WINDOWS
5105#ifdef SOCK_CLOEXEC
5106 int *atomic_flag_works = &sock_cloexec_works;
5107#else
5108 int *atomic_flag_works = NULL;
5109#endif
5110#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5113 "|iiiO:socket", keywords,
5114 &family, &type, &proto, &fdobj))
5115 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005116
Steve Dowerb82e17e2019-05-23 08:45:22 -07005117#ifdef MS_WINDOWS
5118 /* In this case, we don't use the family, type and proto args */
5119 if (fdobj != NULL && fdobj != Py_None)
5120#endif
5121 {
5122 if (PySys_Audit("socket.__new__", "Oiii",
5123 s, family, type, proto) < 0) {
5124 return -1;
5125 }
5126 }
5127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005129#ifdef MS_WINDOWS
5130 /* recreate a socket that was duplicated */
5131 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005132 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005133 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5134 PyErr_Format(PyExc_ValueError,
5135 "socket descriptor string has wrong size, "
5136 "should be %zu bytes.", sizeof(info));
5137 return -1;
5138 }
5139 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005140
5141 if (PySys_Audit("socket()", "iii", info.iAddressFamily,
5142 info.iSocketType, info.iProtocol) < 0) {
5143 return -1;
5144 }
5145
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005146 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005147 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005148 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5149 Py_END_ALLOW_THREADS
5150 if (fd == INVALID_SOCKET) {
5151 set_error();
5152 return -1;
5153 }
5154 family = info.iAddressFamily;
5155 type = info.iSocketType;
5156 proto = info.iProtocol;
5157 }
5158 else
5159#endif
5160 {
Dima Tisneke9912702018-12-17 22:07:55 +09005161
5162 if (PyFloat_Check(fdobj)) {
5163 PyErr_SetString(PyExc_TypeError,
5164 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005165 return -1;
5166 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005167
Dima Tisneke9912702018-12-17 22:07:55 +09005168 fd = PyLong_AsSocket_t(fdobj);
5169 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5170 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005171#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005172 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005173#else
Dima Tisneke9912702018-12-17 22:07:55 +09005174 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005175#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005176 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5177 return -1;
5178 }
5179
5180 /* validate that passed file descriptor is valid and a socket. */
5181 sock_addr_t addrbuf;
5182 socklen_t addrlen = sizeof(sock_addr_t);
5183
5184 memset(&addrbuf, 0, addrlen);
5185 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5186 if (family == -1) {
5187 family = SAS2SA(&addrbuf)->sa_family;
5188 }
5189 } else {
5190#ifdef MS_WINDOWS
5191 /* getsockname() on an unbound socket is an error on Windows.
5192 Invalid descriptor and not a socket is same error code.
5193 Error out if family must be resolved, or bad descriptor. */
5194 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5195#else
5196 /* getsockname() is not supported for SOL_ALG on Linux. */
5197 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5198#endif
5199 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005200 return -1;
5201 }
5202 }
5203#ifdef SO_TYPE
5204 if (type == -1) {
5205 int tmp;
5206 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005207 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5208 (void *)&tmp, &slen) == 0)
5209 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005210 type = tmp;
5211 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005212 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005213 return -1;
5214 }
5215 }
5216#else
5217 type = SOCK_STREAM;
5218#endif
5219#ifdef SO_PROTOCOL
5220 if (proto == -1) {
5221 int tmp;
5222 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005223 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5224 (void *)&tmp, &slen) == 0)
5225 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005226 proto = tmp;
5227 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005228 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005229 return -1;
5230 }
5231 }
5232#else
5233 proto = 0;
5234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 }
5236 }
5237 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005238 /* No fd, default to AF_INET and SOCK_STREAM */
5239 if (family == -1) {
5240 family = AF_INET;
5241 }
5242 if (type == -1) {
5243 type = SOCK_STREAM;
5244 }
5245 if (proto == -1) {
5246 proto = 0;
5247 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005248#ifdef MS_WINDOWS
5249 /* Windows implementation */
5250#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5251#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5252#endif
5253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005255 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005256 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005257 NULL, 0,
5258 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5259 if (fd == INVALID_SOCKET) {
5260 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5261 support_wsa_no_inherit = 0;
5262 fd = socket(family, type, proto);
5263 }
5264 }
5265 else {
5266 fd = socket(family, type, proto);
5267 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 if (fd == INVALID_SOCKET) {
5271 set_error();
5272 return -1;
5273 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005274
5275 if (!support_wsa_no_inherit) {
5276 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5277 closesocket(fd);
5278 PyErr_SetFromWindowsErr(0);
5279 return -1;
5280 }
5281 }
5282#else
5283 /* UNIX */
5284 Py_BEGIN_ALLOW_THREADS
5285#ifdef SOCK_CLOEXEC
5286 if (sock_cloexec_works != 0) {
5287 fd = socket(family, type | SOCK_CLOEXEC, proto);
5288 if (sock_cloexec_works == -1) {
5289 if (fd >= 0) {
5290 sock_cloexec_works = 1;
5291 }
5292 else if (errno == EINVAL) {
5293 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5294 sock_cloexec_works = 0;
5295 fd = socket(family, type, proto);
5296 }
5297 }
5298 }
5299 else
5300#endif
5301 {
5302 fd = socket(family, type, proto);
5303 }
5304 Py_END_ALLOW_THREADS
5305
5306 if (fd == INVALID_SOCKET) {
5307 set_error();
5308 return -1;
5309 }
5310
5311 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5312 SOCKETCLOSE(fd);
5313 return -1;
5314 }
5315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005317 if (init_sockobject(s, fd, family, type, proto) == -1) {
5318 SOCKETCLOSE(fd);
5319 return -1;
5320 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005323
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005324}
5325
5326
Guido van Rossumb6775db1994-08-01 11:34:53 +00005327/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005328
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005329static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5331 "_socket.socket", /* tp_name */
5332 sizeof(PySocketSockObject), /* tp_basicsize */
5333 0, /* tp_itemsize */
5334 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005335 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 0, /* tp_getattr */
5337 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005338 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 (reprfunc)sock_repr, /* tp_repr */
5340 0, /* tp_as_number */
5341 0, /* tp_as_sequence */
5342 0, /* tp_as_mapping */
5343 0, /* tp_hash */
5344 0, /* tp_call */
5345 0, /* tp_str */
5346 PyObject_GenericGetAttr, /* tp_getattro */
5347 0, /* tp_setattro */
5348 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005349 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 sock_doc, /* tp_doc */
5351 0, /* tp_traverse */
5352 0, /* tp_clear */
5353 0, /* tp_richcompare */
5354 0, /* tp_weaklistoffset */
5355 0, /* tp_iter */
5356 0, /* tp_iternext */
5357 sock_methods, /* tp_methods */
5358 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005359 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 0, /* tp_base */
5361 0, /* tp_dict */
5362 0, /* tp_descr_get */
5363 0, /* tp_descr_set */
5364 0, /* tp_dictoffset */
5365 sock_initobj, /* tp_init */
5366 PyType_GenericAlloc, /* tp_alloc */
5367 sock_new, /* tp_new */
5368 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005369 0, /* tp_is_gc */
5370 0, /* tp_bases */
5371 0, /* tp_mro */
5372 0, /* tp_cache */
5373 0, /* tp_subclasses */
5374 0, /* tp_weaklist */
5375 0, /* tp_del */
5376 0, /* tp_version_tag */
5377 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005378};
5379
Guido van Rossum30a685f1991-06-27 15:51:29 +00005380
Guido van Rossum81194471991-07-27 21:42:02 +00005381/* Python interface to gethostname(). */
5382
5383/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005384static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005385socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005386{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005387 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5388 return NULL;
5389 }
5390
Martin v. Löwis72f48422010-10-29 18:20:08 +00005391#ifdef MS_WINDOWS
5392 /* Don't use winsock's gethostname, as this returns the ANSI
5393 version of the hostname, whereas we need a Unicode string.
5394 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005395 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005396 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005397 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005398 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005399
5400 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005401 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005402
5403 if (GetLastError() != ERROR_MORE_DATA)
5404 return PyErr_SetFromWindowsErr(0);
5405
5406 if (size == 0)
5407 return PyUnicode_New(0, 0);
5408
5409 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5410 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005411 name = PyMem_New(wchar_t, size);
5412 if (!name) {
5413 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005414 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005415 }
Victor Stinner74168972011-11-17 01:11:36 +01005416 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5417 name,
5418 &size))
5419 {
5420 PyMem_Free(name);
5421 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005422 }
Victor Stinner74168972011-11-17 01:11:36 +01005423
5424 result = PyUnicode_FromWideChar(name, size);
5425 PyMem_Free(name);
5426 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005427#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 char buf[1024];
5429 int res;
5430 Py_BEGIN_ALLOW_THREADS
5431 res = gethostname(buf, (int) sizeof buf - 1);
5432 Py_END_ALLOW_THREADS
5433 if (res < 0)
5434 return set_error();
5435 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005436 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005437#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005438}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005440PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005441"gethostname() -> string\n\
5442\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005443Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005444
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005445#ifdef HAVE_SETHOSTNAME
5446PyDoc_STRVAR(sethostname_doc,
5447"sethostname(name)\n\n\
5448Sets the hostname to name.");
5449
5450static PyObject *
5451socket_sethostname(PyObject *self, PyObject *args)
5452{
5453 PyObject *hnobj;
5454 Py_buffer buf;
5455 int res, flag = 0;
5456
Christian Heimesd2774c72013-06-19 02:06:29 +02005457#ifdef _AIX
5458/* issue #18259, not declared in any useful header file */
5459extern int sethostname(const char *, size_t);
5460#endif
5461
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005462 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5463 PyErr_Clear();
5464 if (!PyArg_ParseTuple(args, "O&:sethostname",
5465 PyUnicode_FSConverter, &hnobj))
5466 return NULL;
5467 flag = 1;
5468 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005469
5470 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5471 return NULL;
5472 }
5473
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005474 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5475 if (!res) {
5476 res = sethostname(buf.buf, buf.len);
5477 PyBuffer_Release(&buf);
5478 }
5479 if (flag)
5480 Py_DECREF(hnobj);
5481 if (res)
5482 return set_error();
5483 Py_RETURN_NONE;
5484}
5485#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005486
Guido van Rossum30a685f1991-06-27 15:51:29 +00005487/* Python interface to gethostbyname(name). */
5488
5489/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005491socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005494 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005495 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005496
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005497 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005499 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5500 goto finally;
5501 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005502 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005503 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005504 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005505finally:
5506 PyMem_Free(name);
5507 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005508}
5509
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005510PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005511"gethostbyname(host) -> address\n\
5512\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005513Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005514
5515
Victor Stinner72400302016-01-28 15:41:01 +01005516static PyObject*
5517sock_decode_hostname(const char *name)
5518{
5519#ifdef MS_WINDOWS
5520 /* Issue #26227: gethostbyaddr() returns a string encoded
5521 * to the ANSI code page */
5522 return PyUnicode_DecodeFSDefault(name);
5523#else
5524 /* Decode from UTF-8 */
5525 return PyUnicode_FromString(name);
5526#endif
5527}
5528
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005529/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5530
5531static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005532gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 char **pch;
5535 PyObject *rtn_tuple = (PyObject *)NULL;
5536 PyObject *name_list = (PyObject *)NULL;
5537 PyObject *addr_list = (PyObject *)NULL;
5538 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005539 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 if (h == NULL) {
5542 /* Let's get real error message to return */
5543 set_herror(h_errno);
5544 return NULL;
5545 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 if (h->h_addrtype != af) {
5548 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005549 errno = EAFNOSUPPORT;
5550 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 return NULL;
5552 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 case AF_INET:
5557 if (alen < sizeof(struct sockaddr_in))
5558 return NULL;
5559 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005560
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005561#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 case AF_INET6:
5563 if (alen < sizeof(struct sockaddr_in6))
5564 return NULL;
5565 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005566#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 if ((name_list = PyList_New(0)) == NULL)
5571 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 if ((addr_list = PyList_New(0)) == NULL)
5574 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 /* SF #1511317: h_aliases can be NULL */
5577 if (h->h_aliases) {
5578 for (pch = h->h_aliases; *pch != NULL; pch++) {
5579 int status;
5580 tmp = PyUnicode_FromString(*pch);
5581 if (tmp == NULL)
5582 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 status = PyList_Append(name_list, tmp);
5585 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 if (status)
5588 goto err;
5589 }
5590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5593 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 case AF_INET:
5598 {
5599 struct sockaddr_in sin;
5600 memset(&sin, 0, sizeof(sin));
5601 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005602#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005606 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 if (pch == h->h_addr_list && alen >= sizeof(sin))
5609 memcpy((char *) addr, &sin, sizeof(sin));
5610 break;
5611 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005612
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005613#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 case AF_INET6:
5615 {
5616 struct sockaddr_in6 sin6;
5617 memset(&sin6, 0, sizeof(sin6));
5618 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005619#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005623 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5626 memcpy((char *) addr, &sin6, sizeof(sin6));
5627 break;
5628 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005629#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005632 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 "unsupported address family");
5634 return NULL;
5635 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 if (tmp == NULL)
5638 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 status = PyList_Append(addr_list, tmp);
5641 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 if (status)
5644 goto err;
5645 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005646
Victor Stinner72400302016-01-28 15:41:01 +01005647 name = sock_decode_hostname(h->h_name);
5648 if (name == NULL)
5649 goto err;
5650 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005651
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005652 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 Py_XDECREF(name_list);
5654 Py_XDECREF(addr_list);
5655 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005656}
5657
5658
5659/* Python interface to gethostbyname_ex(name). */
5660
5661/*ARGSUSED*/
5662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005663socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 char *name;
5666 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005667 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005669 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005670#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005672#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005674#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 char buf[16384];
5676 int buf_len = (sizeof buf) - 1;
5677 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005678#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005679#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005681#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005682#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005683
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005684 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005686 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5687 goto finally;
5688 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005689 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005690 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005692#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005693#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005694 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005696#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005698#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 memset((void *) &data, '\0', sizeof(data));
5700 result = gethostbyname_r(name, &hp_allocated, &data);
5701 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005702#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005703#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005704#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005706#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005707 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005709#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 Py_END_ALLOW_THREADS
5711 /* Some C libraries would require addr.__ss_family instead of
5712 addr.ss_family.
5713 Therefore, we cast the sockaddr_storage into sockaddr to
5714 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005715 sa = SAS2SA(&addr);
5716 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005718#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005720#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005721finally:
5722 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005724}
5725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005726PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005727"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5728\n\
5729Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005730for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005731
5732
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005733/* Python interface to gethostbyaddr(IP). */
5734
5735/*ARGSUSED*/
5736static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005737socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005738{
Charles-François Natali8b759652011-12-23 16:44:51 +01005739 sock_addr_t addr;
5740 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 char *ip_num;
5742 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005743 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005744#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005746#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 /* glibcs up to 2.10 assume that the buf argument to
5750 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5751 does not ensure. The attribute below instructs the compiler
5752 to maintain this alignment. */
5753 char buf[16384] Py_ALIGNED(8);
5754 int buf_len = (sizeof buf) - 1;
5755 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005756#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005757#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005759#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005760#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005761 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 int al;
5763 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005764
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005765 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005767 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5768 goto finally;
5769 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 af = AF_UNSPEC;
5771 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005772 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 af = sa->sa_family;
5774 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005775 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 switch (af) {
5777 case AF_INET:
5778 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5779 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5780 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005781#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 case AF_INET6:
5783 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5784 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5785 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005788 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005789 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 }
5791 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005792#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005793#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005794 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 &hp_allocated, buf, buf_len,
5796 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005797#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 h = gethostbyaddr_r(ap, al, af,
5799 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005800#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 memset((void *) &data, '\0', sizeof(data));
5802 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5803 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005804#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005805#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005806#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005808#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005809 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005811#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005813 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005814#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005816#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005817finally:
5818 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005820}
5821
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005822PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005823"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5824\n\
5825Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005826for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005827
Guido van Rossum30a685f1991-06-27 15:51:29 +00005828
5829/* Python interface to getservbyname(name).
5830 This only returns the port number, since the other info is already
5831 known or not useful (like the list of aliases). */
5832
5833/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005835socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005836{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005837 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 struct servent *sp;
5839 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5840 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005841
5842 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5843 return NULL;
5844 }
5845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 Py_BEGIN_ALLOW_THREADS
5847 sp = getservbyname(name, proto);
5848 Py_END_ALLOW_THREADS
5849 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005850 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 return NULL;
5852 }
5853 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005854}
5855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005856PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005857"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005858\n\
5859Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005860The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5861otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005862
Guido van Rossum30a685f1991-06-27 15:51:29 +00005863
Barry Warsaw11b91a02004-06-28 00:50:43 +00005864/* Python interface to getservbyport(port).
5865 This only returns the service name, since the other info is already
5866 known or not useful (like the list of aliases). */
5867
5868/*ARGSUSED*/
5869static PyObject *
5870socket_getservbyport(PyObject *self, PyObject *args)
5871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005873 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 struct servent *sp;
5875 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5876 return NULL;
5877 if (port < 0 || port > 0xffff) {
5878 PyErr_SetString(
5879 PyExc_OverflowError,
5880 "getservbyport: port must be 0-65535.");
5881 return NULL;
5882 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005883
5884 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5885 return NULL;
5886 }
5887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 Py_BEGIN_ALLOW_THREADS
5889 sp = getservbyport(htons((short)port), proto);
5890 Py_END_ALLOW_THREADS
5891 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005892 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893 return NULL;
5894 }
5895 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005896}
5897
5898PyDoc_STRVAR(getservbyport_doc,
5899"getservbyport(port[, protocolname]) -> string\n\
5900\n\
5901Return the service name from a port number and protocol name.\n\
5902The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5903otherwise any protocol will match.");
5904
Guido van Rossum3901d851996-12-19 16:35:04 +00005905/* Python interface to getprotobyname(name).
5906 This only returns the protocol number, since the other info is
5907 already known or not useful (like the list of aliases). */
5908
5909/*ARGSUSED*/
5910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005911socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005912{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005913 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 struct protoent *sp;
5915 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5916 return NULL;
5917 Py_BEGIN_ALLOW_THREADS
5918 sp = getprotobyname(name);
5919 Py_END_ALLOW_THREADS
5920 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005921 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 return NULL;
5923 }
5924 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005925}
5926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005927PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005928"getprotobyname(name) -> integer\n\
5929\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005930Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005931
Christian Heimesd0e31b92018-01-27 09:54:13 +01005932static PyObject *
5933socket_close(PyObject *self, PyObject *fdobj)
5934{
5935 SOCKET_T fd;
5936 int res;
5937
5938 fd = PyLong_AsSocket_t(fdobj);
5939 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5940 return NULL;
5941 Py_BEGIN_ALLOW_THREADS
5942 res = SOCKETCLOSE(fd);
5943 Py_END_ALLOW_THREADS
5944 /* bpo-30319: The peer can already have closed the connection.
5945 Python ignores ECONNRESET on close(). */
5946 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5947 return set_error();
5948 }
5949 Py_RETURN_NONE;
5950}
5951
5952PyDoc_STRVAR(close_doc,
5953"close(integer) -> None\n\
5954\n\
5955Close an integer socket file descriptor. This is like os.close(), but for\n\
5956sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005957
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005958#ifndef NO_DUP
5959/* dup() function for socket fds */
5960
5961static PyObject *
5962socket_dup(PyObject *self, PyObject *fdobj)
5963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 SOCKET_T fd, newfd;
5965 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005966#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005967 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005968#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 fd = PyLong_AsSocket_t(fdobj);
5971 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5972 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005973
Victor Stinnerdaf45552013-08-28 00:53:59 +02005974#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005975 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005976 return set_error();
5977
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005978 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005979 FROM_PROTOCOL_INFO,
5980 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 if (newfd == INVALID_SOCKET)
5982 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005983
Victor Stinnerdaf45552013-08-28 00:53:59 +02005984 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5985 closesocket(newfd);
5986 PyErr_SetFromWindowsErr(0);
5987 return NULL;
5988 }
5989#else
5990 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5991 newfd = _Py_dup(fd);
5992 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005993 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005994#endif
5995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996 newfdobj = PyLong_FromSocket_t(newfd);
5997 if (newfdobj == NULL)
5998 SOCKETCLOSE(newfd);
5999 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006000}
6001
6002PyDoc_STRVAR(dup_doc,
6003"dup(integer) -> integer\n\
6004\n\
6005Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
6006sockets; on some platforms os.dup() won't work for socket file descriptors.");
6007#endif
6008
6009
Dave Cole331708b2004-08-09 04:51:41 +00006010#ifdef HAVE_SOCKETPAIR
6011/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006012 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006013 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006014
6015/*ARGSUSED*/
6016static PyObject *
6017socket_socketpair(PyObject *self, PyObject *args)
6018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 PySocketSockObject *s0 = NULL, *s1 = NULL;
6020 SOCKET_T sv[2];
6021 int family, type = SOCK_STREAM, proto = 0;
6022 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006023#ifdef SOCK_CLOEXEC
6024 int *atomic_flag_works = &sock_cloexec_works;
6025#else
6026 int *atomic_flag_works = NULL;
6027#endif
6028 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006029
6030#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006032#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6036 &family, &type, &proto))
6037 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006040 Py_BEGIN_ALLOW_THREADS
6041#ifdef SOCK_CLOEXEC
6042 if (sock_cloexec_works != 0) {
6043 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6044 if (sock_cloexec_works == -1) {
6045 if (ret >= 0) {
6046 sock_cloexec_works = 1;
6047 }
6048 else if (errno == EINVAL) {
6049 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6050 sock_cloexec_works = 0;
6051 ret = socketpair(family, type, proto, sv);
6052 }
6053 }
6054 }
6055 else
6056#endif
6057 {
6058 ret = socketpair(family, type, proto, sv);
6059 }
6060 Py_END_ALLOW_THREADS
6061
6062 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006064
6065 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6066 goto finally;
6067 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6068 goto finally;
6069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 s0 = new_sockobject(sv[0], family, type, proto);
6071 if (s0 == NULL)
6072 goto finally;
6073 s1 = new_sockobject(sv[1], family, type, proto);
6074 if (s1 == NULL)
6075 goto finally;
6076 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006077
6078finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 if (res == NULL) {
6080 if (s0 == NULL)
6081 SOCKETCLOSE(sv[0]);
6082 if (s1 == NULL)
6083 SOCKETCLOSE(sv[1]);
6084 }
6085 Py_XDECREF(s0);
6086 Py_XDECREF(s1);
6087 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006088}
6089
6090PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006091"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006092\n\
6093Create a pair of socket objects from the sockets returned by the platform\n\
6094socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006095The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006096AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006097
6098#endif /* HAVE_SOCKETPAIR */
6099
6100
Guido van Rossum006bf911996-06-12 04:04:55 +00006101static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006102socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006103{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006104 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006105
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006106 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 return NULL;
6108 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006109 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006111 "ntohs: can't convert negative Python int to C "
6112 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 return NULL;
6114 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006115 if (x > 0xffff) {
6116 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6117 "ntohs: Python int too large to convert to C "
6118 "16-bit unsigned integer (The silent truncation "
6119 "is deprecated)",
6120 1)) {
6121 return NULL;
6122 }
6123 }
6124 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006125}
6126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006127PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006128"ntohs(integer) -> integer\n\
6129\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006130Convert a 16-bit unsigned integer from network to host byte order.\n\
6131Note that in case the received integer does not fit in 16-bit unsigned\n\
6132integer, but does fit in a positive C int, it is silently truncated to\n\
613316-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006134However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006135exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006136
6137
Guido van Rossum006bf911996-06-12 04:04:55 +00006138static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006139socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 if (PyLong_Check(arg)) {
6144 x = PyLong_AsUnsignedLong(arg);
6145 if (x == (unsigned long) -1 && PyErr_Occurred())
6146 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006147#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 {
6149 unsigned long y;
6150 /* only want the trailing 32 bits */
6151 y = x & 0xFFFFFFFFUL;
6152 if (y ^ x)
6153 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006154 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 x = y;
6156 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 }
6159 else
6160 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006161 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006164}
6165
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006166PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006167"ntohl(integer) -> integer\n\
6168\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006169Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006170
6171
Guido van Rossum006bf911996-06-12 04:04:55 +00006172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006173socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006174{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006175 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006176
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006177 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 return NULL;
6179 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006180 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006182 "htons: can't convert negative Python int to C "
6183 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 return NULL;
6185 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006186 if (x > 0xffff) {
6187 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6188 "htons: Python int too large to convert to C "
6189 "16-bit unsigned integer (The silent truncation "
6190 "is deprecated)",
6191 1)) {
6192 return NULL;
6193 }
6194 }
6195 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006196}
6197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006198PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006199"htons(integer) -> integer\n\
6200\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006201Convert a 16-bit unsigned integer from host to network byte order.\n\
6202Note that in case the received integer does not fit in 16-bit unsigned\n\
6203integer, but does fit in a positive C int, it is silently truncated to\n\
620416-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006205However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006206exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006207
6208
Guido van Rossum006bf911996-06-12 04:04:55 +00006209static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006210socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 if (PyLong_Check(arg)) {
6215 x = PyLong_AsUnsignedLong(arg);
6216 if (x == (unsigned long) -1 && PyErr_Occurred())
6217 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006218#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 {
6220 unsigned long y;
6221 /* only want the trailing 32 bits */
6222 y = x & 0xFFFFFFFFUL;
6223 if (y ^ x)
6224 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006225 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226 x = y;
6227 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 }
6230 else
6231 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006232 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 Py_TYPE(arg)->tp_name);
6234 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006235}
6236
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006237PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006238"htonl(integer) -> integer\n\
6239\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006240Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006241
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006242/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006243
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006244PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006245"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006246\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006247Convert 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 +00006248binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006249
6250static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006251socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006252{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006253#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006255#endif
6256
6257#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006258#if (SIZEOF_INT != 4)
6259#error "Not sure if in_addr_t exists and int is not 32-bits."
6260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 /* Have to use inet_addr() instead */
6262 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006263#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006264 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6267 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006268
Tim Peters1df9fdd2003-02-13 03:13:40 +00006269
6270#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006271
6272#ifdef USE_INET_ATON_WEAKLINK
6273 if (inet_aton != NULL) {
6274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 if (inet_aton(ip_addr, &buf))
6276 return PyBytes_FromStringAndSize((char *)(&buf),
6277 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006278
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006279 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 "illegal IP address string passed to inet_aton");
6281 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006282
Thomas Wouters477c8d52006-05-27 19:21:47 +00006283#ifdef USE_INET_ATON_WEAKLINK
6284 } else {
6285#endif
6286
6287#endif
6288
6289#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 /* special-case this address as inet_addr might return INADDR_NONE
6292 * for this */
6293 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006294 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006296
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006297 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006301 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006302 "illegal IP address string passed to inet_aton");
6303 return NULL;
6304 }
6305 }
6306 return PyBytes_FromStringAndSize((char *) &packed_addr,
6307 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006308
6309#ifdef USE_INET_ATON_WEAKLINK
6310 }
6311#endif
6312
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006313#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006314}
6315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006316PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006317"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006318\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006319Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006320
6321static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006322socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006323{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006324 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006326
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006327 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328 return NULL;
6329 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006330
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006331 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006332 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006334 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 return NULL;
6336 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006337
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006338 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6339 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006340
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006341 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006343}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006344
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006345#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006346
6347PyDoc_STRVAR(inet_pton_doc,
6348"inet_pton(af, ip) -> packed IP address string\n\
6349\n\
6350Convert an IP address from string format to a packed string suitable\n\
6351for use with low-level network functions.");
6352
6353static PyObject *
6354socket_inet_pton(PyObject *self, PyObject *args)
6355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006357 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006359#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006360 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6365 return NULL;
6366 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006367
Martin v. Löwis04697e82004-06-02 12:35:29 +00006368#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006370 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 "can't use AF_INET6, IPv6 is disabled");
6372 return NULL;
6373 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006374#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 retval = inet_pton(af, ip, packed);
6377 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006378 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 return NULL;
6380 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006381 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 "illegal IP address string passed to inet_pton");
6383 return NULL;
6384 } else if (af == AF_INET) {
6385 return PyBytes_FromStringAndSize(packed,
6386 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006387#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 } else if (af == AF_INET6) {
6389 return PyBytes_FromStringAndSize(packed,
6390 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006393 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 return NULL;
6395 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006396}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006397
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006398PyDoc_STRVAR(inet_ntop_doc,
6399"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6400\n\
6401Convert a packed IP address of the given family to string format.");
6402
6403static PyObject *
6404socket_inet_ntop(PyObject *self, PyObject *args)
6405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006407 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006409#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006410 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006411#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006412 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006413#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006414
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006415 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 return NULL;
6417 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006420 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 PyErr_SetString(PyExc_ValueError,
6422 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006423 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 return NULL;
6425 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006426#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006428 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 PyErr_SetString(PyExc_ValueError,
6430 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006431 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 return NULL;
6433 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 } else {
6436 PyErr_Format(PyExc_ValueError,
6437 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006438 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 return NULL;
6440 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006441
Коренберг Марк7766b962018-02-13 00:47:42 +05006442 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006443 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6444 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006446 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 return NULL;
6448 } else {
6449 return PyUnicode_FromString(retval);
6450 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006451}
6452
6453#endif /* HAVE_INET_PTON */
6454
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006455/* Python interface to getaddrinfo(host, port). */
6456
6457/*ARGSUSED*/
6458static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006459socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006460{
Victor Stinner77af1722011-05-26 14:05:59 +02006461 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006462 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 struct addrinfo hints, *res;
6464 struct addrinfo *res0 = NULL;
6465 PyObject *hobj = NULL;
6466 PyObject *pobj = (PyObject *)NULL;
6467 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006468 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469 int family, socktype, protocol, flags;
6470 int error;
6471 PyObject *all = (PyObject *)NULL;
6472 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006473
Georg Brandl6083a4b2013-10-14 06:51:46 +02006474 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006476 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006477 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 &protocol, &flags)) {
6479 return NULL;
6480 }
6481 if (hobj == Py_None) {
6482 hptr = NULL;
6483 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006484 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 if (!idna)
6486 return NULL;
6487 assert(PyBytes_Check(idna));
6488 hptr = PyBytes_AS_STRING(idna);
6489 } else if (PyBytes_Check(hobj)) {
6490 hptr = PyBytes_AsString(hobj);
6491 } else {
6492 PyErr_SetString(PyExc_TypeError,
6493 "getaddrinfo() argument 1 must be string or None");
6494 return NULL;
6495 }
6496 if (PyLong_CheckExact(pobj)) {
6497 long value = PyLong_AsLong(pobj);
6498 if (value == -1 && PyErr_Occurred())
6499 goto err;
6500 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6501 pptr = pbuf;
6502 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006503 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006504 if (pptr == NULL)
6505 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006507 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 } else if (pobj == Py_None) {
6509 pptr = (char *)NULL;
6510 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006511 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 goto err;
6513 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006514#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006515 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006516 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006517 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6518 * This workaround avoids a segfault in libsystem.
6519 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006520 pptr = "00";
6521 }
6522#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006523
6524 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6525 hobj, pobj, family, socktype, protocol) < 0) {
6526 return NULL;
6527 }
6528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 memset(&hints, 0, sizeof(hints));
6530 hints.ai_family = family;
6531 hints.ai_socktype = socktype;
6532 hints.ai_protocol = protocol;
6533 hints.ai_flags = flags;
6534 Py_BEGIN_ALLOW_THREADS
6535 ACQUIRE_GETADDRINFO_LOCK
6536 error = getaddrinfo(hptr, pptr, &hints, &res0);
6537 Py_END_ALLOW_THREADS
6538 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6539 if (error) {
6540 set_gaierror(error);
6541 goto err;
6542 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006543
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006544 all = PyList_New(0);
6545 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 goto err;
6547 for (res = res0; res; res = res->ai_next) {
6548 PyObject *single;
6549 PyObject *addr =
6550 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6551 if (addr == NULL)
6552 goto err;
6553 single = Py_BuildValue("iiisO", res->ai_family,
6554 res->ai_socktype, res->ai_protocol,
6555 res->ai_canonname ? res->ai_canonname : "",
6556 addr);
6557 Py_DECREF(addr);
6558 if (single == NULL)
6559 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560
Zackery Spytz4c596d52018-11-14 15:39:01 -07006561 if (PyList_Append(all, single)) {
6562 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006564 }
6565 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 }
6567 Py_XDECREF(idna);
6568 if (res0)
6569 freeaddrinfo(res0);
6570 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006571 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 Py_XDECREF(all);
6573 Py_XDECREF(idna);
6574 if (res0)
6575 freeaddrinfo(res0);
6576 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006577}
6578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006579PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006580"getaddrinfo(host, port [, family, type, proto, flags])\n\
6581 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006583Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006584
6585/* Python interface to getnameinfo(sa, flags). */
6586
6587/*ARGSUSED*/
6588static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006589socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyObject *sa = (PyObject *)NULL;
6592 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006593 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006594 int port;
6595 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6597 struct addrinfo hints, *res = NULL;
6598 int error;
6599 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006600 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 flags = flowinfo = scope_id = 0;
6603 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6604 return NULL;
6605 if (!PyTuple_Check(sa)) {
6606 PyErr_SetString(PyExc_TypeError,
6607 "getnameinfo() argument 1 must be a tuple");
6608 return NULL;
6609 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006610 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006612 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006614 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006615 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006616 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006617 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006618 return NULL;
6619 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006620
6621 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6622 return NULL;
6623 }
6624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6626 memset(&hints, 0, sizeof(hints));
6627 hints.ai_family = AF_UNSPEC;
6628 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006629 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 Py_BEGIN_ALLOW_THREADS
6631 ACQUIRE_GETADDRINFO_LOCK
6632 error = getaddrinfo(hostp, pbuf, &hints, &res);
6633 Py_END_ALLOW_THREADS
6634 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6635 if (error) {
6636 set_gaierror(error);
6637 goto fail;
6638 }
6639 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006640 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 "sockaddr resolved to multiple addresses");
6642 goto fail;
6643 }
6644 switch (res->ai_family) {
6645 case AF_INET:
6646 {
6647 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006648 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 "IPv4 sockaddr must be 2 tuple");
6650 goto fail;
6651 }
6652 break;
6653 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006654#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 case AF_INET6:
6656 {
6657 struct sockaddr_in6 *sin6;
6658 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006659 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 sin6->sin6_scope_id = scope_id;
6661 break;
6662 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006665 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6667 if (error) {
6668 set_gaierror(error);
6669 goto fail;
6670 }
Victor Stinner72400302016-01-28 15:41:01 +01006671
6672 name = sock_decode_hostname(hbuf);
6673 if (name == NULL)
6674 goto fail;
6675 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006676
6677fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678 if (res)
6679 freeaddrinfo(res);
6680 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006681}
6682
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006683PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006684"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006685\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006686Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006687
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006688
6689/* Python API to getting and setting the default timeout value. */
6690
6691static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306692socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006693{
Victor Stinner71694d52015-03-28 01:18:54 +01006694 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006695 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696 }
Victor Stinner71694d52015-03-28 01:18:54 +01006697 else {
6698 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6699 return PyFloat_FromDouble(seconds);
6700 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006701}
6702
6703PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006704"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006705\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006706Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006707A value of None indicates that new socket objects have no timeout.\n\
6708When the socket module is first imported, the default is None.");
6709
6710static PyObject *
6711socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6712{
Victor Stinner71694d52015-03-28 01:18:54 +01006713 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006714
Victor Stinner71694d52015-03-28 01:18:54 +01006715 if (socket_parse_timeout(&timeout, arg) < 0)
6716 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006719
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006720 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006721}
6722
6723PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006724"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006725\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006726Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006727A value of None indicates that new socket objects have no timeout.\n\
6728When the socket module is first imported, the default is None.");
6729
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006730#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006731/* Python API for getting interface indices and names */
6732
6733static PyObject *
6734socket_if_nameindex(PyObject *self, PyObject *arg)
6735{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006736 PyObject *list = PyList_New(0);
6737 if (list == NULL) {
6738 return NULL;
6739 }
6740#ifdef MS_WINDOWS
6741 PMIB_IF_TABLE2 tbl;
6742 int ret;
6743 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6744 Py_DECREF(list);
6745 // ret is used instead of GetLastError()
6746 return PyErr_SetFromWindowsErr(ret);
6747 }
6748 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6749 MIB_IF_ROW2 r = tbl->Table[i];
6750 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6751 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6752 Py_ARRAY_LENGTH(buf)))) {
6753 Py_DECREF(list);
6754 FreeMibTable(tbl);
6755 // ret is used instead of GetLastError()
6756 return PyErr_SetFromWindowsErr(ret);
6757 }
6758 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6759 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6760 Py_XDECREF(tuple);
6761 Py_DECREF(list);
6762 FreeMibTable(tbl);
6763 return NULL;
6764 }
6765 Py_DECREF(tuple);
6766 }
6767 FreeMibTable(tbl);
6768 return list;
6769#else
Charles-François Natali60713592011-05-20 16:55:06 +02006770 int i;
6771 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006772
Charles-François Natali60713592011-05-20 16:55:06 +02006773 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006774 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006775 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006776 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006777 return NULL;
6778 }
6779
Gregory P. Smithb474e672018-12-30 17:05:36 -08006780#ifdef _Py_MEMORY_SANITIZER
6781 __msan_unpoison(ni, sizeof(ni));
6782 __msan_unpoison(&ni[0], sizeof(ni[0]));
6783#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006784 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006785#ifdef _Py_MEMORY_SANITIZER
6786 /* This one isn't the end sentinel, the next one must exist. */
6787 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6788 /* Otherwise Py_BuildValue internals are flagged by MSan when
6789 they access the not-msan-tracked if_name string data. */
6790 {
6791 char *to_sanitize = ni[i].if_name;
6792 do {
6793 __msan_unpoison(to_sanitize, 1);
6794 } while (*to_sanitize++ != '\0');
6795 }
6796#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006797 PyObject *ni_tuple = Py_BuildValue("IO&",
6798 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006799
6800 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6801 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006802 Py_DECREF(list);
6803 if_freenameindex(ni);
6804 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006805 }
6806 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006807 }
6808
6809 if_freenameindex(ni);
6810 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006811#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006812}
6813
6814PyDoc_STRVAR(if_nameindex_doc,
6815"if_nameindex()\n\
6816\n\
6817Returns a list of network interface information (index, name) tuples.");
6818
Charles-François Natali60713592011-05-20 16:55:06 +02006819static PyObject *
6820socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006821{
Charles-François Natali60713592011-05-20 16:55:06 +02006822 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006823#ifdef MS_WINDOWS
6824 NET_IFINDEX index;
6825#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006826 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006827#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006828 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6829 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006830 return NULL;
6831
Charles-François Natali60713592011-05-20 16:55:06 +02006832 index = if_nametoindex(PyBytes_AS_STRING(oname));
6833 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006834 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006835 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006836 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006837 return NULL;
6838 }
6839
6840 return PyLong_FromUnsignedLong(index);
6841}
6842
6843PyDoc_STRVAR(if_nametoindex_doc,
6844"if_nametoindex(if_name)\n\
6845\n\
6846Returns the interface index corresponding to the interface name if_name.");
6847
Charles-François Natali60713592011-05-20 16:55:06 +02006848static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006849socket_if_indextoname(PyObject *self, PyObject *arg)
6850{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006851#ifdef MS_WINDOWS
6852 NET_IFINDEX index;
6853#else
Charles-François Natali60713592011-05-20 16:55:06 +02006854 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006855#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006856 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006857
Charles-François Natali60713592011-05-20 16:55:06 +02006858 index = PyLong_AsUnsignedLong(arg);
6859 if (index == (unsigned long) -1)
6860 return NULL;
6861
6862 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006863 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006864 return NULL;
6865 }
6866
Charles-François Natali60713592011-05-20 16:55:06 +02006867 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006868}
6869
6870PyDoc_STRVAR(if_indextoname_doc,
6871"if_indextoname(if_index)\n\
6872\n\
6873Returns the interface name corresponding to the interface index if_index.");
6874
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006875#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006876
6877
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006878#ifdef CMSG_LEN
6879/* Python interface to CMSG_LEN(length). */
6880
6881static PyObject *
6882socket_CMSG_LEN(PyObject *self, PyObject *args)
6883{
6884 Py_ssize_t length;
6885 size_t result;
6886
6887 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6888 return NULL;
6889 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6890 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6891 return NULL;
6892 }
6893 return PyLong_FromSize_t(result);
6894}
6895
6896PyDoc_STRVAR(CMSG_LEN_doc,
6897"CMSG_LEN(length) -> control message length\n\
6898\n\
6899Return the total length, without trailing padding, of an ancillary\n\
6900data item with associated data of the given length. This value can\n\
6901often be used as the buffer size for recvmsg() to receive a single\n\
6902item of ancillary data, but RFC 3542 requires portable applications to\n\
6903use CMSG_SPACE() and thus include space for padding, even when the\n\
6904item will be the last in the buffer. Raises OverflowError if length\n\
6905is outside the permissible range of values.");
6906
6907
6908#ifdef CMSG_SPACE
6909/* Python interface to CMSG_SPACE(length). */
6910
6911static PyObject *
6912socket_CMSG_SPACE(PyObject *self, PyObject *args)
6913{
6914 Py_ssize_t length;
6915 size_t result;
6916
6917 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6918 return NULL;
6919 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6920 PyErr_SetString(PyExc_OverflowError,
6921 "CMSG_SPACE() argument out of range");
6922 return NULL;
6923 }
6924 return PyLong_FromSize_t(result);
6925}
6926
6927PyDoc_STRVAR(CMSG_SPACE_doc,
6928"CMSG_SPACE(length) -> buffer size\n\
6929\n\
6930Return the buffer size needed for recvmsg() to receive an ancillary\n\
6931data item with associated data of the given length, along with any\n\
6932trailing padding. The buffer space needed to receive multiple items\n\
6933is the sum of the CMSG_SPACE() values for their associated data\n\
6934lengths. Raises OverflowError if length is outside the permissible\n\
6935range of values.");
6936#endif /* CMSG_SPACE */
6937#endif /* CMSG_LEN */
6938
6939
Guido van Rossum30a685f1991-06-27 15:51:29 +00006940/* List of functions exported by this module. */
6941
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006942static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943 {"gethostbyname", socket_gethostbyname,
6944 METH_VARARGS, gethostbyname_doc},
6945 {"gethostbyname_ex", socket_gethostbyname_ex,
6946 METH_VARARGS, ghbn_ex_doc},
6947 {"gethostbyaddr", socket_gethostbyaddr,
6948 METH_VARARGS, gethostbyaddr_doc},
6949 {"gethostname", socket_gethostname,
6950 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006951#ifdef HAVE_SETHOSTNAME
6952 {"sethostname", socket_sethostname,
6953 METH_VARARGS, sethostname_doc},
6954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 {"getservbyname", socket_getservbyname,
6956 METH_VARARGS, getservbyname_doc},
6957 {"getservbyport", socket_getservbyport,
6958 METH_VARARGS, getservbyport_doc},
6959 {"getprotobyname", socket_getprotobyname,
6960 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006961 {"close", socket_close,
6962 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006963#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964 {"dup", socket_dup,
6965 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006966#endif
Dave Cole331708b2004-08-09 04:51:41 +00006967#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 {"socketpair", socket_socketpair,
6969 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971 {"ntohs", socket_ntohs,
6972 METH_VARARGS, ntohs_doc},
6973 {"ntohl", socket_ntohl,
6974 METH_O, ntohl_doc},
6975 {"htons", socket_htons,
6976 METH_VARARGS, htons_doc},
6977 {"htonl", socket_htonl,
6978 METH_O, htonl_doc},
6979 {"inet_aton", socket_inet_aton,
6980 METH_VARARGS, inet_aton_doc},
6981 {"inet_ntoa", socket_inet_ntoa,
6982 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006983#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984 {"inet_pton", socket_inet_pton,
6985 METH_VARARGS, inet_pton_doc},
6986 {"inet_ntop", socket_inet_ntop,
6987 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006988#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006989 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006990 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006991 {"getnameinfo", socket_getnameinfo,
6992 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306993 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006994 METH_NOARGS, getdefaulttimeout_doc},
6995 {"setdefaulttimeout", socket_setdefaulttimeout,
6996 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006997#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006998 {"if_nameindex", socket_if_nameindex,
6999 METH_NOARGS, if_nameindex_doc},
7000 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02007001 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07007002 {"if_indextoname", socket_if_indextoname,
7003 METH_O, if_indextoname_doc},
7004#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007005#ifdef CMSG_LEN
7006 {"CMSG_LEN", socket_CMSG_LEN,
7007 METH_VARARGS, CMSG_LEN_doc},
7008#ifdef CMSG_SPACE
7009 {"CMSG_SPACE", socket_CMSG_SPACE,
7010 METH_VARARGS, CMSG_SPACE_doc},
7011#endif
7012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007014};
7015
Guido van Rossum30a685f1991-06-27 15:51:29 +00007016
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007017#ifdef MS_WINDOWS
7018#define OS_INIT_DEFINED
7019
7020/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007021
7022static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007023os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007025 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007026}
7027
7028static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007029os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031 WSADATA WSAData;
7032 int ret;
7033 ret = WSAStartup(0x0101, &WSAData);
7034 switch (ret) {
7035 case 0: /* No error */
7036 Py_AtExit(os_cleanup);
7037 return 1; /* Success */
7038 case WSASYSNOTREADY:
7039 PyErr_SetString(PyExc_ImportError,
7040 "WSAStartup failed: network not ready");
7041 break;
7042 case WSAVERNOTSUPPORTED:
7043 case WSAEINVAL:
7044 PyErr_SetString(
7045 PyExc_ImportError,
7046 "WSAStartup failed: requested version not supported");
7047 break;
7048 default:
7049 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7050 break;
7051 }
7052 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007053}
7054
Guido van Rossum8d665e61996-06-26 18:22:49 +00007055#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007056
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007058
7059#ifndef OS_INIT_DEFINED
7060static int
7061os_init(void)
7062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007064}
7065#endif
7066
7067
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007068/* C API table - always add new things to the end for binary
7069 compatibility. */
7070static
7071PySocketModule_APIObject PySocketModuleAPI =
7072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007073 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007074 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007076};
7077
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007078
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007079/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007080
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007081 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007082 "socket.py" which implements some additional functionality.
7083 The import of "_socket" may fail with an ImportError exception if
7084 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007085 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007086 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007087*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007089PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007090"Implementation module for socket operations.\n\
7091\n\
7092See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007093
Martin v. Löwis1a214512008-06-11 05:26:20 +00007094static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 PyModuleDef_HEAD_INIT,
7096 PySocket_MODULE_NAME,
7097 socket_doc,
7098 -1,
7099 socket_methods,
7100 NULL,
7101 NULL,
7102 NULL,
7103 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007104};
7105
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007106PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007107PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007109 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111 if (!os_init())
7112 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007113
Victor Stinnerdaf45552013-08-28 00:53:59 +02007114#ifdef MS_WINDOWS
7115 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007116 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007117 }
7118#endif
7119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 Py_TYPE(&sock_type) = &PyType_Type;
7121 m = PyModule_Create(&socketmodule);
7122 if (m == NULL)
7123 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007124
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007125 Py_INCREF(PyExc_OSError);
7126 PySocketModuleAPI.error = PyExc_OSError;
7127 Py_INCREF(PyExc_OSError);
7128 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007130 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131 if (socket_herror == NULL)
7132 return NULL;
7133 Py_INCREF(socket_herror);
7134 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007135 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136 NULL);
7137 if (socket_gaierror == NULL)
7138 return NULL;
7139 Py_INCREF(socket_gaierror);
7140 PyModule_AddObject(m, "gaierror", socket_gaierror);
7141 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007142 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 if (socket_timeout == NULL)
7144 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007145 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 Py_INCREF(socket_timeout);
7147 PyModule_AddObject(m, "timeout", socket_timeout);
7148 Py_INCREF((PyObject *)&sock_type);
7149 if (PyModule_AddObject(m, "SocketType",
7150 (PyObject *)&sock_type) != 0)
7151 return NULL;
7152 Py_INCREF((PyObject *)&sock_type);
7153 if (PyModule_AddObject(m, "socket",
7154 (PyObject *)&sock_type) != 0)
7155 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007156
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007157#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007159#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162 Py_INCREF(has_ipv6);
7163 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165 /* Export C API */
7166 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7167 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7168 ) != 0)
7169 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007172#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007174#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007176#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007178#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007179#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007182#endif
7183#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007185#endif
7186#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007189#endif
7190#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007193#endif
7194#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007197#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007198#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007201#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007202#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007205#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007206#ifdef HAVE_SOCKADDR_ALG
7207 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7208#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007209#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007212#endif
7213#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007215#endif
7216#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007219#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007220#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007223#endif
7224#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007227#endif
7228#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007231#endif
7232#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007235#endif
7236#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, AF_NETLINK);
7239 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007240#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007242#endif
7243#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007245#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7247 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007248#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007250#endif
7251#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007253#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007254#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007256#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007257#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007259#endif
7260#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007262#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007264#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007265 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007266#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007267#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007269#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007270#ifdef NETLINK_CRYPTO
7271 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7272#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007273#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007274
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007275#ifdef AF_QIPCRTR
7276 /* Qualcomm IPCROUTER */
7277 PyModule_AddIntMacro(m, AF_QIPCRTR);
7278#endif
7279
caaveryeffc12f2017-09-06 18:18:10 -04007280#ifdef AF_VSOCK
7281 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7282 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7283 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7284 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7285 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7286 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7287 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7288 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7289 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7290#endif
7291
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007292#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007295#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007296#ifdef AF_LINK
7297 PyModule_AddIntMacro(m, AF_LINK);
7298#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007299#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007302#endif
7303#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007306#endif
7307#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007310#endif
7311#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007314#endif
7315#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007318#endif
7319#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007322#endif
7323#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007326#endif
7327#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007330#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007331
Hye-Shik Chang81268602004-02-02 06:05:24 +00007332#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007333 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007334#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007336#endif /* BTPROTO_L2CAP */
7337#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, BTPROTO_HCI);
7339 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007340#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007342#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007345#endif /* !__FreeBSD__ */
7346#endif /* !__NetBSD__ && !__DragonFly__ */
7347#endif /* BTPROTO_HCI */
7348#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007350#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7352 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007353#ifdef BTPROTO_SCO
7354 PyModule_AddIntMacro(m, BTPROTO_SCO);
7355#endif /* BTPROTO_SCO */
7356#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007357
Charles-François Natali47413c12011-10-06 19:47:44 +02007358#ifdef AF_CAN
7359 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007361#endif
7362#ifdef PF_CAN
7363 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007365#endif
7366
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007367/* Reliable Datagram Sockets */
7368#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007370#endif
7371#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007373#endif
7374
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007375/* Kernel event messages */
7376#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007378#endif
7379#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007381#endif
7382
Antoine Pitroub156a462010-10-27 20:13:57 +00007383#ifdef AF_PACKET
7384 PyModule_AddIntMacro(m, AF_PACKET);
7385#endif
7386#ifdef PF_PACKET
7387 PyModule_AddIntMacro(m, PF_PACKET);
7388#endif
7389#ifdef PACKET_HOST
7390 PyModule_AddIntMacro(m, PACKET_HOST);
7391#endif
7392#ifdef PACKET_BROADCAST
7393 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7394#endif
7395#ifdef PACKET_MULTICAST
7396 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7397#endif
7398#ifdef PACKET_OTHERHOST
7399 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7400#endif
7401#ifdef PACKET_OUTGOING
7402 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7403#endif
7404#ifdef PACKET_LOOPBACK
7405 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7406#endif
7407#ifdef PACKET_FASTROUTE
7408 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007409#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007410
Christian Heimes043d6f62008-01-07 17:19:16 +00007411#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7416 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7417 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007418
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7420 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7421 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, SOL_TIPC);
7425 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7426 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7427 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7428 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007429
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7431 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7432 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7433 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7437 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007438#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007441#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7443 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7444 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7445 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7446 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7447 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007448#endif
7449
Christian Heimesdffa3942016-09-05 23:54:41 +02007450#ifdef HAVE_SOCKADDR_ALG
7451 /* Socket options */
7452 PyModule_AddIntMacro(m, ALG_SET_KEY);
7453 PyModule_AddIntMacro(m, ALG_SET_IV);
7454 PyModule_AddIntMacro(m, ALG_SET_OP);
7455 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7456 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7457 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7458
7459 /* Operations */
7460 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7461 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7462 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7463 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7464#endif
7465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, SOCK_STREAM);
7468 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007469/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007470#ifdef SOCK_RAW
7471 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007473#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007475#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007477#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007478#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007480#endif
7481#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007483#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007485#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007493#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007494#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007496#endif
7497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007501#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007515#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007516#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007547#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007548#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007550#endif
7551#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007553#endif
7554#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007556#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007557#ifdef SO_PASSSEC
7558 PyModule_AddIntMacro(m, SO_PASSSEC);
7559#endif
7560#ifdef SO_PEERSEC
7561 PyModule_AddIntMacro(m, SO_PEERSEC);
7562#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007563#ifdef SO_BINDTODEVICE
7564 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7565#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007566#ifdef SO_PRIORITY
7567 PyModule_AddIntMacro(m, SO_PRIORITY);
7568#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007569#ifdef SO_MARK
7570 PyModule_AddIntMacro(m, SO_MARK);
7571#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007572#ifdef SO_DOMAIN
7573 PyModule_AddIntMacro(m, SO_DOMAIN);
7574#endif
7575#ifdef SO_PROTOCOL
7576 PyModule_AddIntMacro(m, SO_PROTOCOL);
7577#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579 /* Maximum number of connections for "listen" */
7580#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007582#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#endif
7585
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007586 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007587#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007589#endif
7590#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007592#endif
7593#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007595#endif
7596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597 /* Flags for send, recv */
7598#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007610#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007613#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007627#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007628#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007630#endif
7631#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007633#endif
7634#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007636#endif
7637#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007639#endif
7640#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007642#endif
7643#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007645#endif
7646#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007648#endif
7649#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007651#endif
7652#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007654#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007655#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007657#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659 /* Protocol level and numbers, usable for [gs]etsockopt */
7660#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007663#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007665#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007666 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007680#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007683#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007686 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007688#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007692#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007693#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007695#endif
7696#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7698 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007699#endif
7700#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7702 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7703 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007704
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7706 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7707 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007708#ifdef CAN_ISOTP
7709 PyModule_AddIntMacro(m, CAN_ISOTP);
7710#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007711#endif
7712#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7714 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7715 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7716 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007717#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007718#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7719 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7720#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007721#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007723
7724 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007725 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7726 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7727 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7728 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7729 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7730 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7731 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7732 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7733 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7734 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7735 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7736 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007737
7738 /* BCM flags */
7739 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7740 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7741 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7742 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7743 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7744 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7745 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7746 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7747 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7748 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7749 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7750#ifdef CAN_FD_FRAME
7751 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7752 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7753#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007754#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007755#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007757#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007758#ifdef HAVE_SOCKADDR_ALG
7759 PyModule_AddIntMacro(m, SOL_ALG);
7760#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007761#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007763#endif
7764#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007765 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007766#endif
7767#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007769#endif
7770#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007771 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007772#endif
7773#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007774 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007775#endif
7776#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007777 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007779#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007781#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007782 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007784#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007787#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007789#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007790 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007792#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007793 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007795#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007796 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007798#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007799 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007801#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007804#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007807#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007809#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007810 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007811#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007812#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007813 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007815#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007816 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007818#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007819 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007820#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007821 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007822#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007823#ifdef IPPROTO_UDPLITE
7824 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7825 #ifndef UDPLITE_SEND_CSCOV
7826 #define UDPLITE_SEND_CSCOV 10
7827 #endif
7828 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7829 #ifndef UDPLITE_RECV_CSCOV
7830 #define UDPLITE_RECV_CSCOV 11
7831 #endif
7832 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007846#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007849#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007852#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007855#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007858#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007861#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007864#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007873#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007879#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007888#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007890#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007891#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007894#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007896#endif
7897/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007898#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007900#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007901 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007905#endif
7906
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007907#ifdef MS_WINDOWS
7908 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7909 PyModule_AddIntMacro(m, IPPROTO_ST);
7910 PyModule_AddIntMacro(m, IPPROTO_CBT);
7911 PyModule_AddIntMacro(m, IPPROTO_IGP);
7912 PyModule_AddIntMacro(m, IPPROTO_RDP);
7913 PyModule_AddIntMacro(m, IPPROTO_PGM);
7914 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7915 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7916#endif
7917
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007918#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007920#endif
7921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007922 /* Some port configuration */
7923#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007924 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007925#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007926 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007928#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007929 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007930#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007932#endif
7933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007934 /* Some reserved IP v.4 addresses */
7935#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007936 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007937#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007938 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007940#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007941 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007942#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007943 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007945#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007947#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007948 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007950#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007952#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007953 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955#ifdef INADDR_ALLHOSTS_GROUP
7956 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7957 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007959 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007963#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007968#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007969 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007970#endif
7971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007972 /* IPv4 [gs]etsockopt options */
7973#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007977 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007979#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007980 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007982#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007983 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007985#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007986 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007989 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007991#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007992 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007995 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007998 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008000#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008001 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008003#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008004 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008006#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008007 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008013 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008019 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008020#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008021#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008022 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008023#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008025 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8026#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008027 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008029#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008030 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008032#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008033 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008035#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008036 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008038#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008039 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008041#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008042 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008044 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008045#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008046 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008048 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008049#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008050 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008051#endif
8052#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008054#endif
8055#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008056 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008057#endif
8058#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008059 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008060#endif
8061#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008062 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008063#endif
8064#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008065 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008066#endif
8067#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008068 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008069#endif
8070#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008071 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008072#endif
8073#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008074 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008075#endif
8076#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008077 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008078#endif
8079#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008080 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008081#endif
8082#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008083 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008084#endif
8085#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008087#endif
8088#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008090#endif
8091#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008093#endif
8094#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008096#endif
8097#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008099#endif
8100#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008102#endif
8103#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008105#endif
8106#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008108#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008110 /* TCP options */
8111#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008112 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008114#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008115 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008117#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008118 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008120#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008121 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008123#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008124 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008126#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008127 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008129#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008130 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008132#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008133 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008135#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008136 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008138#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008139 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008141#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008142 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008144#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008146#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008147#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008149#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008150#ifdef TCP_CONGESTION
8151 PyModule_AddIntMacro(m, TCP_CONGESTION);
8152#endif
8153#ifdef TCP_USER_TIMEOUT
8154 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8155#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008156#ifdef TCP_NOTSENT_LOWAT
8157 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8158#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008160 /* IPX options */
8161#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008162 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008163#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008164
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008165/* Reliable Datagram Sockets */
8166#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008168#endif
8169#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008171#endif
8172#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008173 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008174#endif
8175#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008176 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008177#endif
8178#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008180#endif
8181#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008182 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008183#endif
8184#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008185 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008186#endif
8187#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008188 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008189#endif
8190#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008191 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008192#endif
8193#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008194 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008195#endif
8196#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008197 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008198#endif
8199#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008200 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008201#endif
8202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008203 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008204#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008205 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008206#endif
8207#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008208 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008209#endif
8210#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008211 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008212#endif
8213#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008215#endif
8216#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008217 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008218#endif
8219#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008221#endif
8222#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008224#endif
8225#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008226 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008227#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008228#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008229 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008230#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008231#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008232 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008233#endif
8234#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008235 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008236#endif
8237#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008238 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008239#endif
8240#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008241 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008242#endif
8243#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008244 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008245#endif
8246#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008248#endif
8249#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008250 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008251#endif
8252#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008253 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008254#endif
8255#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008256 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008257#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008258#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008259 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008260#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008261#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008263#endif
8264#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008265 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008266#endif
8267#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008268 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008269#endif
8270#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008271 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008272#endif
8273#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008274 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008275#endif
8276#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008277 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008278#endif
8279#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008280 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008281#endif
8282#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008283 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008284#endif
8285#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008287#endif
8288#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008289 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008290#endif
8291#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008292 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008293#endif
8294#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008295 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008296#endif
8297#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008298 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008299#endif
8300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008301 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008302#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008303 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008304#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008305 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008306#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008307 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008308#endif
8309#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008310 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008311#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008312 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008313#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008314 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008315#endif
8316#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008317 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008318#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008319 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008320#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008321 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008322#endif
8323
Christian Heimesfaf2f632008-01-06 16:59:19 +00008324#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008325 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008326 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8327#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008328 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008329#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008330 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008331 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8332#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008333 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008334#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008335 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008336 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008337 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008338 PyObject *tmp;
8339 tmp = PyLong_FromUnsignedLong(codes[i]);
8340 if (tmp == NULL)
8341 return NULL;
8342 PyModule_AddObject(m, names[i], tmp);
8343 }
8344 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008345 PyModule_AddIntMacro(m, RCVALL_OFF);
8346 PyModule_AddIntMacro(m, RCVALL_ON);
8347 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008348#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008349 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008350#endif
8351#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008352 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008353#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008354#endif /* _MSTCPIP_ */
8355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008356 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008357#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008358 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008359#endif
animalize19e7d482018-02-27 02:10:36 +08008360
8361#ifdef MS_WINDOWS
8362 /* remove some flags on older version Windows during run-time */
8363 remove_unusable_flags(m);
8364#endif
8365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008366 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008367}