blob: 37b312396f9440bc2af4bb3cc9408a8b271989aa [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",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001673 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001674 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,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001691 sock_addr_t *addrbuf, 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 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001698 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001699 int retval = 0;
1700
1701 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1702 allow embedded nulls on Linux. */
1703 if (PyUnicode_Check(args)) {
1704 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1705 return 0;
1706 }
1707 else
1708 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001709 if (!PyArg_Parse(args, "y*", &path)) {
1710 Py_DECREF(args);
1711 return retval;
1712 }
1713 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001714
Victor Stinnerd565fb92019-10-10 21:30:20 +02001715 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001716#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001717 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001719 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001720 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001722 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 }
1724 }
1725 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 {
1728 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001729 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001730 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001732 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001734 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 }
1736 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001737 memcpy(addr->sun_path, path.buf, path.len);
1738 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001739 retval = 1;
1740 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001741 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001742 Py_DECREF(args);
1743 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001745#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001746
Martin v. Löwis11017b12006-01-14 18:12:57 +00001747#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 case AF_NETLINK:
1749 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001751 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 if (!PyTuple_Check(args)) {
1753 PyErr_Format(
1754 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001755 "%s(): AF_NETLINK address must be tuple, not %.500s",
1756 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 return 0;
1758 }
Oren Milman735171e2018-09-11 19:51:29 +03001759 if (!PyArg_ParseTuple(args,
1760 "II;AF_NETLINK address must be a pair "
1761 "(pid, groups)",
1762 &pid, &groups))
1763 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 addr->nl_family = AF_NETLINK;
1767 addr->nl_pid = pid;
1768 addr->nl_groups = groups;
1769 *len_ret = sizeof(*addr);
1770 return 1;
1771 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001772#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001773
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001774#if defined(AF_QIPCRTR)
1775 case AF_QIPCRTR:
1776 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001777 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001778 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001779 if (!PyTuple_Check(args)) {
1780 PyErr_Format(
1781 PyExc_TypeError,
1782 "getsockaddrarg: "
1783 "AF_QIPCRTR address must be tuple, not %.500s",
1784 Py_TYPE(args)->tp_name);
1785 return 0;
1786 }
1787 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1788 return 0;
1789 addr->sq_family = AF_QIPCRTR;
1790 addr->sq_node = node;
1791 addr->sq_port = port;
1792 *len_ret = sizeof(*addr);
1793 return 1;
1794 }
1795#endif /* AF_QIPCRTR */
1796
caaveryeffc12f2017-09-06 18:18:10 -04001797#if defined(AF_VSOCK)
1798 case AF_VSOCK:
1799 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001800 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001801 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001802 memset(addr, 0, sizeof(struct sockaddr_vm));
1803 if (!PyTuple_Check(args)) {
1804 PyErr_Format(
1805 PyExc_TypeError,
1806 "getsockaddrarg: "
1807 "AF_VSOCK address must be tuple, not %.500s",
1808 Py_TYPE(args)->tp_name);
1809 return 0;
1810 }
1811 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1812 return 0;
1813 addr->svm_family = s->sock_family;
1814 addr->svm_port = port;
1815 addr->svm_cid = cid;
1816 *len_ret = sizeof(*addr);
1817 return 1;
1818 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001819#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001820
1821
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001822#ifdef AF_RDS
1823 case AF_RDS:
1824 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001825#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 case AF_INET:
1828 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001829 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 int port, result;
1831 if (!PyTuple_Check(args)) {
1832 PyErr_Format(
1833 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001834 "%s(): AF_INET address must be tuple, not %.500s",
1835 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 return 0;
1837 }
Oren Milman735171e2018-09-11 19:51:29 +03001838 if (!PyArg_ParseTuple(args,
1839 "O&i;AF_INET address must be a pair "
1840 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001841 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001842 {
1843 assert(PyErr_Occurred());
1844 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1845 PyErr_Format(PyExc_OverflowError,
1846 "%s(): port must be 0-65535.", caller);
1847 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001849 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001850 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001851 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001853 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 if (result < 0)
1855 return 0;
1856 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001857 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001859 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return 0;
1861 }
1862 addr->sin_family = AF_INET;
1863 addr->sin_port = htons((short)port);
1864 *len_ret = sizeof *addr;
1865 return 1;
1866 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001867
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001868#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 case AF_INET6:
1870 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001871 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001872 int port, result;
1873 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 flowinfo = scope_id = 0;
1875 if (!PyTuple_Check(args)) {
1876 PyErr_Format(
1877 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001878 "%s(): AF_INET6 address must be tuple, not %.500s",
1879 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 return 0;
1881 }
Oren Milman735171e2018-09-11 19:51:29 +03001882 if (!PyArg_ParseTuple(args,
1883 "O&i|II;AF_INET6 address must be a tuple "
1884 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001885 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001886 &scope_id))
1887 {
1888 assert(PyErr_Occurred());
1889 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1890 PyErr_Format(PyExc_OverflowError,
1891 "%s(): port must be 0-65535.", caller);
1892 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 return 0;
1894 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001895 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001896 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001898 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 if (result < 0)
1900 return 0;
1901 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001902 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001904 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 0;
1906 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001907 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001908 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001909 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001910 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001911 return 0;
1912 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 addr->sin6_family = s->sock_family;
1914 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001915 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 addr->sin6_scope_id = scope_id;
1917 *len_ret = sizeof *addr;
1918 return 1;
1919 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001920#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001921
Hye-Shik Chang81268602004-02-02 06:05:24 +00001922#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 case AF_BLUETOOTH:
1924 {
1925 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001926#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 case BTPROTO_L2CAP:
1928 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001929 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001930
Victor Stinnerd565fb92019-10-10 21:30:20 +02001931 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 memset(addr, 0, sizeof(struct sockaddr_l2));
1933 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1934 if (!PyArg_ParseTuple(args, "si", &straddr,
1935 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001936 PyErr_Format(PyExc_OSError,
1937 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 return 0;
1939 }
1940 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1941 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 *len_ret = sizeof *addr;
1944 return 1;
1945 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001946#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 case BTPROTO_RFCOMM:
1948 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001949 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001950 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1952 if (!PyArg_ParseTuple(args, "si", &straddr,
1953 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001954 PyErr_Format(PyExc_OSError,
1955 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 return 0;
1957 }
1958 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1959 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 *len_ret = sizeof *addr;
1962 return 1;
1963 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001964#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 case BTPROTO_HCI:
1966 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001967 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001968#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001969 const char *straddr;
1970 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1971 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001972 PyErr_Format(PyExc_OSError, "%s: "
1973 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001974 return 0;
1975 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001976 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001977 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1978 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001979#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1981 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001982 PyErr_Format(PyExc_OSError,
1983 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 return 0;
1985 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001986#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 *len_ret = sizeof *addr;
1988 return 1;
1989 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001990#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 case BTPROTO_SCO:
1992 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001993 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001994
Victor Stinnerd565fb92019-10-10 21:30:20 +02001995 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1997 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001998 PyErr_Format(PyExc_OSError,
1999 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 return 0;
2001 }
2002 straddr = PyBytes_AS_STRING(args);
2003 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
2004 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 *len_ret = sizeof *addr;
2007 return 1;
2008 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002009#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002010#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 default:
Oren Milman735171e2018-09-11 19:51:29 +03002012 PyErr_Format(PyExc_OSError,
2013 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
2015 }
2016 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002017#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002018
Antoine Pitroub156a462010-10-27 20:13:57 +00002019#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 case AF_PACKET:
2021 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002023 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 int protoNumber;
2025 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04002026 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002027 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 if (!PyTuple_Check(args)) {
2030 PyErr_Format(
2031 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002032 "%s(): AF_PACKET address must be tuple, not %.500s",
2033 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 return 0;
2035 }
Oren Milman735171e2018-09-11 19:51:29 +03002036 /* XXX: improve the default error message according to the
2037 documentation of AF_PACKET, which would be added as part
2038 of bpo-25041. */
2039 if (!PyArg_ParseTuple(args,
2040 "si|iiy*;AF_PACKET address must be a tuple of "
2041 "two to five elements",
2042 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002043 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002044 {
2045 assert(PyErr_Occurred());
2046 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2047 PyErr_Format(PyExc_OverflowError,
2048 "%s(): address argument out of range", caller);
2049 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002051 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2053 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2054 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2055 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002056 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 return 0;
2058 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002059 if (haddr.buf && haddr.len > 8) {
2060 PyErr_SetString(PyExc_ValueError,
2061 "Hardware address must be 8 bytes or less");
2062 PyBuffer_Release(&haddr);
2063 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 }
2065 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002066 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002068 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002069 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 return 0;
2071 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002072 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 addr->sll_family = AF_PACKET;
2074 addr->sll_protocol = htons((short)protoNumber);
2075 addr->sll_ifindex = ifr.ifr_ifindex;
2076 addr->sll_pkttype = pkttype;
2077 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002078 if (haddr.buf) {
2079 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2080 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002082 else
2083 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002085 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 return 1;
2087 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002088#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002089
Christian Heimes043d6f62008-01-07 17:19:16 +00002090#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 case AF_TIPC:
2092 {
2093 unsigned int atype, v1, v2, v3;
2094 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 if (!PyTuple_Check(args)) {
2097 PyErr_Format(
2098 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002099 "%s(): AF_TIPC address must be tuple, not %.500s",
2100 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 return 0;
2102 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002105 "IIII|I;AF_TIPC address must be a tuple "
2106 "(addr_type, v1, v2, v3[, scope])",
2107 &atype, &v1, &v2, &v3, &scope))
2108 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002110 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002111
Victor Stinnerd565fb92019-10-10 21:30:20 +02002112 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 addr->family = AF_TIPC;
2116 addr->scope = scope;
2117 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 if (atype == TIPC_ADDR_NAMESEQ) {
2120 addr->addr.nameseq.type = v1;
2121 addr->addr.nameseq.lower = v2;
2122 addr->addr.nameseq.upper = v3;
2123 } else if (atype == TIPC_ADDR_NAME) {
2124 addr->addr.name.name.type = v1;
2125 addr->addr.name.name.instance = v2;
2126 } else if (atype == TIPC_ADDR_ID) {
2127 addr->addr.id.node = v1;
2128 addr->addr.id.ref = v2;
2129 } else {
2130 /* Shouldn't happen */
2131 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2132 return 0;
2133 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 return 1;
2138 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002139#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002140
Serhiy Storchakad3187152017-11-09 18:00:38 +02002141#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002142 case AF_CAN:
2143 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002144#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002145 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002146 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002147#endif
2148#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002149 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002150#endif
2151#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002152 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002153 PyObject *interfaceName;
2154 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002155 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002156 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002157
Oren Milman735171e2018-09-11 19:51:29 +03002158 if (!PyTuple_Check(args)) {
2159 PyErr_Format(PyExc_TypeError,
2160 "%s(): AF_CAN address must be tuple, not %.500s",
2161 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002162 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002163 }
2164 if (!PyArg_ParseTuple(args,
2165 "O&;AF_CAN address must be a tuple "
2166 "(interface, )",
2167 PyUnicode_FSConverter, &interfaceName))
2168 {
2169 return 0;
2170 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002171
2172 len = PyBytes_GET_SIZE(interfaceName);
2173
2174 if (len == 0) {
2175 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002176 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002177 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2178 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002179 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2180 s->errorhandler();
2181 Py_DECREF(interfaceName);
2182 return 0;
2183 }
2184 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002185 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002186 "AF_CAN interface name too long");
2187 Py_DECREF(interfaceName);
2188 return 0;
2189 }
2190
2191 addr->can_family = AF_CAN;
2192 addr->can_ifindex = ifr.ifr_ifindex;
2193
2194 *len_ret = sizeof(*addr);
2195 Py_DECREF(interfaceName);
2196 return 1;
2197 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002198#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002199
2200#ifdef CAN_ISOTP
2201 case CAN_ISOTP:
2202 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002203 PyObject *interfaceName;
2204 struct ifreq ifr;
2205 Py_ssize_t len;
2206 unsigned long int rx_id, tx_id;
2207
Victor Stinnerd565fb92019-10-10 21:30:20 +02002208 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002209
2210 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2211 &interfaceName,
2212 &rx_id,
2213 &tx_id))
2214 return 0;
2215
2216 len = PyBytes_GET_SIZE(interfaceName);
2217
2218 if (len == 0) {
2219 ifr.ifr_ifindex = 0;
2220 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2221 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2222 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2223 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2224 s->errorhandler();
2225 Py_DECREF(interfaceName);
2226 return 0;
2227 }
2228 } else {
2229 PyErr_SetString(PyExc_OSError,
2230 "AF_CAN interface name too long");
2231 Py_DECREF(interfaceName);
2232 return 0;
2233 }
2234
2235 addr->can_family = AF_CAN;
2236 addr->can_ifindex = ifr.ifr_ifindex;
2237 addr->can_addr.tp.rx_id = rx_id;
2238 addr->can_addr.tp.tx_id = tx_id;
2239
2240 *len_ret = sizeof(*addr);
2241 Py_DECREF(interfaceName);
2242 return 1;
2243 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002244#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002245 default:
Oren Milman735171e2018-09-11 19:51:29 +03002246 PyErr_Format(PyExc_OSError,
2247 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002248 return 0;
2249 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002250#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002251
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002252#ifdef PF_SYSTEM
2253 case PF_SYSTEM:
2254 switch (s->sock_proto) {
2255#ifdef SYSPROTO_CONTROL
2256 case SYSPROTO_CONTROL:
2257 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002258 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002259 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002260 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002261
2262 if (PyUnicode_Check(args)) {
2263 struct ctl_info info;
2264 PyObject *ctl_name;
2265
2266 if (!PyArg_Parse(args, "O&",
2267 PyUnicode_FSConverter, &ctl_name)) {
2268 return 0;
2269 }
2270
Victor Stinnerf50e1872015-03-20 11:32:24 +01002271 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002272 PyErr_SetString(PyExc_ValueError,
2273 "provided string is too long");
2274 Py_DECREF(ctl_name);
2275 return 0;
2276 }
2277 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2278 sizeof(info.ctl_name));
2279 Py_DECREF(ctl_name);
2280
2281 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2282 PyErr_SetString(PyExc_OSError,
2283 "cannot find kernel control with provided name");
2284 return 0;
2285 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002286
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002287 addr->sc_id = info.ctl_id;
2288 addr->sc_unit = 0;
2289 } else if (!PyArg_ParseTuple(args, "II",
2290 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002291 PyErr_Format(PyExc_TypeError,
2292 "%s(): PF_SYSTEM address must be a str or "
2293 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002294 return 0;
2295 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002296
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002297 *len_ret = sizeof(*addr);
2298 return 1;
2299 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002300#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002301 default:
Oren Milman735171e2018-09-11 19:51:29 +03002302 PyErr_Format(PyExc_OSError,
2303 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002304 return 0;
2305 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002306#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002307#ifdef HAVE_SOCKADDR_ALG
2308 case AF_ALG:
2309 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002310 const char *type;
2311 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002312 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002313
2314 memset(sa, 0, sizeof(*sa));
2315 sa->salg_family = AF_ALG;
2316
Oren Milman735171e2018-09-11 19:51:29 +03002317 if (!PyTuple_Check(args)) {
2318 PyErr_Format(PyExc_TypeError,
2319 "%s(): AF_ALG address must be tuple, not %.500s",
2320 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002321 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002322 }
2323 if (!PyArg_ParseTuple(args,
2324 "ss|HH;AF_ALG address must be a tuple "
2325 "(type, name[, feat[, mask]])",
2326 &type, &name, &sa->salg_feat, &sa->salg_mask))
2327 {
2328 return 0;
2329 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002330 /* sockaddr_alg has fixed-sized char arrays for type, and name
2331 * both must be NULL terminated.
2332 */
2333 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002334 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2335 return 0;
2336 }
2337 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002338 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002339 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2340 return 0;
2341 }
2342 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2343
2344 *len_ret = sizeof(*sa);
2345 return 1;
2346 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002347#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 default:
Oren Milman735171e2018-09-11 19:51:29 +03002352 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002356}
2357
Guido van Rossum30a685f1991-06-27 15:51:29 +00002358
Guido van Rossum48a680c2001-03-02 06:34:14 +00002359/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002360 Return 1 if the family is known, 0 otherwise. The length is returned
2361 through len_ret. */
2362
2363static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002364getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002367
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002368#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 case AF_UNIX:
2370 {
2371 *len_ret = sizeof (struct sockaddr_un);
2372 return 1;
2373 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002374#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002375
Martin v. Löwis11017b12006-01-14 18:12:57 +00002376#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002377 case AF_NETLINK:
2378 {
2379 *len_ret = sizeof (struct sockaddr_nl);
2380 return 1;
2381 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002382#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002383
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002384#if defined(AF_QIPCRTR)
2385 case AF_QIPCRTR:
2386 {
2387 *len_ret = sizeof (struct sockaddr_qrtr);
2388 return 1;
2389 }
2390#endif /* AF_QIPCRTR */
2391
caaveryeffc12f2017-09-06 18:18:10 -04002392#if defined(AF_VSOCK)
2393 case AF_VSOCK:
2394 {
2395 *len_ret = sizeof (struct sockaddr_vm);
2396 return 1;
2397 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002398#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002399
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002400#ifdef AF_RDS
2401 case AF_RDS:
2402 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002403#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 case AF_INET:
2406 {
2407 *len_ret = sizeof (struct sockaddr_in);
2408 return 1;
2409 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002410
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002411#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 case AF_INET6:
2413 {
2414 *len_ret = sizeof (struct sockaddr_in6);
2415 return 1;
2416 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002417#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002418
Hye-Shik Chang81268602004-02-02 06:05:24 +00002419#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 case AF_BLUETOOTH:
2421 {
2422 switch(s->sock_proto)
2423 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002424
Greg Bowser8fbece12019-08-02 16:29:52 -04002425#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 case BTPROTO_L2CAP:
2427 *len_ret = sizeof (struct sockaddr_l2);
2428 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002429#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 case BTPROTO_RFCOMM:
2431 *len_ret = sizeof (struct sockaddr_rc);
2432 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002433#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 case BTPROTO_HCI:
2435 *len_ret = sizeof (struct sockaddr_hci);
2436 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002437#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 case BTPROTO_SCO:
2439 *len_ret = sizeof (struct sockaddr_sco);
2440 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002441#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002442#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002444 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 "unknown BT protocol");
2446 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 }
2449 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002450#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002451
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002452#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 case AF_PACKET:
2454 {
2455 *len_ret = sizeof (struct sockaddr_ll);
2456 return 1;
2457 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002458#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002459
Christian Heimes043d6f62008-01-07 17:19:16 +00002460#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 case AF_TIPC:
2462 {
2463 *len_ret = sizeof (struct sockaddr_tipc);
2464 return 1;
2465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002466#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002467
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002468#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002469 case AF_CAN:
2470 {
2471 *len_ret = sizeof (struct sockaddr_can);
2472 return 1;
2473 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002474#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002475
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002476#ifdef PF_SYSTEM
2477 case PF_SYSTEM:
2478 switch(s->sock_proto) {
2479#ifdef SYSPROTO_CONTROL
2480 case SYSPROTO_CONTROL:
2481 *len_ret = sizeof (struct sockaddr_ctl);
2482 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002483#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002484 default:
2485 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2486 "unknown PF_SYSTEM protocol");
2487 return 0;
2488 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002489#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002490#ifdef HAVE_SOCKADDR_ALG
2491 case AF_ALG:
2492 {
2493 *len_ret = sizeof (struct sockaddr_alg);
2494 return 1;
2495 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002496#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002501 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002505}
2506
2507
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002508/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2509 Currently, these methods are only compiled if the RFC 2292/3542
2510 CMSG_LEN() macro is available. Older systems seem to have used
2511 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2512 it may be possible to define CMSG_LEN() that way if it's not
2513 provided. Some architectures might need extra padding after the
2514 cmsghdr, however, and CMSG_LEN() would have to take account of
2515 this. */
2516#ifdef CMSG_LEN
2517/* If length is in range, set *result to CMSG_LEN(length) and return
2518 true; otherwise, return false. */
2519static int
2520get_CMSG_LEN(size_t length, size_t *result)
2521{
2522 size_t tmp;
2523
2524 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2525 return 0;
2526 tmp = CMSG_LEN(length);
2527 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2528 return 0;
2529 *result = tmp;
2530 return 1;
2531}
2532
2533#ifdef CMSG_SPACE
2534/* If length is in range, set *result to CMSG_SPACE(length) and return
2535 true; otherwise, return false. */
2536static int
2537get_CMSG_SPACE(size_t length, size_t *result)
2538{
2539 size_t tmp;
2540
2541 /* Use CMSG_SPACE(1) here in order to take account of the padding
2542 necessary before *and* after the data. */
2543 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2544 return 0;
2545 tmp = CMSG_SPACE(length);
2546 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2547 return 0;
2548 *result = tmp;
2549 return 1;
2550}
2551#endif
2552
2553/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2554 pointer in msg->msg_control with at least "space" bytes after it,
2555 and its cmsg_len member inside the buffer. */
2556static int
2557cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2558{
2559 size_t cmsg_offset;
2560 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2561 sizeof(cmsgh->cmsg_len));
2562
Charles-François Natali466517d2011-08-28 18:23:43 +02002563 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002564 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002565 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002566 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2567 annoying under OS X as it's unsigned there and so it triggers a
2568 tautological comparison warning under Clang when compared against 0.
2569 Since the check is valid on other platforms, silence the warning under
2570 Clang. */
2571 #ifdef __clang__
2572 #pragma clang diagnostic push
2573 #pragma clang diagnostic ignored "-Wtautological-compare"
2574 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002575 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002576 #pragma GCC diagnostic push
2577 #pragma GCC diagnostic ignored "-Wtype-limits"
2578 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002579 if (msg->msg_controllen < 0)
2580 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002581 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002582 #pragma GCC diagnostic pop
2583 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002584 #ifdef __clang__
2585 #pragma clang diagnostic pop
2586 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002587 if (space < cmsg_len_end)
2588 space = cmsg_len_end;
2589 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2590 return (cmsg_offset <= (size_t)-1 - space &&
2591 cmsg_offset + space <= msg->msg_controllen);
2592}
2593
2594/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2595 *space to number of bytes following it in the buffer and return
2596 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2597 msg->msg_controllen are valid. */
2598static int
2599get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2600{
2601 size_t data_offset;
2602 char *data_ptr;
2603
2604 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2605 return 0;
2606 data_offset = data_ptr - (char *)msg->msg_control;
2607 if (data_offset > msg->msg_controllen)
2608 return 0;
2609 *space = msg->msg_controllen - data_offset;
2610 return 1;
2611}
2612
2613/* If cmsgh is invalid or not contained in the buffer pointed to by
2614 msg->msg_control, return -1. If cmsgh is valid and its associated
2615 data is entirely contained in the buffer, set *data_len to the
2616 length of the associated data and return 0. If only part of the
2617 associated data is contained in the buffer but cmsgh is otherwise
2618 valid, set *data_len to the length contained in the buffer and
2619 return 1. */
2620static int
2621get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2622{
2623 size_t space, cmsg_data_len;
2624
2625 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2626 cmsgh->cmsg_len < CMSG_LEN(0))
2627 return -1;
2628 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2629 if (!get_cmsg_data_space(msg, cmsgh, &space))
2630 return -1;
2631 if (space >= cmsg_data_len) {
2632 *data_len = cmsg_data_len;
2633 return 0;
2634 }
2635 *data_len = space;
2636 return 1;
2637}
2638#endif /* CMSG_LEN */
2639
2640
Victor Stinner31bf2d52015-04-01 21:57:09 +02002641struct sock_accept {
2642 socklen_t *addrlen;
2643 sock_addr_t *addrbuf;
2644 SOCKET_T result;
2645};
2646
2647#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2648/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2649static int accept4_works = -1;
2650#endif
2651
2652static int
2653sock_accept_impl(PySocketSockObject *s, void *data)
2654{
2655 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002656 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2657 socklen_t *paddrlen = ctx->addrlen;
2658#ifdef HAVE_SOCKADDR_ALG
2659 /* AF_ALG does not support accept() with addr and raises
2660 * ECONNABORTED instead. */
2661 if (s->sock_family == AF_ALG) {
2662 addr = NULL;
2663 paddrlen = NULL;
2664 *ctx->addrlen = 0;
2665 }
2666#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002667
2668#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2669 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002670 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002671 SOCK_CLOEXEC);
2672 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2673 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2674 accept4_works = (errno != ENOSYS);
2675 }
2676 }
2677 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002678 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002679#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002680 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002681#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002682
2683#ifdef MS_WINDOWS
2684 return (ctx->result != INVALID_SOCKET);
2685#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002686 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002687#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002688}
2689
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002690/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002691
Guido van Rossum73624e91994-10-10 17:59:00 +00002692static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302693sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002696 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 socklen_t addrlen;
2698 PyObject *sock = NULL;
2699 PyObject *addr = NULL;
2700 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002701 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 if (!getsockaddrlen(s, &addrlen))
2704 return NULL;
2705 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 if (!IS_SELECTABLE(s))
2708 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002709
Victor Stinner31bf2d52015-04-01 21:57:09 +02002710 ctx.addrlen = &addrlen;
2711 ctx.addrbuf = &addrbuf;
2712 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002714 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002715
Victor Stinnerdaf45552013-08-28 00:53:59 +02002716#ifdef MS_WINDOWS
2717 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2718 PyErr_SetFromWindowsErr(0);
2719 SOCKETCLOSE(newfd);
2720 goto finally;
2721 }
2722#else
2723
2724#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2725 if (!accept4_works)
2726#endif
2727 {
2728 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2729 SOCKETCLOSE(newfd);
2730 goto finally;
2731 }
2732 }
2733#endif
2734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 sock = PyLong_FromSocket_t(newfd);
2736 if (sock == NULL) {
2737 SOCKETCLOSE(newfd);
2738 goto finally;
2739 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2742 addrlen, s->sock_proto);
2743 if (addr == NULL)
2744 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002747
Guido van Rossum67f7a382002-06-06 21:08:16 +00002748finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 Py_XDECREF(sock);
2750 Py_XDECREF(addr);
2751 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002752}
2753
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002754PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002755"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002756\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002757Wait for an incoming connection. Return a new socket file descriptor\n\
2758representing the connection, and the address of the client.\n\
2759For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002760
Guido van Rossum11ba0942002-06-13 15:07:44 +00002761/* s.setblocking(flag) method. Argument:
2762 False -- non-blocking mode; same as settimeout(0)
2763 True -- blocking mode; same as settimeout(None)
2764*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002765
Guido van Rossum73624e91994-10-10 17:59:00 +00002766static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002767sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002768{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002769 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 block = PyLong_AsLong(arg);
2772 if (block == -1 && PyErr_Occurred())
2773 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002774
Victor Stinner9001d802015-04-06 23:06:01 +02002775 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002776 if (internal_setblocking(s, block) == -1) {
2777 return NULL;
2778 }
2779 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002780}
Guido van Rossume4485b01994-09-07 14:32:49 +00002781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002782PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002783"setblocking(flag)\n\
2784\n\
2785Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002786setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002787setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002788
Yury Selivanovf11b4602018-01-28 17:27:38 -05002789/* s.getblocking() method.
2790 Returns True if socket is in blocking mode,
2791 False if it is in non-blocking mode.
2792*/
2793static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302794sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002795{
2796 if (s->sock_timeout) {
2797 Py_RETURN_TRUE;
2798 }
2799 else {
2800 Py_RETURN_FALSE;
2801 }
2802}
2803
2804PyDoc_STRVAR(getblocking_doc,
2805"getblocking()\n\
2806\n\
2807Returns True if socket is in blocking mode, or False if it\n\
2808is in non-blocking mode.");
2809
Victor Stinner71694d52015-03-28 01:18:54 +01002810static int
2811socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2812{
2813#ifdef MS_WINDOWS
2814 struct timeval tv;
2815#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002816#ifndef HAVE_POLL
2817 _PyTime_t ms;
2818#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002819 int overflow = 0;
2820
2821 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002822 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002823 return 0;
2824 }
2825
Victor Stinner869e1772015-03-30 03:49:14 +02002826 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002827 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002828 return -1;
2829
2830 if (*timeout < 0) {
2831 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2832 return -1;
2833 }
2834
2835#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002836 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002837#endif
2838#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002839 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002840 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002841#endif
2842 if (overflow) {
2843 PyErr_SetString(PyExc_OverflowError,
2844 "timeout doesn't fit into C timeval");
2845 return -1;
2846 }
2847
2848 return 0;
2849}
2850
Guido van Rossum11ba0942002-06-13 15:07:44 +00002851/* s.settimeout(timeout) method. Argument:
2852 None -- no timeout, blocking mode; same as setblocking(True)
2853 0.0 -- non-blocking mode; same as setblocking(False)
2854 > 0 -- timeout mode; operations time out after timeout seconds
2855 < 0 -- illegal; raises an exception
2856*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002857static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002858sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859{
Victor Stinner71694d52015-03-28 01:18:54 +01002860 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002861
Victor Stinner71694d52015-03-28 01:18:54 +01002862 if (socket_parse_timeout(&timeout, arg) < 0)
2863 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002866
2867 int block = timeout < 0;
2868 /* Blocking mode for a Python socket object means that operations
2869 like :meth:`recv` or :meth:`sendall` will block the execution of
2870 the current thread until they are complete or aborted with a
2871 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2872 the underlying FD is in a blocking mode. When timeout is a positive
2873 number, the FD is in a non-blocking mode, and socket ops are
2874 implemented with a `select()` call.
2875
2876 When timeout is 0.0, the FD is in a non-blocking mode.
2877
2878 This table summarizes all states in which the socket object and
2879 its underlying FD can be:
2880
2881 ==================== ===================== ==============
2882 `gettimeout()` `getblocking()` FD
2883 ==================== ===================== ==============
2884 ``None`` ``True`` blocking
2885 ``0.0`` ``False`` non-blocking
2886 ``> 0`` ``True`` non-blocking
2887 */
2888
2889 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002890 return NULL;
2891 }
2892 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002893}
2894
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002895PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002896"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002897\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002898Set a timeout on socket operations. 'timeout' can be a float,\n\
2899giving in seconds, or None. Setting a timeout of None disables\n\
2900the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002901Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002903/* s.gettimeout() method.
2904 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002905static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302906sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002907{
Victor Stinner71694d52015-03-28 01:18:54 +01002908 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002909 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 }
Victor Stinner71694d52015-03-28 01:18:54 +01002911 else {
2912 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2913 return PyFloat_FromDouble(seconds);
2914 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915}
2916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002917PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002918"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002919\n\
oldkaa0735f2018-02-02 16:52:55 +08002920Returns the timeout in seconds (float) associated with socket\n\
2921operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002922operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002923
Guido van Rossumaee08791992-09-08 09:05:33 +00002924/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002925 With an integer third argument, sets an integer optval with optlen=4.
2926 With None as third argument and an integer fourth argument, set
2927 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002928 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002929 use optional built-in module 'struct' to encode the string.
2930*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002931
Guido van Rossum73624e91994-10-10 17:59:00 +00002932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002933sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 int level;
2936 int optname;
2937 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002938 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002940 unsigned int optlen;
2941 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002942
caaveryeffc12f2017-09-06 18:18:10 -04002943#ifdef AF_VSOCK
2944 if (s->sock_family == AF_VSOCK) {
2945 uint64_t vflag; // Must be set width of 64 bits
2946 /* setsockopt(level, opt, flag) */
2947 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2948 &level, &optname, &vflag)) {
2949 // level should always be set to AF_VSOCK
2950 res = setsockopt(s->sock_fd, level, optname,
2951 (void*)&vflag, sizeof vflag);
2952 goto done;
2953 }
2954 return NULL;
2955 }
2956#endif
2957
Christian Heimesdffa3942016-09-05 23:54:41 +02002958 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 if (PyArg_ParseTuple(args, "iii:setsockopt",
2960 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002961 res = setsockopt(s->sock_fd, level, optname,
2962 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002963 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002965
2966 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002967 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002968 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2969 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2970 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002971 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002972 NULL, (socklen_t)optlen);
2973 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002975
2976 PyErr_Clear();
2977 /* setsockopt(level, opt, buffer) */
2978 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2979 &level, &optname, &optval))
2980 return NULL;
2981
2982#ifdef MS_WINDOWS
2983 if (optval.len > INT_MAX) {
2984 PyBuffer_Release(&optval);
2985 PyErr_Format(PyExc_OverflowError,
2986 "socket option is larger than %i bytes",
2987 INT_MAX);
2988 return NULL;
2989 }
2990 res = setsockopt(s->sock_fd, level, optname,
2991 optval.buf, (int)optval.len);
2992#else
2993 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2994#endif
2995 PyBuffer_Release(&optval);
2996
2997done:
Victor Stinnercc739322016-03-23 21:35:29 +01002998 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003000 }
3001
3002 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003003}
3004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003005PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003006"setsockopt(level, option, value: int)\n\
3007setsockopt(level, option, value: buffer)\n\
3008setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003009\n\
3010Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003011The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003012None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003013
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003014
Guido van Rossumaee08791992-09-08 09:05:33 +00003015/* s.getsockopt() method.
3016 With two arguments, retrieves an integer option.
3017 With a third integer argument, retrieves a string buffer of that size;
3018 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003019
Guido van Rossum73624e91994-10-10 17:59:00 +00003020static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003021sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 int level;
3024 int optname;
3025 int res;
3026 PyObject *buf;
3027 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003028 int flag = 0;
3029 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3032 &level, &optname, &buflen))
3033 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003036#ifdef AF_VSOCK
3037 if (s->sock_family == AF_VSOCK) {
3038 uint64_t vflag = 0; // Must be set width of 64 bits
3039 flagsize = sizeof vflag;
3040 res = getsockopt(s->sock_fd, level, optname,
3041 (void *)&vflag, &flagsize);
3042 if (res < 0)
3043 return s->errorhandler();
3044 return PyLong_FromUnsignedLong(vflag);
3045 }
3046#endif
3047 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 res = getsockopt(s->sock_fd, level, optname,
3049 (void *)&flag, &flagsize);
3050 if (res < 0)
3051 return s->errorhandler();
3052 return PyLong_FromLong(flag);
3053 }
caaveryeffc12f2017-09-06 18:18:10 -04003054#ifdef AF_VSOCK
3055 if (s->sock_family == AF_VSOCK) {
3056 PyErr_SetString(PyExc_OSError,
3057 "getsockopt string buffer not allowed");
3058 return NULL;
3059 }
3060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003062 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 "getsockopt buflen out of range");
3064 return NULL;
3065 }
3066 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3067 if (buf == NULL)
3068 return NULL;
3069 res = getsockopt(s->sock_fd, level, optname,
3070 (void *)PyBytes_AS_STRING(buf), &buflen);
3071 if (res < 0) {
3072 Py_DECREF(buf);
3073 return s->errorhandler();
3074 }
3075 _PyBytes_Resize(&buf, buflen);
3076 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003077}
3078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003079PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003080"getsockopt(level, option[, buffersize]) -> value\n\
3081\n\
3082Get a socket option. See the Unix manual for level and option.\n\
3083If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003084string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003085
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003086
Fred Drake728819a2000-07-01 03:40:12 +00003087/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003088
Guido van Rossum73624e91994-10-10 17:59:00 +00003089static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003090sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 sock_addr_t addrbuf;
3093 int addrlen;
3094 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003095
Victor Stinnerd565fb92019-10-10 21:30:20 +02003096 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003098 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003099
3100 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3101 return NULL;
3102 }
3103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 Py_BEGIN_ALLOW_THREADS
3105 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3106 Py_END_ALLOW_THREADS
3107 if (res < 0)
3108 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003109 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003110}
3111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003112PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003113"bind(address)\n\
3114\n\
3115Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003116pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003117sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003118
Guido van Rossum30a685f1991-06-27 15:51:29 +00003119
3120/* s.close() method.
3121 Set the file descriptor to -1 so operations tried subsequently
3122 will surely fail. */
3123
Guido van Rossum73624e91994-10-10 17:59:00 +00003124static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303125sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003128 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003129
Victor Stinner19a8e842016-03-21 16:36:48 +01003130 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003131 if (fd != INVALID_SOCKET) {
3132 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003133
3134 /* We do not want to retry upon EINTR: see
3135 http://lwn.net/Articles/576478/ and
3136 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3137 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003139 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003141 /* bpo-30319: The peer can already have closed the connection.
3142 Python ignores ECONNRESET on close(). */
3143 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003144 return s->errorhandler();
3145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003147 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003148}
3149
Christian Heimesd0e31b92018-01-27 09:54:13 +01003150PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003151"close()\n\
3152\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003153Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003154
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003155static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303156sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003157{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003158 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003159 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003160 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003161}
3162
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003163PyDoc_STRVAR(detach_doc,
3164"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003165\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003166Close the socket object without closing the underlying file descriptor.\n\
3167The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003168can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003169
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003170static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003171sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003172{
Victor Stinner81c41db2015-04-02 11:50:57 +02003173 int err;
3174 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003175
Victor Stinner81c41db2015-04-02 11:50:57 +02003176 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3177 /* getsockopt() failed */
3178 return 0;
3179 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003180
Victor Stinner81c41db2015-04-02 11:50:57 +02003181 if (err == EISCONN)
3182 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003183 if (err != 0) {
3184 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3185 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003186 return 0;
3187 }
3188 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003189}
3190
3191static int
3192internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3193 int raise)
3194{
3195 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003196
3197 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003199 Py_END_ALLOW_THREADS
3200
Victor Stinner70a46f62015-03-31 22:03:59 +02003201 if (!res) {
3202 /* connect() succeeded, the socket is connected */
3203 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003205
Victor Stinner81c41db2015-04-02 11:50:57 +02003206 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003207
Victor Stinner81c41db2015-04-02 11:50:57 +02003208 /* save error, PyErr_CheckSignals() can replace it */
3209 err = GET_SOCK_ERROR;
3210 if (CHECK_ERRNO(EINTR)) {
3211 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003212 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003213
3214 /* Issue #23618: when connect() fails with EINTR, the connection is
3215 running asynchronously.
3216
3217 If the socket is blocking or has a timeout, wait until the
3218 connection completes, fails or timed out using select(), and then
3219 get the connection status using getsockopt(SO_ERROR).
3220
3221 If the socket is non-blocking, raise InterruptedError. The caller is
3222 responsible to wait until the connection completes, fails or timed
3223 out (it's the case in asyncio for example). */
3224 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3225 }
3226 else {
3227 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3228 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003229 }
3230
Victor Stinner81c41db2015-04-02 11:50:57 +02003231 if (!wait_connect) {
3232 if (raise) {
3233 /* restore error, maybe replaced by PyErr_CheckSignals() */
3234 SET_SOCK_ERROR(err);
3235 s->errorhandler();
3236 return -1;
3237 }
3238 else
3239 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003240 }
3241
Victor Stinner81c41db2015-04-02 11:50:57 +02003242 if (raise) {
3243 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003244 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3245 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003246 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003247 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003248 else {
3249 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003250 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3251 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003252 return err;
3253 }
3254 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003255}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003256
Fred Drake728819a2000-07-01 03:40:12 +00003257/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003258
Guido van Rossum73624e91994-10-10 17:59:00 +00003259static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003260sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 sock_addr_t addrbuf;
3263 int addrlen;
3264 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003265
Victor Stinnerd565fb92019-10-10 21:30:20 +02003266 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003268 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003269
Steve Dowerb82e17e2019-05-23 08:45:22 -07003270 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3271 return NULL;
3272 }
3273
Victor Stinner81c41db2015-04-02 11:50:57 +02003274 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003275 if (res < 0)
3276 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003277
Victor Stinneree699e92015-03-31 21:28:42 +02003278 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003279}
3280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003281PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003282"connect(address)\n\
3283\n\
3284Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003285is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003286
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287
Fred Drake728819a2000-07-01 03:40:12 +00003288/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003289
3290static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003291sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 sock_addr_t addrbuf;
3294 int addrlen;
3295 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003296
Victor Stinnerd565fb92019-10-10 21:30:20 +02003297 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003299 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003300
Steve Dowerb82e17e2019-05-23 08:45:22 -07003301 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3302 return NULL;
3303 }
3304
Victor Stinner81c41db2015-04-02 11:50:57 +02003305 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003306 if (res < 0)
3307 return NULL;
3308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003310}
3311
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003312PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003313"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003314\n\
3315This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003316instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003317
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003318
Guido van Rossumed233a51992-06-23 09:07:03 +00003319/* s.fileno() method */
3320
Guido van Rossum73624e91994-10-10 17:59:00 +00003321static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303322sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003325}
3326
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003327PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328"fileno() -> integer\n\
3329\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003330Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003331
Guido van Rossumed233a51992-06-23 09:07:03 +00003332
Guido van Rossumc89705d1992-11-26 08:54:07 +00003333/* s.getsockname() method */
3334
Guido van Rossum73624e91994-10-10 17:59:00 +00003335static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303336sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 sock_addr_t addrbuf;
3339 int res;
3340 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 if (!getsockaddrlen(s, &addrlen))
3343 return NULL;
3344 memset(&addrbuf, 0, addrlen);
3345 Py_BEGIN_ALLOW_THREADS
3346 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3347 Py_END_ALLOW_THREADS
3348 if (res < 0)
3349 return s->errorhandler();
3350 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3351 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003352}
3353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003354PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003355"getsockname() -> address info\n\
3356\n\
3357Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003358info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003359
Guido van Rossumc89705d1992-11-26 08:54:07 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003362/* s.getpeername() method */
3363
Guido van Rossum73624e91994-10-10 17:59:00 +00003364static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303365sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 sock_addr_t addrbuf;
3368 int res;
3369 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 if (!getsockaddrlen(s, &addrlen))
3372 return NULL;
3373 memset(&addrbuf, 0, addrlen);
3374 Py_BEGIN_ALLOW_THREADS
3375 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3376 Py_END_ALLOW_THREADS
3377 if (res < 0)
3378 return s->errorhandler();
3379 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3380 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003381}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003383PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003384"getpeername() -> address info\n\
3385\n\
3386Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003387info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003388
Guido van Rossumb6775db1994-08-01 11:34:53 +00003389#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003390
3391
Guido van Rossum30a685f1991-06-27 15:51:29 +00003392/* s.listen(n) method */
3393
Guido van Rossum73624e91994-10-10 17:59:00 +00003394static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003395sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003396{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003397 /* We try to choose a default backlog high enough to avoid connection drops
3398 * for common workloads, yet not too high to limit resource usage. */
3399 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003401
Charles-François Natali644b8f52014-05-22 19:45:39 +01003402 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003406 /* To avoid problems on systems that don't allow a negative backlog
3407 * (which doesn't make sense anyway) we force a minimum value of 0. */
3408 if (backlog < 0)
3409 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 res = listen(s->sock_fd, backlog);
3411 Py_END_ALLOW_THREADS
3412 if (res < 0)
3413 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003414 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003415}
3416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003417PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003418"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003419\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003420Enable a server to accept connections. If backlog is specified, it must be\n\
3421at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003422unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003423connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003424
Victor Stinner31bf2d52015-04-01 21:57:09 +02003425struct sock_recv {
3426 char *cbuf;
3427 Py_ssize_t len;
3428 int flags;
3429 Py_ssize_t result;
3430};
3431
3432static int
3433sock_recv_impl(PySocketSockObject *s, void *data)
3434{
3435 struct sock_recv *ctx = data;
3436
3437#ifdef MS_WINDOWS
3438 if (ctx->len > INT_MAX)
3439 ctx->len = INT_MAX;
3440 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3441#else
3442 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3443#endif
3444 return (ctx->result >= 0);
3445}
3446
Guido van Rossum82a5c661998-07-07 20:45:43 +00003447
Thomas Wouters477c8d52006-05-27 19:21:47 +00003448/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003449 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003450 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003451 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003452 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003453 * also possible that we return a number of bytes smaller than the request
3454 * bytes.
3455 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003456
Antoine Pitrou19467d22010-08-17 19:33:30 +00003457static Py_ssize_t
3458sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003459{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003460 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 if (!IS_SELECTABLE(s)) {
3463 select_error();
3464 return -1;
3465 }
3466 if (len == 0) {
3467 /* If 0 bytes were requested, do nothing. */
3468 return 0;
3469 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003470
Victor Stinner31bf2d52015-04-01 21:57:09 +02003471 ctx.cbuf = cbuf;
3472 ctx.len = len;
3473 ctx.flags = flags;
3474 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003476
3477 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003478}
3479
Guido van Rossum48a680c2001-03-02 06:34:14 +00003480
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003481/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003482
Guido van Rossum73624e91994-10-10 17:59:00 +00003483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003484sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003485{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003486 Py_ssize_t recvlen, outlen;
3487 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003489
Antoine Pitrou19467d22010-08-17 19:33:30 +00003490 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 if (recvlen < 0) {
3494 PyErr_SetString(PyExc_ValueError,
3495 "negative buffersize in recv");
3496 return NULL;
3497 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 /* Allocate a new string. */
3500 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3501 if (buf == NULL)
3502 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 /* Call the guts */
3505 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3506 if (outlen < 0) {
3507 /* An error occurred, release the string and return an
3508 error. */
3509 Py_DECREF(buf);
3510 return NULL;
3511 }
3512 if (outlen != recvlen) {
3513 /* We did not read as many bytes as we anticipated, resize the
3514 string if possible and be successful. */
3515 _PyBytes_Resize(&buf, outlen);
3516 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003518 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003519}
3520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003521PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003522"recv(buffersize[, flags]) -> data\n\
3523\n\
3524Receive up to buffersize bytes from the socket. For the optional flags\n\
3525argument, see the Unix manual. When no data is available, block until\n\
3526at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003527the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003528
Guido van Rossum30a685f1991-06-27 15:51:29 +00003529
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003530/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003531
Thomas Wouters477c8d52006-05-27 19:21:47 +00003532static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003533sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003536
Antoine Pitrou19467d22010-08-17 19:33:30 +00003537 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 Py_buffer pbuf;
3539 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003540 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003543 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 &pbuf, &recvlen, &flags))
3545 return NULL;
3546 buf = pbuf.buf;
3547 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 if (recvlen < 0) {
3550 PyBuffer_Release(&pbuf);
3551 PyErr_SetString(PyExc_ValueError,
3552 "negative buffersize in recv_into");
3553 return NULL;
3554 }
3555 if (recvlen == 0) {
3556 /* If nbytes was not specified, use the buffer's length */
3557 recvlen = buflen;
3558 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 /* Check if the buffer is large enough */
3561 if (buflen < recvlen) {
3562 PyBuffer_Release(&pbuf);
3563 PyErr_SetString(PyExc_ValueError,
3564 "buffer too small for requested bytes");
3565 return NULL;
3566 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 /* Call the guts */
3569 readlen = sock_recv_guts(s, buf, recvlen, flags);
3570 if (readlen < 0) {
3571 /* Return an error. */
3572 PyBuffer_Release(&pbuf);
3573 return NULL;
3574 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 PyBuffer_Release(&pbuf);
3577 /* Return the number of bytes read. Note that we do not do anything
3578 special here in the case that readlen < recvlen. */
3579 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003580}
3581
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003582PyDoc_STRVAR(recv_into_doc,
3583"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003584\n\
oldkaa0735f2018-02-02 16:52:55 +08003585A version of recv() that stores its data into a buffer rather than creating\n\
3586a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003587is not specified (or 0), receive up to the size available in the given buffer.\n\
3588\n\
3589See recv() for documentation about the flags.");
3590
Victor Stinner31bf2d52015-04-01 21:57:09 +02003591struct sock_recvfrom {
3592 char* cbuf;
3593 Py_ssize_t len;
3594 int flags;
3595 socklen_t *addrlen;
3596 sock_addr_t *addrbuf;
3597 Py_ssize_t result;
3598};
3599
3600static int
3601sock_recvfrom_impl(PySocketSockObject *s, void *data)
3602{
3603 struct sock_recvfrom *ctx = data;
3604
3605 memset(ctx->addrbuf, 0, *ctx->addrlen);
3606
3607#ifdef MS_WINDOWS
3608 if (ctx->len > INT_MAX)
3609 ctx->len = INT_MAX;
3610 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3611 SAS2SA(ctx->addrbuf), ctx->addrlen);
3612#else
3613 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3614 SAS2SA(ctx->addrbuf), ctx->addrlen);
3615#endif
3616 return (ctx->result >= 0);
3617}
3618
Thomas Wouters477c8d52006-05-27 19:21:47 +00003619
3620/*
Christian Heimes99170a52007-12-19 02:07:34 +00003621 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3622 * into a char buffer. If you have any inc/def ref to do to the objects that
3623 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003624 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003625 * that it is also possible that we return a number of bytes smaller than the
3626 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003627 *
3628 * 'addr' is a return value for the address object. Note that you must decref
3629 * it yourself.
3630 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003631static Py_ssize_t
3632sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003637 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003641 if (!getsockaddrlen(s, &addrlen))
3642 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 if (!IS_SELECTABLE(s)) {
3645 select_error();
3646 return -1;
3647 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003648
Victor Stinner31bf2d52015-04-01 21:57:09 +02003649 ctx.cbuf = cbuf;
3650 ctx.len = len;
3651 ctx.flags = flags;
3652 ctx.addrbuf = &addrbuf;
3653 ctx.addrlen = &addrlen;
3654 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003656
Victor Stinner31bf2d52015-04-01 21:57:09 +02003657 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3658 s->sock_proto);
3659 if (*addr == NULL)
3660 return -1;
3661
3662 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003663}
3664
3665/* s.recvfrom(nbytes [,flags]) method */
3666
3667static PyObject *
3668sock_recvfrom(PySocketSockObject *s, PyObject *args)
3669{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 PyObject *buf = NULL;
3671 PyObject *addr = NULL;
3672 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003673 int flags = 0;
3674 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003675
Antoine Pitrou19467d22010-08-17 19:33:30 +00003676 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 if (recvlen < 0) {
3680 PyErr_SetString(PyExc_ValueError,
3681 "negative buffersize in recvfrom");
3682 return NULL;
3683 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3686 if (buf == NULL)
3687 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3690 recvlen, flags, &addr);
3691 if (outlen < 0) {
3692 goto finally;
3693 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 if (outlen != recvlen) {
3696 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003697 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003699 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 goto finally;
3701 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003704
3705finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 Py_XDECREF(buf);
3707 Py_XDECREF(addr);
3708 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003709}
3710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003711PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003712"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3713\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003714Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003715
Thomas Wouters477c8d52006-05-27 19:21:47 +00003716
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003717/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003718
3719static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003720sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003723
Antoine Pitrou19467d22010-08-17 19:33:30 +00003724 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 Py_buffer pbuf;
3726 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003727 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003729 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003730
Antoine Pitrou19467d22010-08-17 19:33:30 +00003731 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 kwlist, &pbuf,
3733 &recvlen, &flags))
3734 return NULL;
3735 buf = pbuf.buf;
3736 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 if (recvlen < 0) {
3739 PyBuffer_Release(&pbuf);
3740 PyErr_SetString(PyExc_ValueError,
3741 "negative buffersize in recvfrom_into");
3742 return NULL;
3743 }
3744 if (recvlen == 0) {
3745 /* If nbytes was not specified, use the buffer's length */
3746 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003747 } else if (recvlen > buflen) {
3748 PyBuffer_Release(&pbuf);
3749 PyErr_SetString(PyExc_ValueError,
3750 "nbytes is greater than the length of the buffer");
3751 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3755 if (readlen < 0) {
3756 PyBuffer_Release(&pbuf);
3757 /* Return an error */
3758 Py_XDECREF(addr);
3759 return NULL;
3760 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 PyBuffer_Release(&pbuf);
3763 /* Return the number of bytes read and the address. Note that we do
3764 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003765 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003766}
3767
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003768PyDoc_STRVAR(recvfrom_into_doc,
3769"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003770\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003771Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003772
Victor Stinner35bee932015-04-02 12:28:07 +02003773/* The sendmsg() and recvmsg[_into]() methods require a working
3774 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3775#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003776struct sock_recvmsg {
3777 struct msghdr *msg;
3778 int flags;
3779 ssize_t result;
3780};
3781
3782static int
3783sock_recvmsg_impl(PySocketSockObject *s, void *data)
3784{
3785 struct sock_recvmsg *ctx = data;
3786
3787 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3788 return (ctx->result >= 0);
3789}
3790
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003791/*
3792 * Call recvmsg() with the supplied iovec structures, flags, and
3793 * ancillary data buffer size (controllen). Returns the tuple return
3794 * value for recvmsg() or recvmsg_into(), with the first item provided
3795 * by the supplied makeval() function. makeval() will be called with
3796 * the length read and makeval_data as arguments, and must return a
3797 * new reference (which will be decrefed if there is a subsequent
3798 * error). On error, closes any file descriptors received via
3799 * SCM_RIGHTS.
3800 */
3801static PyObject *
3802sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3803 int flags, Py_ssize_t controllen,
3804 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3805{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806 sock_addr_t addrbuf;
3807 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003808 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003809 PyObject *cmsg_list = NULL, *retval = NULL;
3810 void *controlbuf = NULL;
3811 struct cmsghdr *cmsgh;
3812 size_t cmsgdatalen = 0;
3813 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003814 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003815
3816 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3817 ignored" when the socket is connected (Linux fills them in
3818 anyway for AF_UNIX sockets at least). Normally msg_namelen
3819 seems to be set to 0 if there's no address, but try to
3820 initialize msg_name to something that won't be mistaken for a
3821 real address if that doesn't happen. */
3822 if (!getsockaddrlen(s, &addrbuflen))
3823 return NULL;
3824 memset(&addrbuf, 0, addrbuflen);
3825 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3826
3827 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3828 PyErr_SetString(PyExc_ValueError,
3829 "invalid ancillary data buffer length");
3830 return NULL;
3831 }
3832 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3833 return PyErr_NoMemory();
3834
3835 /* Make the system call. */
3836 if (!IS_SELECTABLE(s)) {
3837 select_error();
3838 goto finally;
3839 }
3840
Victor Stinner31bf2d52015-04-01 21:57:09 +02003841 msg.msg_name = SAS2SA(&addrbuf);
3842 msg.msg_namelen = addrbuflen;
3843 msg.msg_iov = iov;
3844 msg.msg_iovlen = iovlen;
3845 msg.msg_control = controlbuf;
3846 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003847
Victor Stinner31bf2d52015-04-01 21:57:09 +02003848 ctx.msg = &msg;
3849 ctx.flags = flags;
3850 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003851 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003852
3853 /* Make list of (level, type, data) tuples from control messages. */
3854 if ((cmsg_list = PyList_New(0)) == NULL)
3855 goto err_closefds;
3856 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3857 implementations didn't do so. */
3858 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3859 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3860 PyObject *bytes, *tuple;
3861 int tmp;
3862
3863 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3864 if (cmsg_status != 0) {
3865 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3866 "received malformed or improperly-truncated "
3867 "ancillary data", 1) == -1)
3868 goto err_closefds;
3869 }
3870 if (cmsg_status < 0)
3871 break;
3872 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003873 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003874 goto err_closefds;
3875 }
3876
3877 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3878 cmsgdatalen);
3879 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3880 (int)cmsgh->cmsg_type, bytes);
3881 if (tuple == NULL)
3882 goto err_closefds;
3883 tmp = PyList_Append(cmsg_list, tuple);
3884 Py_DECREF(tuple);
3885 if (tmp != 0)
3886 goto err_closefds;
3887
3888 if (cmsg_status != 0)
3889 break;
3890 }
3891
3892 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003893 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003894 cmsg_list,
3895 (int)msg.msg_flags,
3896 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3897 ((msg.msg_namelen > addrbuflen) ?
3898 addrbuflen : msg.msg_namelen),
3899 s->sock_proto));
3900 if (retval == NULL)
3901 goto err_closefds;
3902
3903finally:
3904 Py_XDECREF(cmsg_list);
3905 PyMem_Free(controlbuf);
3906 return retval;
3907
3908err_closefds:
3909#ifdef SCM_RIGHTS
3910 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3911 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3912 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3913 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3914 if (cmsg_status < 0)
3915 break;
3916 if (cmsgh->cmsg_level == SOL_SOCKET &&
3917 cmsgh->cmsg_type == SCM_RIGHTS) {
3918 size_t numfds;
3919 int *fdp;
3920
3921 numfds = cmsgdatalen / sizeof(int);
3922 fdp = (int *)CMSG_DATA(cmsgh);
3923 while (numfds-- > 0)
3924 close(*fdp++);
3925 }
3926 if (cmsg_status != 0)
3927 break;
3928 }
3929#endif /* SCM_RIGHTS */
3930 goto finally;
3931}
3932
3933
3934static PyObject *
3935makeval_recvmsg(ssize_t received, void *data)
3936{
3937 PyObject **buf = data;
3938
3939 if (received < PyBytes_GET_SIZE(*buf))
3940 _PyBytes_Resize(buf, received);
3941 Py_XINCREF(*buf);
3942 return *buf;
3943}
3944
3945/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3946
3947static PyObject *
3948sock_recvmsg(PySocketSockObject *s, PyObject *args)
3949{
3950 Py_ssize_t bufsize, ancbufsize = 0;
3951 int flags = 0;
3952 struct iovec iov;
3953 PyObject *buf = NULL, *retval = NULL;
3954
3955 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3956 return NULL;
3957
3958 if (bufsize < 0) {
3959 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3960 return NULL;
3961 }
3962 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3963 return NULL;
3964 iov.iov_base = PyBytes_AS_STRING(buf);
3965 iov.iov_len = bufsize;
3966
3967 /* Note that we're passing a pointer to *our pointer* to the bytes
3968 object here (&buf); makeval_recvmsg() may incref the object, or
3969 deallocate it and set our pointer to NULL. */
3970 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3971 &makeval_recvmsg, &buf);
3972 Py_XDECREF(buf);
3973 return retval;
3974}
3975
3976PyDoc_STRVAR(recvmsg_doc,
3977"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3978\n\
3979Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3980socket. The ancbufsize argument sets the size in bytes of the\n\
3981internal buffer used to receive the ancillary data; it defaults to 0,\n\
3982meaning that no ancillary data will be received. Appropriate buffer\n\
3983sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3984CMSG_LEN(), and items which do not fit into the buffer might be\n\
3985truncated or discarded. The flags argument defaults to 0 and has the\n\
3986same meaning as for recv().\n\
3987\n\
3988The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3989The data item is a bytes object holding the non-ancillary data\n\
3990received. The ancdata item is a list of zero or more tuples\n\
3991(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3992(control messages) received: cmsg_level and cmsg_type are integers\n\
3993specifying the protocol level and protocol-specific type respectively,\n\
3994and cmsg_data is a bytes object holding the associated data. The\n\
3995msg_flags item is the bitwise OR of various flags indicating\n\
3996conditions on the received message; see your system documentation for\n\
3997details. If the receiving socket is unconnected, address is the\n\
3998address of the sending socket, if available; otherwise, its value is\n\
3999unspecified.\n\
4000\n\
4001If recvmsg() raises an exception after the system call returns, it\n\
4002will first attempt to close any file descriptors received via the\n\
4003SCM_RIGHTS mechanism.");
4004
4005
4006static PyObject *
4007makeval_recvmsg_into(ssize_t received, void *data)
4008{
4009 return PyLong_FromSsize_t(received);
4010}
4011
4012/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4013
4014static PyObject *
4015sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4016{
4017 Py_ssize_t ancbufsize = 0;
4018 int flags = 0;
4019 struct iovec *iovs = NULL;
4020 Py_ssize_t i, nitems, nbufs = 0;
4021 Py_buffer *bufs = NULL;
4022 PyObject *buffers_arg, *fast, *retval = NULL;
4023
4024 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4025 &buffers_arg, &ancbufsize, &flags))
4026 return NULL;
4027
4028 if ((fast = PySequence_Fast(buffers_arg,
4029 "recvmsg_into() argument 1 must be an "
4030 "iterable")) == NULL)
4031 return NULL;
4032 nitems = PySequence_Fast_GET_SIZE(fast);
4033 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004034 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004035 goto finally;
4036 }
4037
4038 /* Fill in an iovec for each item, and save the Py_buffer
4039 structs to release afterwards. */
4040 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4041 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4042 PyErr_NoMemory();
4043 goto finally;
4044 }
4045 for (; nbufs < nitems; nbufs++) {
4046 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4047 "w*;recvmsg_into() argument 1 must be an iterable "
4048 "of single-segment read-write buffers",
4049 &bufs[nbufs]))
4050 goto finally;
4051 iovs[nbufs].iov_base = bufs[nbufs].buf;
4052 iovs[nbufs].iov_len = bufs[nbufs].len;
4053 }
4054
4055 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4056 &makeval_recvmsg_into, NULL);
4057finally:
4058 for (i = 0; i < nbufs; i++)
4059 PyBuffer_Release(&bufs[i]);
4060 PyMem_Free(bufs);
4061 PyMem_Free(iovs);
4062 Py_DECREF(fast);
4063 return retval;
4064}
4065
4066PyDoc_STRVAR(recvmsg_into_doc,
4067"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4068\n\
4069Receive normal data and ancillary data from the socket, scattering the\n\
4070non-ancillary data into a series of buffers. The buffers argument\n\
4071must be an iterable of objects that export writable buffers\n\
4072(e.g. bytearray objects); these will be filled with successive chunks\n\
4073of the non-ancillary data until it has all been written or there are\n\
4074no more buffers. The ancbufsize argument sets the size in bytes of\n\
4075the internal buffer used to receive the ancillary data; it defaults to\n\
40760, meaning that no ancillary data will be received. Appropriate\n\
4077buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4078or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4079truncated or discarded. The flags argument defaults to 0 and has the\n\
4080same meaning as for recv().\n\
4081\n\
4082The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4083The nbytes item is the total number of bytes of non-ancillary data\n\
4084written into the buffers. The ancdata item is a list of zero or more\n\
4085tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4086data (control messages) received: cmsg_level and cmsg_type are\n\
4087integers specifying the protocol level and protocol-specific type\n\
4088respectively, and cmsg_data is a bytes object holding the associated\n\
4089data. The msg_flags item is the bitwise OR of various flags\n\
4090indicating conditions on the received message; see your system\n\
4091documentation for details. If the receiving socket is unconnected,\n\
4092address is the address of the sending socket, if available; otherwise,\n\
4093its value is unspecified.\n\
4094\n\
4095If recvmsg_into() raises an exception after the system call returns,\n\
4096it will first attempt to close any file descriptors received via the\n\
4097SCM_RIGHTS mechanism.");
4098#endif /* CMSG_LEN */
4099
4100
Victor Stinner31bf2d52015-04-01 21:57:09 +02004101struct sock_send {
4102 char *buf;
4103 Py_ssize_t len;
4104 int flags;
4105 Py_ssize_t result;
4106};
4107
4108static int
4109sock_send_impl(PySocketSockObject *s, void *data)
4110{
4111 struct sock_send *ctx = data;
4112
4113#ifdef MS_WINDOWS
4114 if (ctx->len > INT_MAX)
4115 ctx->len = INT_MAX;
4116 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4117#else
4118 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4119#endif
4120 return (ctx->result >= 0);
4121}
4122
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004123/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004124
Guido van Rossum73624e91994-10-10 17:59:00 +00004125static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004126sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004127{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004128 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004130 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4133 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 if (!IS_SELECTABLE(s)) {
4136 PyBuffer_Release(&pbuf);
4137 return select_error();
4138 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004139 ctx.buf = pbuf.buf;
4140 ctx.len = pbuf.len;
4141 ctx.flags = flags;
4142 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004143 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 return NULL;
4145 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004146 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004147
4148 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004149}
4150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004151PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004152"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004153\n\
4154Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004155argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004156sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004157
4158
4159/* s.sendall(data [,flags]) method */
4160
4161static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004162sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004165 Py_ssize_t len, n;
4166 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004168 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004169 int has_timeout = (s->sock_timeout > 0);
4170 _PyTime_t interval = s->sock_timeout;
4171 _PyTime_t deadline = 0;
4172 int deadline_initialized = 0;
4173 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4176 return NULL;
4177 buf = pbuf.buf;
4178 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 if (!IS_SELECTABLE(s)) {
4181 PyBuffer_Release(&pbuf);
4182 return select_error();
4183 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004186 if (has_timeout) {
4187 if (deadline_initialized) {
4188 /* recompute the timeout */
4189 interval = deadline - _PyTime_GetMonotonicClock();
4190 }
4191 else {
4192 deadline_initialized = 1;
4193 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4194 }
4195
4196 if (interval <= 0) {
4197 PyErr_SetString(socket_timeout, "timed out");
4198 goto done;
4199 }
4200 }
4201
Victor Stinner02f32ab2015-04-01 22:53:26 +02004202 ctx.buf = buf;
4203 ctx.len = len;
4204 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004205 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4206 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004207 n = ctx.result;
4208 assert(n >= 0);
4209
4210 buf += n;
4211 len -= n;
4212
4213 /* We must run our signal handlers before looping again.
4214 send() can return a successful partial write when it is
4215 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004216 if (PyErr_CheckSignals())
4217 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004218 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004220
Victor Stinner8912d142015-04-06 23:16:34 +02004221 Py_INCREF(Py_None);
4222 res = Py_None;
4223
4224done:
4225 PyBuffer_Release(&pbuf);
4226 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004227}
4228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004229PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004230"sendall(data[, flags])\n\
4231\n\
4232Send a data string to the socket. For the optional flags\n\
4233argument, see the Unix manual. This calls send() repeatedly\n\
4234until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004235to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004236
Guido van Rossum30a685f1991-06-27 15:51:29 +00004237
Victor Stinner31bf2d52015-04-01 21:57:09 +02004238struct sock_sendto {
4239 char *buf;
4240 Py_ssize_t len;
4241 int flags;
4242 int addrlen;
4243 sock_addr_t *addrbuf;
4244 Py_ssize_t result;
4245};
4246
4247static int
4248sock_sendto_impl(PySocketSockObject *s, void *data)
4249{
4250 struct sock_sendto *ctx = data;
4251
4252#ifdef MS_WINDOWS
4253 if (ctx->len > INT_MAX)
4254 ctx->len = INT_MAX;
4255 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4256 SAS2SA(ctx->addrbuf), ctx->addrlen);
4257#else
4258 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4259 SAS2SA(ctx->addrbuf), ctx->addrlen);
4260#endif
4261 return (ctx->result >= 0);
4262}
4263
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004264/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004265
Guido van Rossum73624e91994-10-10 17:59:00 +00004266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004267sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004269 Py_buffer pbuf;
4270 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004271 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004273 int addrlen, flags;
4274 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004277 arglen = PyTuple_Size(args);
4278 switch (arglen) {
4279 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004280 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4281 return NULL;
4282 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004283 break;
4284 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004285 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4286 &pbuf, &flags, &addro)) {
4287 return NULL;
4288 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004289 break;
4290 default:
4291 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004292 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004293 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004297 if (!IS_SELECTABLE(s)) {
4298 PyBuffer_Release(&pbuf);
4299 return select_error();
4300 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004301
Victor Stinnerd565fb92019-10-10 21:30:20 +02004302 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 PyBuffer_Release(&pbuf);
4304 return NULL;
4305 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004306
Steve Dowerb82e17e2019-05-23 08:45:22 -07004307 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4308 return NULL;
4309 }
4310
Victor Stinner31bf2d52015-04-01 21:57:09 +02004311 ctx.buf = pbuf.buf;
4312 ctx.len = pbuf.len;
4313 ctx.flags = flags;
4314 ctx.addrlen = addrlen;
4315 ctx.addrbuf = &addrbuf;
4316 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004317 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004318 return NULL;
4319 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004320 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004321
4322 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004323}
4324
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004325PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004326"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004327\n\
4328Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004329For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004330
Guido van Rossum30a685f1991-06-27 15:51:29 +00004331
Victor Stinner35bee932015-04-02 12:28:07 +02004332/* The sendmsg() and recvmsg[_into]() methods require a working
4333 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4334#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004335struct sock_sendmsg {
4336 struct msghdr *msg;
4337 int flags;
4338 ssize_t result;
4339};
4340
4341static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004342sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4343 struct msghdr *msg,
4344 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4345 Py_ssize_t ndataparts, ndatabufs = 0;
4346 int result = -1;
4347 struct iovec *iovs = NULL;
4348 PyObject *data_fast = NULL;
4349 Py_buffer *databufs = NULL;
4350
4351 /* Fill in an iovec for each message part, and save the Py_buffer
4352 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004353 data_fast = PySequence_Fast(data_arg,
4354 "sendmsg() argument 1 must be an "
4355 "iterable");
4356 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004357 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004358 }
4359
Christian Heimesdffa3942016-09-05 23:54:41 +02004360 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4361 if (ndataparts > INT_MAX) {
4362 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4363 goto finally;
4364 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004365
Christian Heimesdffa3942016-09-05 23:54:41 +02004366 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004367 if (ndataparts > 0) {
4368 iovs = PyMem_New(struct iovec, ndataparts);
4369 if (iovs == NULL) {
4370 PyErr_NoMemory();
4371 goto finally;
4372 }
4373 msg->msg_iov = iovs;
4374
4375 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004376 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004377 PyErr_NoMemory();
4378 goto finally;
4379 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004380 }
4381 for (; ndatabufs < ndataparts; ndatabufs++) {
4382 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4383 "y*;sendmsg() argument 1 must be an iterable of "
4384 "bytes-like objects",
4385 &databufs[ndatabufs]))
4386 goto finally;
4387 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4388 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4389 }
4390 result = 0;
4391 finally:
4392 *databufsout = databufs;
4393 *ndatabufsout = ndatabufs;
4394 Py_XDECREF(data_fast);
4395 return result;
4396}
4397
4398static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004399sock_sendmsg_impl(PySocketSockObject *s, void *data)
4400{
4401 struct sock_sendmsg *ctx = data;
4402
4403 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4404 return (ctx->result >= 0);
4405}
4406
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004407/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4408
4409static PyObject *
4410sock_sendmsg(PySocketSockObject *s, PyObject *args)
4411{
Christian Heimesdffa3942016-09-05 23:54:41 +02004412 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004413 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004414 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004415 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004416 struct cmsginfo {
4417 int level;
4418 int type;
4419 Py_buffer data;
4420 } *cmsgs = NULL;
4421 void *controlbuf = NULL;
4422 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004423 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004424 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004426 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427
4428 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004429 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004431 }
4432
4433 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004434
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004435 /* Parse destination address. */
4436 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004437 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004438 "sendmsg"))
4439 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004441 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004442 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4443 return NULL;
4444 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004445 msg.msg_name = &addrbuf;
4446 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004447 } else {
4448 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4449 return NULL;
4450 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004451 }
4452
4453 /* Fill in an iovec for each message part, and save the Py_buffer
4454 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004455 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004456 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004457 }
4458
4459 if (cmsg_arg == NULL)
4460 ncmsgs = 0;
4461 else {
4462 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4463 "sendmsg() argument 2 must be an "
4464 "iterable")) == NULL)
4465 goto finally;
4466 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4467 }
4468
4469#ifndef CMSG_SPACE
4470 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004471 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004472 "sending multiple control messages is not supported "
4473 "on this system");
4474 goto finally;
4475 }
4476#endif
4477 /* Save level, type and Py_buffer for each control message,
4478 and calculate total size. */
4479 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4480 PyErr_NoMemory();
4481 goto finally;
4482 }
4483 controllen = controllen_last = 0;
4484 while (ncmsgbufs < ncmsgs) {
4485 size_t bufsize, space;
4486
4487 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4488 "(iiy*):[sendmsg() ancillary data items]",
4489 &cmsgs[ncmsgbufs].level,
4490 &cmsgs[ncmsgbufs].type,
4491 &cmsgs[ncmsgbufs].data))
4492 goto finally;
4493 bufsize = cmsgs[ncmsgbufs++].data.len;
4494
4495#ifdef CMSG_SPACE
4496 if (!get_CMSG_SPACE(bufsize, &space)) {
4497#else
4498 if (!get_CMSG_LEN(bufsize, &space)) {
4499#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004500 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004501 goto finally;
4502 }
4503 controllen += space;
4504 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004505 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004506 goto finally;
4507 }
4508 controllen_last = controllen;
4509 }
4510
4511 /* Construct ancillary data block from control message info. */
4512 if (ncmsgbufs > 0) {
4513 struct cmsghdr *cmsgh = NULL;
4514
Victor Stinner52d61e42016-09-12 11:41:58 +02004515 controlbuf = PyMem_Malloc(controllen);
4516 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004517 PyErr_NoMemory();
4518 goto finally;
4519 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004520 msg.msg_control = controlbuf;
4521
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004522 msg.msg_controllen = controllen;
4523
4524 /* Need to zero out the buffer as a workaround for glibc's
4525 CMSG_NXTHDR() implementation. After getting the pointer to
4526 the next header, it checks its (uninitialized) cmsg_len
4527 member to see if the "message" fits in the buffer, and
4528 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004529 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004530 memset(controlbuf, 0, controllen);
4531
4532 for (i = 0; i < ncmsgbufs; i++) {
4533 size_t msg_len, data_len = cmsgs[i].data.len;
4534 int enough_space = 0;
4535
4536 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4537 if (cmsgh == NULL) {
4538 PyErr_Format(PyExc_RuntimeError,
4539 "unexpected NULL result from %s()",
4540 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4541 goto finally;
4542 }
4543 if (!get_CMSG_LEN(data_len, &msg_len)) {
4544 PyErr_SetString(PyExc_RuntimeError,
4545 "item size out of range for CMSG_LEN()");
4546 goto finally;
4547 }
4548 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4549 size_t space;
4550
4551 cmsgh->cmsg_len = msg_len;
4552 if (get_cmsg_data_space(&msg, cmsgh, &space))
4553 enough_space = (space >= data_len);
4554 }
4555 if (!enough_space) {
4556 PyErr_SetString(PyExc_RuntimeError,
4557 "ancillary data does not fit in calculated "
4558 "space");
4559 goto finally;
4560 }
4561 cmsgh->cmsg_level = cmsgs[i].level;
4562 cmsgh->cmsg_type = cmsgs[i].type;
4563 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4564 }
4565 }
4566
4567 /* Make the system call. */
4568 if (!IS_SELECTABLE(s)) {
4569 select_error();
4570 goto finally;
4571 }
4572
Victor Stinner31bf2d52015-04-01 21:57:09 +02004573 ctx.msg = &msg;
4574 ctx.flags = flags;
4575 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004576 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004577
4578 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004579
4580finally:
4581 PyMem_Free(controlbuf);
4582 for (i = 0; i < ncmsgbufs; i++)
4583 PyBuffer_Release(&cmsgs[i].data);
4584 PyMem_Free(cmsgs);
4585 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004586 PyMem_Free(msg.msg_iov);
4587 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004588 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004589 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004590 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004591 return retval;
4592}
4593
4594PyDoc_STRVAR(sendmsg_doc,
4595"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4596\n\
4597Send normal and ancillary data to the socket, gathering the\n\
4598non-ancillary data from a series of buffers and concatenating it into\n\
4599a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004600data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004601The ancdata argument specifies the ancillary data (control messages)\n\
4602as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4603cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4604protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004605is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004606argument defaults to 0 and has the same meaning as for send(). If\n\
4607address is supplied and not None, it sets a destination address for\n\
4608the message. The return value is the number of bytes of non-ancillary\n\
4609data sent.");
4610#endif /* CMSG_LEN */
4611
Christian Heimesdffa3942016-09-05 23:54:41 +02004612#ifdef HAVE_SOCKADDR_ALG
4613static PyObject*
4614sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4615{
4616 PyObject *retval = NULL;
4617
4618 Py_ssize_t i, ndatabufs = 0;
4619 Py_buffer *databufs = NULL;
4620 PyObject *data_arg = NULL;
4621
4622 Py_buffer iv = {NULL, NULL};
4623
4624 PyObject *opobj = NULL;
4625 int op = -1;
4626
4627 PyObject *assoclenobj = NULL;
4628 int assoclen = -1;
4629
4630 unsigned int *uiptr;
4631 int flags = 0;
4632
4633 struct msghdr msg;
4634 struct cmsghdr *header = NULL;
4635 struct af_alg_iv *alg_iv = NULL;
4636 struct sock_sendmsg ctx;
4637 Py_ssize_t controllen;
4638 void *controlbuf = NULL;
4639 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4640
4641 if (self->sock_family != AF_ALG) {
4642 PyErr_SetString(PyExc_OSError,
4643 "algset is only supported for AF_ALG");
4644 return NULL;
4645 }
4646
4647 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4648 "|O$O!y*O!i:sendmsg_afalg", keywords,
4649 &data_arg,
4650 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004651 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004652 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004653 }
4654
4655 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004656
4657 /* op is a required, keyword-only argument >= 0 */
4658 if (opobj != NULL) {
4659 op = _PyLong_AsInt(opobj);
4660 }
4661 if (op < 0) {
4662 /* override exception from _PyLong_AsInt() */
4663 PyErr_SetString(PyExc_TypeError,
4664 "Invalid or missing argument 'op'");
4665 goto finally;
4666 }
4667 /* assoclen is optional but must be >= 0 */
4668 if (assoclenobj != NULL) {
4669 assoclen = _PyLong_AsInt(assoclenobj);
4670 if (assoclen == -1 && PyErr_Occurred()) {
4671 goto finally;
4672 }
4673 if (assoclen < 0) {
4674 PyErr_SetString(PyExc_TypeError,
4675 "assoclen must be positive");
4676 goto finally;
4677 }
4678 }
4679
4680 controllen = CMSG_SPACE(4);
4681 if (iv.buf != NULL) {
4682 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4683 }
4684 if (assoclen >= 0) {
4685 controllen += CMSG_SPACE(4);
4686 }
4687
4688 controlbuf = PyMem_Malloc(controllen);
4689 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004690 PyErr_NoMemory();
4691 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004692 }
4693 memset(controlbuf, 0, controllen);
4694
Christian Heimesdffa3942016-09-05 23:54:41 +02004695 msg.msg_controllen = controllen;
4696 msg.msg_control = controlbuf;
4697
4698 /* Fill in an iovec for each message part, and save the Py_buffer
4699 structs to release afterwards. */
4700 if (data_arg != NULL) {
4701 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4702 goto finally;
4703 }
4704 }
4705
4706 /* set operation to encrypt or decrypt */
4707 header = CMSG_FIRSTHDR(&msg);
4708 if (header == NULL) {
4709 PyErr_SetString(PyExc_RuntimeError,
4710 "unexpected NULL result from CMSG_FIRSTHDR");
4711 goto finally;
4712 }
4713 header->cmsg_level = SOL_ALG;
4714 header->cmsg_type = ALG_SET_OP;
4715 header->cmsg_len = CMSG_LEN(4);
4716 uiptr = (void*)CMSG_DATA(header);
4717 *uiptr = (unsigned int)op;
4718
4719 /* set initialization vector */
4720 if (iv.buf != NULL) {
4721 header = CMSG_NXTHDR(&msg, header);
4722 if (header == NULL) {
4723 PyErr_SetString(PyExc_RuntimeError,
4724 "unexpected NULL result from CMSG_NXTHDR(iv)");
4725 goto finally;
4726 }
4727 header->cmsg_level = SOL_ALG;
4728 header->cmsg_type = ALG_SET_IV;
4729 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4730 alg_iv = (void*)CMSG_DATA(header);
4731 alg_iv->ivlen = iv.len;
4732 memcpy(alg_iv->iv, iv.buf, iv.len);
4733 }
4734
4735 /* set length of associated data for AEAD */
4736 if (assoclen >= 0) {
4737 header = CMSG_NXTHDR(&msg, header);
4738 if (header == NULL) {
4739 PyErr_SetString(PyExc_RuntimeError,
4740 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4741 goto finally;
4742 }
4743 header->cmsg_level = SOL_ALG;
4744 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4745 header->cmsg_len = CMSG_LEN(4);
4746 uiptr = (void*)CMSG_DATA(header);
4747 *uiptr = (unsigned int)assoclen;
4748 }
4749
4750 ctx.msg = &msg;
4751 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004752 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004753 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004754 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004755
4756 retval = PyLong_FromSsize_t(ctx.result);
4757
4758 finally:
4759 PyMem_Free(controlbuf);
4760 if (iv.buf != NULL) {
4761 PyBuffer_Release(&iv);
4762 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004763 PyMem_Free(msg.msg_iov);
4764 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004765 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004766 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004767 PyMem_Free(databufs);
4768 return retval;
4769}
4770
4771PyDoc_STRVAR(sendmsg_afalg_doc,
4772"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4773\n\
4774Set operation mode, IV and length of associated data for an AF_ALG\n\
4775operation socket.");
4776#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004777
Guido van Rossum30a685f1991-06-27 15:51:29 +00004778/* s.shutdown(how) method */
4779
Guido van Rossum73624e91994-10-10 17:59:00 +00004780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004781sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004782{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 int how;
4784 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004785
Serhiy Storchaka78980432013-01-15 01:12:17 +02004786 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 if (how == -1 && PyErr_Occurred())
4788 return NULL;
4789 Py_BEGIN_ALLOW_THREADS
4790 res = shutdown(s->sock_fd, how);
4791 Py_END_ALLOW_THREADS
4792 if (res < 0)
4793 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004794 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004795}
4796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004797PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004798"shutdown(flag)\n\
4799\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004800Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4801of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004802
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004803#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004804static PyObject*
4805sock_ioctl(PySocketSockObject *s, PyObject *arg)
4806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 unsigned long cmd = SIO_RCVALL;
4808 PyObject *argO;
4809 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4812 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 switch (cmd) {
4815 case SIO_RCVALL: {
4816 unsigned int option = RCVALL_ON;
4817 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4818 return NULL;
4819 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4820 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4821 return set_error();
4822 }
4823 return PyLong_FromUnsignedLong(recv); }
4824 case SIO_KEEPALIVE_VALS: {
4825 struct tcp_keepalive ka;
4826 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4827 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4828 return NULL;
4829 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4830 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4831 return set_error();
4832 }
4833 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004834#if defined(SIO_LOOPBACK_FAST_PATH)
4835 case SIO_LOOPBACK_FAST_PATH: {
4836 unsigned int option;
4837 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4838 return NULL;
4839 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4840 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4841 return set_error();
4842 }
4843 return PyLong_FromUnsignedLong(recv); }
4844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004846 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 return NULL;
4848 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004849}
4850PyDoc_STRVAR(sock_ioctl_doc,
4851"ioctl(cmd, option) -> long\n\
4852\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004853Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4854SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004855SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4856SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004857#endif
4858
4859#if defined(MS_WINDOWS)
4860static PyObject*
4861sock_share(PySocketSockObject *s, PyObject *arg)
4862{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004863 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004864 DWORD processId;
4865 int result;
4866
4867 if (!PyArg_ParseTuple(arg, "I", &processId))
4868 return NULL;
4869
4870 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004871 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004872 Py_END_ALLOW_THREADS
4873 if (result == SOCKET_ERROR)
4874 return set_error();
4875 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4876}
4877PyDoc_STRVAR(sock_share_doc,
4878"share(process_id) -> bytes\n\
4879\n\
4880Share the socket with another process. The target process id\n\
4881must be provided and the resulting bytes object passed to the target\n\
4882process. There the shared socket can be instantiated by calling\n\
4883socket.fromshare().");
4884
Christian Heimesfaf2f632008-01-06 16:59:19 +00004885
4886#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004887
4888/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004889
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004890static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4892 accept_doc},
4893 {"bind", (PyCFunction)sock_bind, METH_O,
4894 bind_doc},
4895 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004896 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 {"connect", (PyCFunction)sock_connect, METH_O,
4898 connect_doc},
4899 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4900 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004901 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4902 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4904 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004905#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 {"getpeername", (PyCFunction)sock_getpeername,
4907 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 {"getsockname", (PyCFunction)sock_getsockname,
4910 METH_NOARGS, getsockname_doc},
4911 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4912 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004913#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4915 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004916#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004917#if defined(MS_WINDOWS)
4918 {"share", (PyCFunction)sock_share, METH_VARARGS,
4919 sock_share_doc},
4920#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004921 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 listen_doc},
4923 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4924 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004925 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 recv_into_doc},
4927 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4928 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004929 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 recvfrom_into_doc},
4931 {"send", (PyCFunction)sock_send, METH_VARARGS,
4932 send_doc},
4933 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4934 sendall_doc},
4935 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4936 sendto_doc},
4937 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4938 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004939 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4940 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4942 settimeout_doc},
4943 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4944 gettimeout_doc},
4945 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4946 setsockopt_doc},
4947 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4948 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004949#ifdef CMSG_LEN
4950 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4951 recvmsg_doc},
4952 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4953 recvmsg_into_doc,},
4954 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4955 sendmsg_doc},
4956#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004957#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004958 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004959 sendmsg_afalg_doc},
4960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004962};
4963
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004964/* SockObject members */
4965static PyMemberDef sock_memberlist[] = {
4966 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4967 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4968 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004969 {0},
4970};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004971
Victor Stinner71694d52015-03-28 01:18:54 +01004972static PyGetSetDef sock_getsetlist[] = {
4973 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4974 {NULL} /* sentinel */
4975};
4976
Guido van Rossum73624e91994-10-10 17:59:00 +00004977/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004978 First close the file description. */
4979
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004980static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004981sock_finalize(PySocketSockObject *s)
4982{
4983 SOCKET_T fd;
4984 PyObject *error_type, *error_value, *error_traceback;
4985
4986 /* Save the current exception, if any. */
4987 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4988
Victor Stinnerd3afb622016-07-22 17:47:09 +02004989 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004990 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4991 /* Spurious errors can appear at shutdown */
4992 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4993 PyErr_WriteUnraisable((PyObject *)s);
4994 }
4995 }
4996
4997 /* Only close the socket *after* logging the ResourceWarning warning
4998 to allow the logger to call socket methods like
4999 socket.getsockname(). If the socket is closed before, socket
5000 methods fails with the EBADF error. */
5001 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005002 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005003
5004 /* We do not want to retry upon EINTR: see sock_close() */
5005 Py_BEGIN_ALLOW_THREADS
5006 (void) SOCKETCLOSE(fd);
5007 Py_END_ALLOW_THREADS
5008 }
5009
5010 /* Restore the saved exception. */
5011 PyErr_Restore(error_type, error_value, error_traceback);
5012}
5013
5014static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005015sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005016{
Victor Stinner19a8e842016-03-21 16:36:48 +01005017 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5018 return;
5019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005021}
5022
Guido van Rossum30a685f1991-06-27 15:51:29 +00005023
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005024static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005025sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005026{
Victor Stinnere254e532014-07-26 14:36:55 +02005027 long sock_fd;
5028 /* On Windows, this test is needed because SOCKET_T is unsigned */
5029 if (s->sock_fd == INVALID_SOCKET) {
5030 sock_fd = -1;
5031 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005032#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005033 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 /* this can occur on Win64, and actually there is a special
5035 ugly printf formatter for decimal pointer length integer
5036 printing, only bother if necessary*/
5037 PyErr_SetString(PyExc_OverflowError,
5038 "no printf formatter to display "
5039 "the socket descriptor in decimal");
5040 return NULL;
5041 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005042#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005043 else
5044 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 return PyUnicode_FromFormat(
5046 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005047 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 s->sock_type,
5049 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005050}
5051
5052
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005053/* Create a new, uninitialized socket object. */
5054
5055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005056sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 new = type->tp_alloc(type, 0);
5061 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005062 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005063 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 ((PySocketSockObject *)new)->errorhandler = &set_error;
5065 }
5066 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005067}
5068
5069
5070/* Initialize a new socket object. */
5071
Victor Stinnerdaf45552013-08-28 00:53:59 +02005072#ifdef SOCK_CLOEXEC
5073/* socket() and socketpair() fail with EINVAL on Linux kernel older
5074 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5075static int sock_cloexec_works = -1;
5076#endif
5077
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005078/*ARGSUSED*/
5079static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005080sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 PySocketSockObject *s = (PySocketSockObject *)self;
5083 PyObject *fdobj = NULL;
5084 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005085 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005087#ifndef MS_WINDOWS
5088#ifdef SOCK_CLOEXEC
5089 int *atomic_flag_works = &sock_cloexec_works;
5090#else
5091 int *atomic_flag_works = NULL;
5092#endif
5093#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5096 "|iiiO:socket", keywords,
5097 &family, &type, &proto, &fdobj))
5098 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005099
Steve Dowerb82e17e2019-05-23 08:45:22 -07005100#ifdef MS_WINDOWS
5101 /* In this case, we don't use the family, type and proto args */
5102 if (fdobj != NULL && fdobj != Py_None)
5103#endif
5104 {
5105 if (PySys_Audit("socket.__new__", "Oiii",
5106 s, family, type, proto) < 0) {
5107 return -1;
5108 }
5109 }
5110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005112#ifdef MS_WINDOWS
5113 /* recreate a socket that was duplicated */
5114 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005115 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005116 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5117 PyErr_Format(PyExc_ValueError,
5118 "socket descriptor string has wrong size, "
5119 "should be %zu bytes.", sizeof(info));
5120 return -1;
5121 }
5122 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005123
5124 if (PySys_Audit("socket()", "iii", info.iAddressFamily,
5125 info.iSocketType, info.iProtocol) < 0) {
5126 return -1;
5127 }
5128
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005129 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005130 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005131 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5132 Py_END_ALLOW_THREADS
5133 if (fd == INVALID_SOCKET) {
5134 set_error();
5135 return -1;
5136 }
5137 family = info.iAddressFamily;
5138 type = info.iSocketType;
5139 proto = info.iProtocol;
5140 }
5141 else
5142#endif
5143 {
Dima Tisneke9912702018-12-17 22:07:55 +09005144
5145 if (PyFloat_Check(fdobj)) {
5146 PyErr_SetString(PyExc_TypeError,
5147 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005148 return -1;
5149 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005150
Dima Tisneke9912702018-12-17 22:07:55 +09005151 fd = PyLong_AsSocket_t(fdobj);
5152 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5153 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005154#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005155 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005156#else
Dima Tisneke9912702018-12-17 22:07:55 +09005157 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005158#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005159 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5160 return -1;
5161 }
5162
5163 /* validate that passed file descriptor is valid and a socket. */
5164 sock_addr_t addrbuf;
5165 socklen_t addrlen = sizeof(sock_addr_t);
5166
5167 memset(&addrbuf, 0, addrlen);
5168 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5169 if (family == -1) {
5170 family = SAS2SA(&addrbuf)->sa_family;
5171 }
5172 } else {
5173#ifdef MS_WINDOWS
5174 /* getsockname() on an unbound socket is an error on Windows.
5175 Invalid descriptor and not a socket is same error code.
5176 Error out if family must be resolved, or bad descriptor. */
5177 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5178#else
5179 /* getsockname() is not supported for SOL_ALG on Linux. */
5180 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5181#endif
5182 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005183 return -1;
5184 }
5185 }
5186#ifdef SO_TYPE
5187 if (type == -1) {
5188 int tmp;
5189 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005190 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5191 (void *)&tmp, &slen) == 0)
5192 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005193 type = tmp;
5194 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005195 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005196 return -1;
5197 }
5198 }
5199#else
5200 type = SOCK_STREAM;
5201#endif
5202#ifdef SO_PROTOCOL
5203 if (proto == -1) {
5204 int tmp;
5205 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005206 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5207 (void *)&tmp, &slen) == 0)
5208 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005209 proto = tmp;
5210 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005211 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005212 return -1;
5213 }
5214 }
5215#else
5216 proto = 0;
5217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 }
5219 }
5220 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005221 /* No fd, default to AF_INET and SOCK_STREAM */
5222 if (family == -1) {
5223 family = AF_INET;
5224 }
5225 if (type == -1) {
5226 type = SOCK_STREAM;
5227 }
5228 if (proto == -1) {
5229 proto = 0;
5230 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005231#ifdef MS_WINDOWS
5232 /* Windows implementation */
5233#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5234#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5235#endif
5236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005238 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005239 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005240 NULL, 0,
5241 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5242 if (fd == INVALID_SOCKET) {
5243 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5244 support_wsa_no_inherit = 0;
5245 fd = socket(family, type, proto);
5246 }
5247 }
5248 else {
5249 fd = socket(family, type, proto);
5250 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 if (fd == INVALID_SOCKET) {
5254 set_error();
5255 return -1;
5256 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005257
5258 if (!support_wsa_no_inherit) {
5259 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5260 closesocket(fd);
5261 PyErr_SetFromWindowsErr(0);
5262 return -1;
5263 }
5264 }
5265#else
5266 /* UNIX */
5267 Py_BEGIN_ALLOW_THREADS
5268#ifdef SOCK_CLOEXEC
5269 if (sock_cloexec_works != 0) {
5270 fd = socket(family, type | SOCK_CLOEXEC, proto);
5271 if (sock_cloexec_works == -1) {
5272 if (fd >= 0) {
5273 sock_cloexec_works = 1;
5274 }
5275 else if (errno == EINVAL) {
5276 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5277 sock_cloexec_works = 0;
5278 fd = socket(family, type, proto);
5279 }
5280 }
5281 }
5282 else
5283#endif
5284 {
5285 fd = socket(family, type, proto);
5286 }
5287 Py_END_ALLOW_THREADS
5288
5289 if (fd == INVALID_SOCKET) {
5290 set_error();
5291 return -1;
5292 }
5293
5294 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5295 SOCKETCLOSE(fd);
5296 return -1;
5297 }
5298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005300 if (init_sockobject(s, fd, family, type, proto) == -1) {
5301 SOCKETCLOSE(fd);
5302 return -1;
5303 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005306
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005307}
5308
5309
Guido van Rossumb6775db1994-08-01 11:34:53 +00005310/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005311
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005312static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5314 "_socket.socket", /* tp_name */
5315 sizeof(PySocketSockObject), /* tp_basicsize */
5316 0, /* tp_itemsize */
5317 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005318 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 0, /* tp_getattr */
5320 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005321 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 (reprfunc)sock_repr, /* tp_repr */
5323 0, /* tp_as_number */
5324 0, /* tp_as_sequence */
5325 0, /* tp_as_mapping */
5326 0, /* tp_hash */
5327 0, /* tp_call */
5328 0, /* tp_str */
5329 PyObject_GenericGetAttr, /* tp_getattro */
5330 0, /* tp_setattro */
5331 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005332 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 sock_doc, /* tp_doc */
5334 0, /* tp_traverse */
5335 0, /* tp_clear */
5336 0, /* tp_richcompare */
5337 0, /* tp_weaklistoffset */
5338 0, /* tp_iter */
5339 0, /* tp_iternext */
5340 sock_methods, /* tp_methods */
5341 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005342 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 0, /* tp_base */
5344 0, /* tp_dict */
5345 0, /* tp_descr_get */
5346 0, /* tp_descr_set */
5347 0, /* tp_dictoffset */
5348 sock_initobj, /* tp_init */
5349 PyType_GenericAlloc, /* tp_alloc */
5350 sock_new, /* tp_new */
5351 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005352 0, /* tp_is_gc */
5353 0, /* tp_bases */
5354 0, /* tp_mro */
5355 0, /* tp_cache */
5356 0, /* tp_subclasses */
5357 0, /* tp_weaklist */
5358 0, /* tp_del */
5359 0, /* tp_version_tag */
5360 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005361};
5362
Guido van Rossum30a685f1991-06-27 15:51:29 +00005363
Guido van Rossum81194471991-07-27 21:42:02 +00005364/* Python interface to gethostname(). */
5365
5366/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005367static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005368socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005369{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005370 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5371 return NULL;
5372 }
5373
Martin v. Löwis72f48422010-10-29 18:20:08 +00005374#ifdef MS_WINDOWS
5375 /* Don't use winsock's gethostname, as this returns the ANSI
5376 version of the hostname, whereas we need a Unicode string.
5377 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005378 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005379 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005380 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005381 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005382
5383 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005384 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005385
5386 if (GetLastError() != ERROR_MORE_DATA)
5387 return PyErr_SetFromWindowsErr(0);
5388
5389 if (size == 0)
5390 return PyUnicode_New(0, 0);
5391
5392 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5393 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005394 name = PyMem_New(wchar_t, size);
5395 if (!name) {
5396 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005397 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005398 }
Victor Stinner74168972011-11-17 01:11:36 +01005399 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5400 name,
5401 &size))
5402 {
5403 PyMem_Free(name);
5404 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005405 }
Victor Stinner74168972011-11-17 01:11:36 +01005406
5407 result = PyUnicode_FromWideChar(name, size);
5408 PyMem_Free(name);
5409 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005410#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 char buf[1024];
5412 int res;
5413 Py_BEGIN_ALLOW_THREADS
5414 res = gethostname(buf, (int) sizeof buf - 1);
5415 Py_END_ALLOW_THREADS
5416 if (res < 0)
5417 return set_error();
5418 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005419 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005420#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005421}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005423PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005424"gethostname() -> string\n\
5425\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005426Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005427
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005428#ifdef HAVE_SETHOSTNAME
5429PyDoc_STRVAR(sethostname_doc,
5430"sethostname(name)\n\n\
5431Sets the hostname to name.");
5432
5433static PyObject *
5434socket_sethostname(PyObject *self, PyObject *args)
5435{
5436 PyObject *hnobj;
5437 Py_buffer buf;
5438 int res, flag = 0;
5439
Christian Heimesd2774c72013-06-19 02:06:29 +02005440#ifdef _AIX
5441/* issue #18259, not declared in any useful header file */
5442extern int sethostname(const char *, size_t);
5443#endif
5444
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005445 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5446 PyErr_Clear();
5447 if (!PyArg_ParseTuple(args, "O&:sethostname",
5448 PyUnicode_FSConverter, &hnobj))
5449 return NULL;
5450 flag = 1;
5451 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005452
5453 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5454 return NULL;
5455 }
5456
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005457 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5458 if (!res) {
5459 res = sethostname(buf.buf, buf.len);
5460 PyBuffer_Release(&buf);
5461 }
5462 if (flag)
5463 Py_DECREF(hnobj);
5464 if (res)
5465 return set_error();
5466 Py_RETURN_NONE;
5467}
5468#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005469
Guido van Rossum30a685f1991-06-27 15:51:29 +00005470/* Python interface to gethostbyname(name). */
5471
5472/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005473static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005474socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005477 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005478 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005479
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005480 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005482 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5483 goto finally;
5484 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005485 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005486 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005487 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005488finally:
5489 PyMem_Free(name);
5490 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005491}
5492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005493PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005494"gethostbyname(host) -> address\n\
5495\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005496Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005497
5498
Victor Stinner72400302016-01-28 15:41:01 +01005499static PyObject*
5500sock_decode_hostname(const char *name)
5501{
5502#ifdef MS_WINDOWS
5503 /* Issue #26227: gethostbyaddr() returns a string encoded
5504 * to the ANSI code page */
5505 return PyUnicode_DecodeFSDefault(name);
5506#else
5507 /* Decode from UTF-8 */
5508 return PyUnicode_FromString(name);
5509#endif
5510}
5511
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005512/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5513
5514static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005515gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 char **pch;
5518 PyObject *rtn_tuple = (PyObject *)NULL;
5519 PyObject *name_list = (PyObject *)NULL;
5520 PyObject *addr_list = (PyObject *)NULL;
5521 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005522 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 if (h == NULL) {
5525 /* Let's get real error message to return */
5526 set_herror(h_errno);
5527 return NULL;
5528 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 if (h->h_addrtype != af) {
5531 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005532 errno = EAFNOSUPPORT;
5533 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 return NULL;
5535 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 case AF_INET:
5540 if (alen < sizeof(struct sockaddr_in))
5541 return NULL;
5542 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005543
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005544#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 case AF_INET6:
5546 if (alen < sizeof(struct sockaddr_in6))
5547 return NULL;
5548 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005549#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 if ((name_list = PyList_New(0)) == NULL)
5554 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 if ((addr_list = PyList_New(0)) == NULL)
5557 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 /* SF #1511317: h_aliases can be NULL */
5560 if (h->h_aliases) {
5561 for (pch = h->h_aliases; *pch != NULL; pch++) {
5562 int status;
5563 tmp = PyUnicode_FromString(*pch);
5564 if (tmp == NULL)
5565 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 status = PyList_Append(name_list, tmp);
5568 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 if (status)
5571 goto err;
5572 }
5573 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5576 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 case AF_INET:
5581 {
5582 struct sockaddr_in sin;
5583 memset(&sin, 0, sizeof(sin));
5584 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005585#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005589 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 if (pch == h->h_addr_list && alen >= sizeof(sin))
5592 memcpy((char *) addr, &sin, sizeof(sin));
5593 break;
5594 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005595
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005596#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 case AF_INET6:
5598 {
5599 struct sockaddr_in6 sin6;
5600 memset(&sin6, 0, sizeof(sin6));
5601 sin6.sin6_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 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005606 tmp = make_ipv6_addr(&sin6);
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(sin6))
5609 memcpy((char *) addr, &sin6, sizeof(sin6));
5610 break;
5611 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005612#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005615 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 "unsupported address family");
5617 return NULL;
5618 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 if (tmp == NULL)
5621 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 status = PyList_Append(addr_list, tmp);
5624 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 if (status)
5627 goto err;
5628 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005629
Victor Stinner72400302016-01-28 15:41:01 +01005630 name = sock_decode_hostname(h->h_name);
5631 if (name == NULL)
5632 goto err;
5633 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005634
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005635 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 Py_XDECREF(name_list);
5637 Py_XDECREF(addr_list);
5638 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005639}
5640
5641
5642/* Python interface to gethostbyname_ex(name). */
5643
5644/*ARGSUSED*/
5645static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005646socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 char *name;
5649 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005650 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005652 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005653#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005655#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005657#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 char buf[16384];
5659 int buf_len = (sizeof buf) - 1;
5660 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005661#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005662#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005664#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005665#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005666
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005667 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005669 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5670 goto finally;
5671 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005672 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005673 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005675#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005676#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005677 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005679#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005681#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 memset((void *) &data, '\0', sizeof(data));
5683 result = gethostbyname_r(name, &hp_allocated, &data);
5684 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005685#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005686#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005687#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005689#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005690 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005692#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 Py_END_ALLOW_THREADS
5694 /* Some C libraries would require addr.__ss_family instead of
5695 addr.ss_family.
5696 Therefore, we cast the sockaddr_storage into sockaddr to
5697 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005698 sa = SAS2SA(&addr);
5699 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005701#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005703#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005704finally:
5705 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005707}
5708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005709PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005710"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5711\n\
5712Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005713for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005714
5715
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005716/* Python interface to gethostbyaddr(IP). */
5717
5718/*ARGSUSED*/
5719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005720socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005721{
Charles-François Natali8b759652011-12-23 16:44:51 +01005722 sock_addr_t addr;
5723 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 char *ip_num;
5725 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005726 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005727#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005729#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005731#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 /* glibcs up to 2.10 assume that the buf argument to
5733 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5734 does not ensure. The attribute below instructs the compiler
5735 to maintain this alignment. */
5736 char buf[16384] Py_ALIGNED(8);
5737 int buf_len = (sizeof buf) - 1;
5738 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005739#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005740#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005742#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005743#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005744 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 int al;
5746 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005747
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005748 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005750 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5751 goto finally;
5752 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 af = AF_UNSPEC;
5754 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005755 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 af = sa->sa_family;
5757 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005758 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 switch (af) {
5760 case AF_INET:
5761 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5762 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5763 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005764#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 case AF_INET6:
5766 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5767 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5768 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005771 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005772 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 }
5774 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005775#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005776#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005777 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 &hp_allocated, buf, buf_len,
5779 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005780#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 h = gethostbyaddr_r(ap, al, af,
5782 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005783#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 memset((void *) &data, '\0', sizeof(data));
5785 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5786 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005787#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005788#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005789#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005791#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005792 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005794#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005796 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005797#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005799#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005800finally:
5801 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005803}
5804
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005805PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005806"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5807\n\
5808Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005809for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005810
Guido van Rossum30a685f1991-06-27 15:51:29 +00005811
5812/* Python interface to getservbyname(name).
5813 This only returns the port number, since the other info is already
5814 known or not useful (like the list of aliases). */
5815
5816/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005817static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005818socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005819{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005820 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 struct servent *sp;
5822 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5823 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005824
5825 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5826 return NULL;
5827 }
5828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 Py_BEGIN_ALLOW_THREADS
5830 sp = getservbyname(name, proto);
5831 Py_END_ALLOW_THREADS
5832 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005833 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 }
5836 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005837}
5838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005839PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005840"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005841\n\
5842Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005843The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5844otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005845
Guido van Rossum30a685f1991-06-27 15:51:29 +00005846
Barry Warsaw11b91a02004-06-28 00:50:43 +00005847/* Python interface to getservbyport(port).
5848 This only returns the service name, since the other info is already
5849 known or not useful (like the list of aliases). */
5850
5851/*ARGSUSED*/
5852static PyObject *
5853socket_getservbyport(PyObject *self, PyObject *args)
5854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005856 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 struct servent *sp;
5858 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5859 return NULL;
5860 if (port < 0 || port > 0xffff) {
5861 PyErr_SetString(
5862 PyExc_OverflowError,
5863 "getservbyport: port must be 0-65535.");
5864 return NULL;
5865 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005866
5867 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5868 return NULL;
5869 }
5870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 Py_BEGIN_ALLOW_THREADS
5872 sp = getservbyport(htons((short)port), proto);
5873 Py_END_ALLOW_THREADS
5874 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 return NULL;
5877 }
5878 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005879}
5880
5881PyDoc_STRVAR(getservbyport_doc,
5882"getservbyport(port[, protocolname]) -> string\n\
5883\n\
5884Return the service name from a port number and protocol name.\n\
5885The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5886otherwise any protocol will match.");
5887
Guido van Rossum3901d851996-12-19 16:35:04 +00005888/* Python interface to getprotobyname(name).
5889 This only returns the protocol number, since the other info is
5890 already known or not useful (like the list of aliases). */
5891
5892/*ARGSUSED*/
5893static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005894socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005895{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005896 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 struct protoent *sp;
5898 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5899 return NULL;
5900 Py_BEGIN_ALLOW_THREADS
5901 sp = getprotobyname(name);
5902 Py_END_ALLOW_THREADS
5903 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005904 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 return NULL;
5906 }
5907 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005908}
5909
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005910PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005911"getprotobyname(name) -> integer\n\
5912\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005913Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005914
Christian Heimesd0e31b92018-01-27 09:54:13 +01005915static PyObject *
5916socket_close(PyObject *self, PyObject *fdobj)
5917{
5918 SOCKET_T fd;
5919 int res;
5920
5921 fd = PyLong_AsSocket_t(fdobj);
5922 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5923 return NULL;
5924 Py_BEGIN_ALLOW_THREADS
5925 res = SOCKETCLOSE(fd);
5926 Py_END_ALLOW_THREADS
5927 /* bpo-30319: The peer can already have closed the connection.
5928 Python ignores ECONNRESET on close(). */
5929 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5930 return set_error();
5931 }
5932 Py_RETURN_NONE;
5933}
5934
5935PyDoc_STRVAR(close_doc,
5936"close(integer) -> None\n\
5937\n\
5938Close an integer socket file descriptor. This is like os.close(), but for\n\
5939sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005940
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005941#ifndef NO_DUP
5942/* dup() function for socket fds */
5943
5944static PyObject *
5945socket_dup(PyObject *self, PyObject *fdobj)
5946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 SOCKET_T fd, newfd;
5948 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005949#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005950 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005951#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 fd = PyLong_AsSocket_t(fdobj);
5954 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5955 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005956
Victor Stinnerdaf45552013-08-28 00:53:59 +02005957#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005958 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005959 return set_error();
5960
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005961 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005962 FROM_PROTOCOL_INFO,
5963 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 if (newfd == INVALID_SOCKET)
5965 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005966
Victor Stinnerdaf45552013-08-28 00:53:59 +02005967 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5968 closesocket(newfd);
5969 PyErr_SetFromWindowsErr(0);
5970 return NULL;
5971 }
5972#else
5973 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5974 newfd = _Py_dup(fd);
5975 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005976 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005977#endif
5978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979 newfdobj = PyLong_FromSocket_t(newfd);
5980 if (newfdobj == NULL)
5981 SOCKETCLOSE(newfd);
5982 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005983}
5984
5985PyDoc_STRVAR(dup_doc,
5986"dup(integer) -> integer\n\
5987\n\
5988Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5989sockets; on some platforms os.dup() won't work for socket file descriptors.");
5990#endif
5991
5992
Dave Cole331708b2004-08-09 04:51:41 +00005993#ifdef HAVE_SOCKETPAIR
5994/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005995 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005996 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005997
5998/*ARGSUSED*/
5999static PyObject *
6000socket_socketpair(PyObject *self, PyObject *args)
6001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 PySocketSockObject *s0 = NULL, *s1 = NULL;
6003 SOCKET_T sv[2];
6004 int family, type = SOCK_STREAM, proto = 0;
6005 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006006#ifdef SOCK_CLOEXEC
6007 int *atomic_flag_works = &sock_cloexec_works;
6008#else
6009 int *atomic_flag_works = NULL;
6010#endif
6011 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006012
6013#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006015#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6019 &family, &type, &proto))
6020 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006023 Py_BEGIN_ALLOW_THREADS
6024#ifdef SOCK_CLOEXEC
6025 if (sock_cloexec_works != 0) {
6026 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6027 if (sock_cloexec_works == -1) {
6028 if (ret >= 0) {
6029 sock_cloexec_works = 1;
6030 }
6031 else if (errno == EINVAL) {
6032 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6033 sock_cloexec_works = 0;
6034 ret = socketpair(family, type, proto, sv);
6035 }
6036 }
6037 }
6038 else
6039#endif
6040 {
6041 ret = socketpair(family, type, proto, sv);
6042 }
6043 Py_END_ALLOW_THREADS
6044
6045 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006047
6048 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6049 goto finally;
6050 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6051 goto finally;
6052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 s0 = new_sockobject(sv[0], family, type, proto);
6054 if (s0 == NULL)
6055 goto finally;
6056 s1 = new_sockobject(sv[1], family, type, proto);
6057 if (s1 == NULL)
6058 goto finally;
6059 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006060
6061finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 if (res == NULL) {
6063 if (s0 == NULL)
6064 SOCKETCLOSE(sv[0]);
6065 if (s1 == NULL)
6066 SOCKETCLOSE(sv[1]);
6067 }
6068 Py_XDECREF(s0);
6069 Py_XDECREF(s1);
6070 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006071}
6072
6073PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006074"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006075\n\
6076Create a pair of socket objects from the sockets returned by the platform\n\
6077socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006078The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006079AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006080
6081#endif /* HAVE_SOCKETPAIR */
6082
6083
Guido van Rossum006bf911996-06-12 04:04:55 +00006084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006085socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006086{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006087 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006088
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006089 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 return NULL;
6091 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006092 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006094 "ntohs: can't convert negative Python int to C "
6095 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 return NULL;
6097 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006098 if (x > 0xffff) {
6099 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6100 "ntohs: Python int too large to convert to C "
6101 "16-bit unsigned integer (The silent truncation "
6102 "is deprecated)",
6103 1)) {
6104 return NULL;
6105 }
6106 }
6107 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006108}
6109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006110PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006111"ntohs(integer) -> integer\n\
6112\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006113Convert a 16-bit unsigned integer from network to host byte order.\n\
6114Note that in case the received integer does not fit in 16-bit unsigned\n\
6115integer, but does fit in a positive C int, it is silently truncated to\n\
611616-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006117However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006118exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006119
6120
Guido van Rossum006bf911996-06-12 04:04:55 +00006121static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006122socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126 if (PyLong_Check(arg)) {
6127 x = PyLong_AsUnsignedLong(arg);
6128 if (x == (unsigned long) -1 && PyErr_Occurred())
6129 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006130#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 {
6132 unsigned long y;
6133 /* only want the trailing 32 bits */
6134 y = x & 0xFFFFFFFFUL;
6135 if (y ^ x)
6136 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006137 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 x = y;
6139 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 }
6142 else
6143 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006144 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006147}
6148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006149PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006150"ntohl(integer) -> integer\n\
6151\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006152Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006153
6154
Guido van Rossum006bf911996-06-12 04:04:55 +00006155static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006156socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006157{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006158 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006159
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006160 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 return NULL;
6162 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006163 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006165 "htons: can't convert negative Python int to C "
6166 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 return NULL;
6168 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006169 if (x > 0xffff) {
6170 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6171 "htons: Python int too large to convert to C "
6172 "16-bit unsigned integer (The silent truncation "
6173 "is deprecated)",
6174 1)) {
6175 return NULL;
6176 }
6177 }
6178 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006179}
6180
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006181PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006182"htons(integer) -> integer\n\
6183\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006184Convert a 16-bit unsigned integer from host to network byte order.\n\
6185Note that in case the received integer does not fit in 16-bit unsigned\n\
6186integer, but does fit in a positive C int, it is silently truncated to\n\
618716-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006188However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006189exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006190
6191
Guido van Rossum006bf911996-06-12 04:04:55 +00006192static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006193socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197 if (PyLong_Check(arg)) {
6198 x = PyLong_AsUnsignedLong(arg);
6199 if (x == (unsigned long) -1 && PyErr_Occurred())
6200 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006201#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 {
6203 unsigned long y;
6204 /* only want the trailing 32 bits */
6205 y = x & 0xFFFFFFFFUL;
6206 if (y ^ x)
6207 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006208 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209 x = y;
6210 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 }
6213 else
6214 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006215 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 Py_TYPE(arg)->tp_name);
6217 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006218}
6219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006220PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006221"htonl(integer) -> integer\n\
6222\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006223Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006224
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006225/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006227PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006228"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006229\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006230Convert 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 +00006231binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006232
6233static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006234socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006235{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006236#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006238#endif
6239
6240#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006241#if (SIZEOF_INT != 4)
6242#error "Not sure if in_addr_t exists and int is not 32-bits."
6243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 /* Have to use inet_addr() instead */
6245 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006246#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006247 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6250 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006251
Tim Peters1df9fdd2003-02-13 03:13:40 +00006252
6253#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006254
6255#ifdef USE_INET_ATON_WEAKLINK
6256 if (inet_aton != NULL) {
6257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 if (inet_aton(ip_addr, &buf))
6259 return PyBytes_FromStringAndSize((char *)(&buf),
6260 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006261
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006262 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 "illegal IP address string passed to inet_aton");
6264 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006265
Thomas Wouters477c8d52006-05-27 19:21:47 +00006266#ifdef USE_INET_ATON_WEAKLINK
6267 } else {
6268#endif
6269
6270#endif
6271
6272#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 /* special-case this address as inet_addr might return INADDR_NONE
6275 * for this */
6276 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006277 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006279
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006280 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006284 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285 "illegal IP address string passed to inet_aton");
6286 return NULL;
6287 }
6288 }
6289 return PyBytes_FromStringAndSize((char *) &packed_addr,
6290 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006291
6292#ifdef USE_INET_ATON_WEAKLINK
6293 }
6294#endif
6295
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006296#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006297}
6298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006299PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006300"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006301\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006302Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006303
6304static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006305socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006306{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006307 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006309
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006310 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 return NULL;
6312 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006313
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006314 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006315 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006317 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 return NULL;
6319 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006320
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006321 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6322 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006323
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006324 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006326}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006327
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006328#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006329
6330PyDoc_STRVAR(inet_pton_doc,
6331"inet_pton(af, ip) -> packed IP address string\n\
6332\n\
6333Convert an IP address from string format to a packed string suitable\n\
6334for use with low-level network functions.");
6335
6336static PyObject *
6337socket_inet_pton(PyObject *self, PyObject *args)
6338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006340 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006342#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006343 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006344#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6348 return NULL;
6349 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006350
Martin v. Löwis04697e82004-06-02 12:35:29 +00006351#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006353 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354 "can't use AF_INET6, IPv6 is disabled");
6355 return NULL;
6356 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006357#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 retval = inet_pton(af, ip, packed);
6360 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006361 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 return NULL;
6363 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006364 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 "illegal IP address string passed to inet_pton");
6366 return NULL;
6367 } else if (af == AF_INET) {
6368 return PyBytes_FromStringAndSize(packed,
6369 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006370#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 } else if (af == AF_INET6) {
6372 return PyBytes_FromStringAndSize(packed,
6373 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006376 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 return NULL;
6378 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006379}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006380
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006381PyDoc_STRVAR(inet_ntop_doc,
6382"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6383\n\
6384Convert a packed IP address of the given family to string format.");
6385
6386static PyObject *
6387socket_inet_ntop(PyObject *self, PyObject *args)
6388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006390 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006392#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006393 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006394#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006395 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006396#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006397
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006398 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 return NULL;
6400 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006403 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 PyErr_SetString(PyExc_ValueError,
6405 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006406 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 return NULL;
6408 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006409#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006411 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 PyErr_SetString(PyExc_ValueError,
6413 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006414 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 return NULL;
6416 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 } else {
6419 PyErr_Format(PyExc_ValueError,
6420 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006421 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 return NULL;
6423 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006424
Коренберг Марк7766b962018-02-13 00:47:42 +05006425 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006426 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6427 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006429 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 return NULL;
6431 } else {
6432 return PyUnicode_FromString(retval);
6433 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006434}
6435
6436#endif /* HAVE_INET_PTON */
6437
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006438/* Python interface to getaddrinfo(host, port). */
6439
6440/*ARGSUSED*/
6441static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006442socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006443{
Victor Stinner77af1722011-05-26 14:05:59 +02006444 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006445 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 struct addrinfo hints, *res;
6447 struct addrinfo *res0 = NULL;
6448 PyObject *hobj = NULL;
6449 PyObject *pobj = (PyObject *)NULL;
6450 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006451 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 int family, socktype, protocol, flags;
6453 int error;
6454 PyObject *all = (PyObject *)NULL;
6455 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006456
Georg Brandl6083a4b2013-10-14 06:51:46 +02006457 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006459 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006460 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 &protocol, &flags)) {
6462 return NULL;
6463 }
6464 if (hobj == Py_None) {
6465 hptr = NULL;
6466 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006467 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 if (!idna)
6469 return NULL;
6470 assert(PyBytes_Check(idna));
6471 hptr = PyBytes_AS_STRING(idna);
6472 } else if (PyBytes_Check(hobj)) {
6473 hptr = PyBytes_AsString(hobj);
6474 } else {
6475 PyErr_SetString(PyExc_TypeError,
6476 "getaddrinfo() argument 1 must be string or None");
6477 return NULL;
6478 }
6479 if (PyLong_CheckExact(pobj)) {
6480 long value = PyLong_AsLong(pobj);
6481 if (value == -1 && PyErr_Occurred())
6482 goto err;
6483 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6484 pptr = pbuf;
6485 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006486 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006487 if (pptr == NULL)
6488 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006490 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491 } else if (pobj == Py_None) {
6492 pptr = (char *)NULL;
6493 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006494 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 goto err;
6496 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006497#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006498 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006499 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006500 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6501 * This workaround avoids a segfault in libsystem.
6502 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006503 pptr = "00";
6504 }
6505#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006506
6507 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6508 hobj, pobj, family, socktype, protocol) < 0) {
6509 return NULL;
6510 }
6511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 memset(&hints, 0, sizeof(hints));
6513 hints.ai_family = family;
6514 hints.ai_socktype = socktype;
6515 hints.ai_protocol = protocol;
6516 hints.ai_flags = flags;
6517 Py_BEGIN_ALLOW_THREADS
6518 ACQUIRE_GETADDRINFO_LOCK
6519 error = getaddrinfo(hptr, pptr, &hints, &res0);
6520 Py_END_ALLOW_THREADS
6521 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6522 if (error) {
6523 set_gaierror(error);
6524 goto err;
6525 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006526
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006527 all = PyList_New(0);
6528 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 goto err;
6530 for (res = res0; res; res = res->ai_next) {
6531 PyObject *single;
6532 PyObject *addr =
6533 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6534 if (addr == NULL)
6535 goto err;
6536 single = Py_BuildValue("iiisO", res->ai_family,
6537 res->ai_socktype, res->ai_protocol,
6538 res->ai_canonname ? res->ai_canonname : "",
6539 addr);
6540 Py_DECREF(addr);
6541 if (single == NULL)
6542 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006543
Zackery Spytz4c596d52018-11-14 15:39:01 -07006544 if (PyList_Append(all, single)) {
6545 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006547 }
6548 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549 }
6550 Py_XDECREF(idna);
6551 if (res0)
6552 freeaddrinfo(res0);
6553 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006554 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 Py_XDECREF(all);
6556 Py_XDECREF(idna);
6557 if (res0)
6558 freeaddrinfo(res0);
6559 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006560}
6561
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006562PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006563"getaddrinfo(host, port [, family, type, proto, flags])\n\
6564 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006565\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006566Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006567
6568/* Python interface to getnameinfo(sa, flags). */
6569
6570/*ARGSUSED*/
6571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006572socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 PyObject *sa = (PyObject *)NULL;
6575 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006576 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006577 int port;
6578 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6580 struct addrinfo hints, *res = NULL;
6581 int error;
6582 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006583 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 flags = flowinfo = scope_id = 0;
6586 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6587 return NULL;
6588 if (!PyTuple_Check(sa)) {
6589 PyErr_SetString(PyExc_TypeError,
6590 "getnameinfo() argument 1 must be a tuple");
6591 return NULL;
6592 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006593 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006594 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006595 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006597 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006598 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006599 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006600 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006601 return NULL;
6602 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006603
6604 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6605 return NULL;
6606 }
6607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6609 memset(&hints, 0, sizeof(hints));
6610 hints.ai_family = AF_UNSPEC;
6611 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006612 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 Py_BEGIN_ALLOW_THREADS
6614 ACQUIRE_GETADDRINFO_LOCK
6615 error = getaddrinfo(hostp, pbuf, &hints, &res);
6616 Py_END_ALLOW_THREADS
6617 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6618 if (error) {
6619 set_gaierror(error);
6620 goto fail;
6621 }
6622 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006623 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 "sockaddr resolved to multiple addresses");
6625 goto fail;
6626 }
6627 switch (res->ai_family) {
6628 case AF_INET:
6629 {
6630 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006631 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 "IPv4 sockaddr must be 2 tuple");
6633 goto fail;
6634 }
6635 break;
6636 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006637#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 case AF_INET6:
6639 {
6640 struct sockaddr_in6 *sin6;
6641 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006642 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 sin6->sin6_scope_id = scope_id;
6644 break;
6645 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006648 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6650 if (error) {
6651 set_gaierror(error);
6652 goto fail;
6653 }
Victor Stinner72400302016-01-28 15:41:01 +01006654
6655 name = sock_decode_hostname(hbuf);
6656 if (name == NULL)
6657 goto fail;
6658 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006659
6660fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 if (res)
6662 freeaddrinfo(res);
6663 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006664}
6665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006666PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006667"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006668\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006669Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006670
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006671
6672/* Python API to getting and setting the default timeout value. */
6673
6674static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306675socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006676{
Victor Stinner71694d52015-03-28 01:18:54 +01006677 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006678 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 }
Victor Stinner71694d52015-03-28 01:18:54 +01006680 else {
6681 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6682 return PyFloat_FromDouble(seconds);
6683 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006684}
6685
6686PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006687"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006688\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006689Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006690A value of None indicates that new socket objects have no timeout.\n\
6691When the socket module is first imported, the default is None.");
6692
6693static PyObject *
6694socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6695{
Victor Stinner71694d52015-03-28 01:18:54 +01006696 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006697
Victor Stinner71694d52015-03-28 01:18:54 +01006698 if (socket_parse_timeout(&timeout, arg) < 0)
6699 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006702
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006703 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006704}
6705
6706PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006707"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006708\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006709Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006710A value of None indicates that new socket objects have no timeout.\n\
6711When the socket module is first imported, the default is None.");
6712
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006713#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006714/* Python API for getting interface indices and names */
6715
6716static PyObject *
6717socket_if_nameindex(PyObject *self, PyObject *arg)
6718{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006719 PyObject *list = PyList_New(0);
6720 if (list == NULL) {
6721 return NULL;
6722 }
6723#ifdef MS_WINDOWS
6724 PMIB_IF_TABLE2 tbl;
6725 int ret;
6726 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6727 Py_DECREF(list);
6728 // ret is used instead of GetLastError()
6729 return PyErr_SetFromWindowsErr(ret);
6730 }
6731 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6732 MIB_IF_ROW2 r = tbl->Table[i];
6733 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6734 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6735 Py_ARRAY_LENGTH(buf)))) {
6736 Py_DECREF(list);
6737 FreeMibTable(tbl);
6738 // ret is used instead of GetLastError()
6739 return PyErr_SetFromWindowsErr(ret);
6740 }
6741 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6742 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6743 Py_XDECREF(tuple);
6744 Py_DECREF(list);
6745 FreeMibTable(tbl);
6746 return NULL;
6747 }
6748 Py_DECREF(tuple);
6749 }
6750 FreeMibTable(tbl);
6751 return list;
6752#else
Charles-François Natali60713592011-05-20 16:55:06 +02006753 int i;
6754 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006755
Charles-François Natali60713592011-05-20 16:55:06 +02006756 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006757 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006758 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006759 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006760 return NULL;
6761 }
6762
Gregory P. Smithb474e672018-12-30 17:05:36 -08006763#ifdef _Py_MEMORY_SANITIZER
6764 __msan_unpoison(ni, sizeof(ni));
6765 __msan_unpoison(&ni[0], sizeof(ni[0]));
6766#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006767 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006768#ifdef _Py_MEMORY_SANITIZER
6769 /* This one isn't the end sentinel, the next one must exist. */
6770 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6771 /* Otherwise Py_BuildValue internals are flagged by MSan when
6772 they access the not-msan-tracked if_name string data. */
6773 {
6774 char *to_sanitize = ni[i].if_name;
6775 do {
6776 __msan_unpoison(to_sanitize, 1);
6777 } while (*to_sanitize++ != '\0');
6778 }
6779#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006780 PyObject *ni_tuple = Py_BuildValue("IO&",
6781 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006782
6783 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6784 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006785 Py_DECREF(list);
6786 if_freenameindex(ni);
6787 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006788 }
6789 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006790 }
6791
6792 if_freenameindex(ni);
6793 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006794#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006795}
6796
6797PyDoc_STRVAR(if_nameindex_doc,
6798"if_nameindex()\n\
6799\n\
6800Returns a list of network interface information (index, name) tuples.");
6801
Charles-François Natali60713592011-05-20 16:55:06 +02006802static PyObject *
6803socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006804{
Charles-François Natali60713592011-05-20 16:55:06 +02006805 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006806#ifdef MS_WINDOWS
6807 NET_IFINDEX index;
6808#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006809 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006810#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006811 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6812 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006813 return NULL;
6814
Charles-François Natali60713592011-05-20 16:55:06 +02006815 index = if_nametoindex(PyBytes_AS_STRING(oname));
6816 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006817 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006818 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006819 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006820 return NULL;
6821 }
6822
6823 return PyLong_FromUnsignedLong(index);
6824}
6825
6826PyDoc_STRVAR(if_nametoindex_doc,
6827"if_nametoindex(if_name)\n\
6828\n\
6829Returns the interface index corresponding to the interface name if_name.");
6830
Charles-François Natali60713592011-05-20 16:55:06 +02006831static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006832socket_if_indextoname(PyObject *self, PyObject *arg)
6833{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006834#ifdef MS_WINDOWS
6835 NET_IFINDEX index;
6836#else
Charles-François Natali60713592011-05-20 16:55:06 +02006837 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006838#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006839 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006840
Charles-François Natali60713592011-05-20 16:55:06 +02006841 index = PyLong_AsUnsignedLong(arg);
6842 if (index == (unsigned long) -1)
6843 return NULL;
6844
6845 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006846 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006847 return NULL;
6848 }
6849
Charles-François Natali60713592011-05-20 16:55:06 +02006850 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006851}
6852
6853PyDoc_STRVAR(if_indextoname_doc,
6854"if_indextoname(if_index)\n\
6855\n\
6856Returns the interface name corresponding to the interface index if_index.");
6857
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006858#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006859
6860
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006861#ifdef CMSG_LEN
6862/* Python interface to CMSG_LEN(length). */
6863
6864static PyObject *
6865socket_CMSG_LEN(PyObject *self, PyObject *args)
6866{
6867 Py_ssize_t length;
6868 size_t result;
6869
6870 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6871 return NULL;
6872 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6873 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6874 return NULL;
6875 }
6876 return PyLong_FromSize_t(result);
6877}
6878
6879PyDoc_STRVAR(CMSG_LEN_doc,
6880"CMSG_LEN(length) -> control message length\n\
6881\n\
6882Return the total length, without trailing padding, of an ancillary\n\
6883data item with associated data of the given length. This value can\n\
6884often be used as the buffer size for recvmsg() to receive a single\n\
6885item of ancillary data, but RFC 3542 requires portable applications to\n\
6886use CMSG_SPACE() and thus include space for padding, even when the\n\
6887item will be the last in the buffer. Raises OverflowError if length\n\
6888is outside the permissible range of values.");
6889
6890
6891#ifdef CMSG_SPACE
6892/* Python interface to CMSG_SPACE(length). */
6893
6894static PyObject *
6895socket_CMSG_SPACE(PyObject *self, PyObject *args)
6896{
6897 Py_ssize_t length;
6898 size_t result;
6899
6900 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6901 return NULL;
6902 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6903 PyErr_SetString(PyExc_OverflowError,
6904 "CMSG_SPACE() argument out of range");
6905 return NULL;
6906 }
6907 return PyLong_FromSize_t(result);
6908}
6909
6910PyDoc_STRVAR(CMSG_SPACE_doc,
6911"CMSG_SPACE(length) -> buffer size\n\
6912\n\
6913Return the buffer size needed for recvmsg() to receive an ancillary\n\
6914data item with associated data of the given length, along with any\n\
6915trailing padding. The buffer space needed to receive multiple items\n\
6916is the sum of the CMSG_SPACE() values for their associated data\n\
6917lengths. Raises OverflowError if length is outside the permissible\n\
6918range of values.");
6919#endif /* CMSG_SPACE */
6920#endif /* CMSG_LEN */
6921
6922
Guido van Rossum30a685f1991-06-27 15:51:29 +00006923/* List of functions exported by this module. */
6924
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006925static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926 {"gethostbyname", socket_gethostbyname,
6927 METH_VARARGS, gethostbyname_doc},
6928 {"gethostbyname_ex", socket_gethostbyname_ex,
6929 METH_VARARGS, ghbn_ex_doc},
6930 {"gethostbyaddr", socket_gethostbyaddr,
6931 METH_VARARGS, gethostbyaddr_doc},
6932 {"gethostname", socket_gethostname,
6933 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006934#ifdef HAVE_SETHOSTNAME
6935 {"sethostname", socket_sethostname,
6936 METH_VARARGS, sethostname_doc},
6937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938 {"getservbyname", socket_getservbyname,
6939 METH_VARARGS, getservbyname_doc},
6940 {"getservbyport", socket_getservbyport,
6941 METH_VARARGS, getservbyport_doc},
6942 {"getprotobyname", socket_getprotobyname,
6943 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006944 {"close", socket_close,
6945 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006946#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947 {"dup", socket_dup,
6948 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006949#endif
Dave Cole331708b2004-08-09 04:51:41 +00006950#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951 {"socketpair", socket_socketpair,
6952 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954 {"ntohs", socket_ntohs,
6955 METH_VARARGS, ntohs_doc},
6956 {"ntohl", socket_ntohl,
6957 METH_O, ntohl_doc},
6958 {"htons", socket_htons,
6959 METH_VARARGS, htons_doc},
6960 {"htonl", socket_htonl,
6961 METH_O, htonl_doc},
6962 {"inet_aton", socket_inet_aton,
6963 METH_VARARGS, inet_aton_doc},
6964 {"inet_ntoa", socket_inet_ntoa,
6965 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006966#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 {"inet_pton", socket_inet_pton,
6968 METH_VARARGS, inet_pton_doc},
6969 {"inet_ntop", socket_inet_ntop,
6970 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006971#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006972 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006973 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974 {"getnameinfo", socket_getnameinfo,
6975 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306976 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 METH_NOARGS, getdefaulttimeout_doc},
6978 {"setdefaulttimeout", socket_setdefaulttimeout,
6979 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006980#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006981 {"if_nameindex", socket_if_nameindex,
6982 METH_NOARGS, if_nameindex_doc},
6983 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006984 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006985 {"if_indextoname", socket_if_indextoname,
6986 METH_O, if_indextoname_doc},
6987#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006988#ifdef CMSG_LEN
6989 {"CMSG_LEN", socket_CMSG_LEN,
6990 METH_VARARGS, CMSG_LEN_doc},
6991#ifdef CMSG_SPACE
6992 {"CMSG_SPACE", socket_CMSG_SPACE,
6993 METH_VARARGS, CMSG_SPACE_doc},
6994#endif
6995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006996 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006997};
6998
Guido van Rossum30a685f1991-06-27 15:51:29 +00006999
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007000#ifdef MS_WINDOWS
7001#define OS_INIT_DEFINED
7002
7003/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007004
7005static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007006os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007009}
7010
7011static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007012os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 WSADATA WSAData;
7015 int ret;
7016 ret = WSAStartup(0x0101, &WSAData);
7017 switch (ret) {
7018 case 0: /* No error */
7019 Py_AtExit(os_cleanup);
7020 return 1; /* Success */
7021 case WSASYSNOTREADY:
7022 PyErr_SetString(PyExc_ImportError,
7023 "WSAStartup failed: network not ready");
7024 break;
7025 case WSAVERNOTSUPPORTED:
7026 case WSAEINVAL:
7027 PyErr_SetString(
7028 PyExc_ImportError,
7029 "WSAStartup failed: requested version not supported");
7030 break;
7031 default:
7032 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7033 break;
7034 }
7035 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007036}
7037
Guido van Rossum8d665e61996-06-26 18:22:49 +00007038#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007039
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007040
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007041
7042#ifndef OS_INIT_DEFINED
7043static int
7044os_init(void)
7045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007047}
7048#endif
7049
7050
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007051/* C API table - always add new things to the end for binary
7052 compatibility. */
7053static
7054PySocketModule_APIObject PySocketModuleAPI =
7055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007057 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007059};
7060
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007061
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007062/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007063
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007064 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007065 "socket.py" which implements some additional functionality.
7066 The import of "_socket" may fail with an ImportError exception if
7067 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007068 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007069 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007070*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007072PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007073"Implementation module for socket operations.\n\
7074\n\
7075See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007076
Martin v. Löwis1a214512008-06-11 05:26:20 +00007077static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078 PyModuleDef_HEAD_INIT,
7079 PySocket_MODULE_NAME,
7080 socket_doc,
7081 -1,
7082 socket_methods,
7083 NULL,
7084 NULL,
7085 NULL,
7086 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007087};
7088
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007089PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007090PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 if (!os_init())
7095 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007096
Victor Stinnerdaf45552013-08-28 00:53:59 +02007097#ifdef MS_WINDOWS
7098 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007099 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007100 }
7101#endif
7102
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007103 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104 m = PyModule_Create(&socketmodule);
7105 if (m == NULL)
7106 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007107
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007108 Py_INCREF(PyExc_OSError);
7109 PySocketModuleAPI.error = PyExc_OSError;
7110 Py_INCREF(PyExc_OSError);
7111 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007113 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 if (socket_herror == NULL)
7115 return NULL;
7116 Py_INCREF(socket_herror);
7117 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007118 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 NULL);
7120 if (socket_gaierror == NULL)
7121 return NULL;
7122 Py_INCREF(socket_gaierror);
7123 PyModule_AddObject(m, "gaierror", socket_gaierror);
7124 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007125 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126 if (socket_timeout == NULL)
7127 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007128 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 Py_INCREF(socket_timeout);
7130 PyModule_AddObject(m, "timeout", socket_timeout);
7131 Py_INCREF((PyObject *)&sock_type);
7132 if (PyModule_AddObject(m, "SocketType",
7133 (PyObject *)&sock_type) != 0)
7134 return NULL;
7135 Py_INCREF((PyObject *)&sock_type);
7136 if (PyModule_AddObject(m, "socket",
7137 (PyObject *)&sock_type) != 0)
7138 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007139
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007140#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007142#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145 Py_INCREF(has_ipv6);
7146 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 /* Export C API */
7149 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7150 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7151 ) != 0)
7152 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007155#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007157#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007159#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007161#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007162#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007165#endif
7166#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007168#endif
7169#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007172#endif
7173#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007176#endif
7177#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007180#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007181#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007182 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007184#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007185#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007188#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007189#ifdef HAVE_SOCKADDR_ALG
7190 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7191#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007192#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007195#endif
7196#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007198#endif
7199#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007202#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007203#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007206#endif
7207#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007210#endif
7211#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007214#endif
7215#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007218#endif
7219#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, AF_NETLINK);
7222 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007223#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007225#endif
7226#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007228#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7230 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007231#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007233#endif
7234#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007236#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007237#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007239#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007240#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007242#endif
7243#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007245#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007247#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007249#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007250#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007252#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007253#ifdef NETLINK_CRYPTO
7254 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7255#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007256#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007257
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007258#ifdef AF_QIPCRTR
7259 /* Qualcomm IPCROUTER */
7260 PyModule_AddIntMacro(m, AF_QIPCRTR);
7261#endif
7262
caaveryeffc12f2017-09-06 18:18:10 -04007263#ifdef AF_VSOCK
7264 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7265 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7266 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7267 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7268 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7269 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7270 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7271 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7272 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7273#endif
7274
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007275#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007278#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007279#ifdef AF_LINK
7280 PyModule_AddIntMacro(m, AF_LINK);
7281#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007282#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007285#endif
7286#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007289#endif
7290#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007293#endif
7294#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007297#endif
7298#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007301#endif
7302#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007305#endif
7306#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007309#endif
7310#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007313#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007314
Hye-Shik Chang81268602004-02-02 06:05:24 +00007315#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007317#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007319#endif /* BTPROTO_L2CAP */
7320#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, BTPROTO_HCI);
7322 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007323#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007325#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007328#endif /* !__FreeBSD__ */
7329#endif /* !__NetBSD__ && !__DragonFly__ */
7330#endif /* BTPROTO_HCI */
7331#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007333#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7335 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007336#ifdef BTPROTO_SCO
7337 PyModule_AddIntMacro(m, BTPROTO_SCO);
7338#endif /* BTPROTO_SCO */
7339#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007340
Charles-François Natali47413c12011-10-06 19:47:44 +02007341#ifdef AF_CAN
7342 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007344#endif
7345#ifdef PF_CAN
7346 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007348#endif
7349
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007350/* Reliable Datagram Sockets */
7351#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007353#endif
7354#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007356#endif
7357
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007358/* Kernel event messages */
7359#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007361#endif
7362#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007364#endif
7365
Antoine Pitroub156a462010-10-27 20:13:57 +00007366#ifdef AF_PACKET
7367 PyModule_AddIntMacro(m, AF_PACKET);
7368#endif
7369#ifdef PF_PACKET
7370 PyModule_AddIntMacro(m, PF_PACKET);
7371#endif
7372#ifdef PACKET_HOST
7373 PyModule_AddIntMacro(m, PACKET_HOST);
7374#endif
7375#ifdef PACKET_BROADCAST
7376 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7377#endif
7378#ifdef PACKET_MULTICAST
7379 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7380#endif
7381#ifdef PACKET_OTHERHOST
7382 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7383#endif
7384#ifdef PACKET_OUTGOING
7385 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7386#endif
7387#ifdef PACKET_LOOPBACK
7388 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7389#endif
7390#ifdef PACKET_FASTROUTE
7391 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007392#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007393
Christian Heimes043d6f62008-01-07 17:19:16 +00007394#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7399 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7400 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007401
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7403 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7404 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, SOL_TIPC);
7408 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7409 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7410 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7411 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007412
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7414 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7415 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7416 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7420 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007421#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007422 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007424#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7426 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7427 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7428 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7429 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7430 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007431#endif
7432
Christian Heimesdffa3942016-09-05 23:54:41 +02007433#ifdef HAVE_SOCKADDR_ALG
7434 /* Socket options */
7435 PyModule_AddIntMacro(m, ALG_SET_KEY);
7436 PyModule_AddIntMacro(m, ALG_SET_IV);
7437 PyModule_AddIntMacro(m, ALG_SET_OP);
7438 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7439 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7440 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7441
7442 /* Operations */
7443 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7444 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7445 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7446 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7447#endif
7448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, SOCK_STREAM);
7451 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007452/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007453#ifdef SOCK_RAW
7454 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007456#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007458#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007460#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007461#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007463#endif
7464#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007466#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007474#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007476#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007477#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007479#endif
7480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007498#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007499#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007530#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007531#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007533#endif
7534#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007536#endif
7537#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007539#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007540#ifdef SO_PASSSEC
7541 PyModule_AddIntMacro(m, SO_PASSSEC);
7542#endif
7543#ifdef SO_PEERSEC
7544 PyModule_AddIntMacro(m, SO_PEERSEC);
7545#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007546#ifdef SO_BINDTODEVICE
7547 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7548#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007549#ifdef SO_PRIORITY
7550 PyModule_AddIntMacro(m, SO_PRIORITY);
7551#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007552#ifdef SO_MARK
7553 PyModule_AddIntMacro(m, SO_MARK);
7554#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007555#ifdef SO_DOMAIN
7556 PyModule_AddIntMacro(m, SO_DOMAIN);
7557#endif
7558#ifdef SO_PROTOCOL
7559 PyModule_AddIntMacro(m, SO_PROTOCOL);
7560#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562 /* Maximum number of connections for "listen" */
7563#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007565#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007566 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007567#endif
7568
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007569 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007570#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007572#endif
7573#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007575#endif
7576#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007578#endif
7579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580 /* Flags for send, recv */
7581#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007584#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007587#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007590#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007593#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007596#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007599#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007605#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007608#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007610#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007611#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007613#endif
7614#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007616#endif
7617#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007619#endif
7620#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007622#endif
7623#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007625#endif
7626#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007628#endif
7629#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007631#endif
7632#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007634#endif
7635#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007637#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007638#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007640#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642 /* Protocol level and numbers, usable for [gs]etsockopt */
7643#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007646#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007648#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007649 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007654#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007660#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007663#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007666#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007668#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007673#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007675#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007676#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007678#endif
7679#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7681 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007682#endif
7683#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7685 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7686 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007687
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7689 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7690 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007691#ifdef CAN_ISOTP
7692 PyModule_AddIntMacro(m, CAN_ISOTP);
7693#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007694#endif
7695#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007696 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7697 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7698 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7699 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007700#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007701#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7702 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7703#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007704#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007706
7707 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007708 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7709 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7710 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7711 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7712 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7713 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7714 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7715 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7716 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7717 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7718 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7719 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007720
7721 /* BCM flags */
7722 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7723 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7724 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7725 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7726 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7727 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7728 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7729 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7730 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7731 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7732 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7733#ifdef CAN_FD_FRAME
7734 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7735 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7736#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007737#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007738#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007740#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007741#ifdef HAVE_SOCKADDR_ALG
7742 PyModule_AddIntMacro(m, SOL_ALG);
7743#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007744#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007746#endif
7747#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007749#endif
7750#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007751 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007752#endif
7753#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007755#endif
7756#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007757 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007758#endif
7759#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007760 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007762#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007763 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007764#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007765 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007767#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007770#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007771 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007772#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007773 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007775#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007778#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007781#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007784#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007787#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007790#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007792#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007793 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007795#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007796 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007798#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007799 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007801#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007803#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007804 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007805#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007806#ifdef IPPROTO_UDPLITE
7807 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7808 #ifndef UDPLITE_SEND_CSCOV
7809 #define UDPLITE_SEND_CSCOV 10
7810 #endif
7811 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7812 #ifndef UDPLITE_RECV_CSCOV
7813 #define UDPLITE_RECV_CSCOV 11
7814 #endif
7815 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007820#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007823#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007824 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007826#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007827 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007829#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007830 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007832#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007833 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007835#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007838#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007839 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007841#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007842 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007844#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007845 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007847#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007848 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007850#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007851 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007853#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007854 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007856#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007857 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007859#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007860 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007862#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007863 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007865#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007866 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007868#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007869 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007871#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007872 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007873#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007874#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007875 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007877#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007879#endif
7880/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007883#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007884 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007886#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007887 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007888#endif
7889
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007890#ifdef MS_WINDOWS
7891 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7892 PyModule_AddIntMacro(m, IPPROTO_ST);
7893 PyModule_AddIntMacro(m, IPPROTO_CBT);
7894 PyModule_AddIntMacro(m, IPPROTO_IGP);
7895 PyModule_AddIntMacro(m, IPPROTO_RDP);
7896 PyModule_AddIntMacro(m, IPPROTO_PGM);
7897 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7898 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7899#endif
7900
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007901#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007902 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007903#endif
7904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007905 /* Some port configuration */
7906#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007908#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007912 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007913#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007914 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007915#endif
7916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917 /* Some reserved IP v.4 addresses */
7918#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007920#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007923#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007924 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007925#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007926 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007928#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007929 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007930#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007933#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007934 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007935#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007936 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007938#ifdef INADDR_ALLHOSTS_GROUP
7939 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7940 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007942 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007945 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007946#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007947 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007950 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007951#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007952 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007953#endif
7954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955 /* IPv4 [gs]etsockopt options */
7956#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007959#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007960 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007962#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007963 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007965#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007966 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007972 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007974#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007975 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007977#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007978 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007980#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007981 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007983#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007987 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007989#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007990 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007992#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007993 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007995#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007996 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007998#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008001#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008002 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008003#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008004#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008005 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008006#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008008 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8009#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008013 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008019 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008021#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008022 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008024#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008025 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008028#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008029 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008031 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008032#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008033 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008034#endif
8035#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008036 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008037#endif
8038#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008039 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008040#endif
8041#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008042 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008043#endif
8044#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008045 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008046#endif
8047#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008048 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008049#endif
8050#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008051 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008052#endif
8053#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008054 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008055#endif
8056#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008057 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008058#endif
8059#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008061#endif
8062#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008063 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008064#endif
8065#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008066 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008067#endif
8068#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008070#endif
8071#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008072 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008073#endif
8074#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008075 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008076#endif
8077#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008078 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008079#endif
8080#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008081 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008082#endif
8083#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008084 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008085#endif
8086#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008087 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008088#endif
8089#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008090 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008091#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008093 /* TCP options */
8094#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008096#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008097#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008100#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008103#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008106#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008109#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008112#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008115#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008118#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008121#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008124#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008127#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008129#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008130#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008132#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008133#ifdef TCP_CONGESTION
8134 PyModule_AddIntMacro(m, TCP_CONGESTION);
8135#endif
8136#ifdef TCP_USER_TIMEOUT
8137 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8138#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008139#ifdef TCP_NOTSENT_LOWAT
8140 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8141#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008143 /* IPX options */
8144#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008146#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008147
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008148/* Reliable Datagram Sockets */
8149#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008150 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008151#endif
8152#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008153 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008154#endif
8155#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008156 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008157#endif
8158#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008159 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008160#endif
8161#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008162 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008163#endif
8164#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008165 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008166#endif
8167#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008168 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008169#endif
8170#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008171 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008172#endif
8173#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008174 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008175#endif
8176#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008177 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008178#endif
8179#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008180 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008181#endif
8182#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008183 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008184#endif
8185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008186 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008187#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008188 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008189#endif
8190#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008191 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008192#endif
8193#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008194 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008195#endif
8196#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008197 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008198#endif
8199#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008200 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008201#endif
8202#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008203 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008204#endif
8205#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008206 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008207#endif
8208#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008209 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008210#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008211#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008212 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008213#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008214#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008215 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008216#endif
8217#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008218 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008219#endif
8220#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008221 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008222#endif
8223#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008224 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008225#endif
8226#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008227 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008228#endif
8229#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008230 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008231#endif
8232#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008233 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008234#endif
8235#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008236 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008237#endif
8238#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008239 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008240#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008241#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008242 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008243#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008244#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008245 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008246#endif
8247#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008248 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008249#endif
8250#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008251 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008252#endif
8253#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008254 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008255#endif
8256#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008257 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008258#endif
8259#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008260 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008261#endif
8262#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008263 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008264#endif
8265#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008266 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008267#endif
8268#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008269 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008270#endif
8271#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008272 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008273#endif
8274#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008275 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008276#endif
8277#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008278 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008279#endif
8280#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008281 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008282#endif
8283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008284 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008285#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008287#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008288 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008289#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008290 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008291#endif
8292#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008293 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008294#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008295 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008296#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008297 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008298#endif
8299#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008300 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008301#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008302 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008304 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008305#endif
8306
Christian Heimesfaf2f632008-01-06 16:59:19 +00008307#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008308 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008309 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8310#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008311 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008312#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008313 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008314 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8315#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008316 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008317#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008318 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008319 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008320 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008321 PyObject *tmp;
8322 tmp = PyLong_FromUnsignedLong(codes[i]);
8323 if (tmp == NULL)
8324 return NULL;
8325 PyModule_AddObject(m, names[i], tmp);
8326 }
8327 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008328 PyModule_AddIntMacro(m, RCVALL_OFF);
8329 PyModule_AddIntMacro(m, RCVALL_ON);
8330 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008331#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008332 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008333#endif
8334#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008335 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008336#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008337#endif /* _MSTCPIP_ */
8338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008339 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008340#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008341 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008342#endif
animalize19e7d482018-02-27 02:10:36 +08008343
8344#ifdef MS_WINDOWS
8345 /* remove some flags on older version Windows during run-time */
8346 remove_unusable_flags(m);
8347#endif
8348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008349 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008350}