blob: f8e4de5825f7ad2835a58c7c4c77c37f98e1b5aa [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"
Victor Stinner4a21e572020-04-15 02:35:41 +0200104#include "structmember.h" // PyMemberDef
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
Serhiy Storchakad3187152017-11-09 18:00:38 +0200200#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Victor Stinner62183b82020-04-15 02:04:42 +0200201# include <sys/ioctl.h>
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100202#endif
203
204
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000205#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000206/* make sure that the reentrant (gethostbyaddr_r etc)
207 functions are declared correctly if compiling with
208 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000209
Thomas Wouters477c8d52006-05-27 19:21:47 +0000210/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000211 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000212#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000213#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000214
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000215#undef _XOPEN_SOURCE
216#include <sys/socket.h>
217#include <sys/types.h>
218#include <netinet/in.h>
219#ifdef _SS_ALIGNSIZE
220#define HAVE_GETADDRINFO 1
221#define HAVE_GETNAMEINFO 1
222#endif
223
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224#define HAVE_INET_PTON
225#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000226#endif
227
Benjamin Peterson06930632017-09-04 16:36:05 -0700228/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100229#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000230#define INET_ADDRSTRLEN 16
231#endif
232
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000234#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000236#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700238#ifdef HAVE_SYS_SOCKET_H
239#include <sys/socket.h>
240#endif
241
242#ifdef HAVE_NET_IF_H
243#include <net/if.h>
244#endif
245
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000246/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000247#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000248#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000249
250/* Addressing includes */
251
Guido van Rossum6f489d91996-06-28 20:15:15 +0000252#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253
254/* Non-MS WINDOWS includes */
255# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000256# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000257
Guido van Rossum9376b741999-09-15 22:01:40 +0000258/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000260
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000263#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000264
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000265/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000266# ifdef HAVE_FCNTL_H
267# include <fcntl.h>
268# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000269
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100270/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
271#ifdef MS_WINDOWS
272#define IPPROTO_ICMP IPPROTO_ICMP
273#define IPPROTO_IGMP IPPROTO_IGMP
274#define IPPROTO_GGP IPPROTO_GGP
275#define IPPROTO_TCP IPPROTO_TCP
276#define IPPROTO_PUP IPPROTO_PUP
277#define IPPROTO_UDP IPPROTO_UDP
278#define IPPROTO_IDP IPPROTO_IDP
279#define IPPROTO_ND IPPROTO_ND
280#define IPPROTO_RAW IPPROTO_RAW
281#define IPPROTO_MAX IPPROTO_MAX
282#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
283#define IPPROTO_IPV4 IPPROTO_IPV4
284#define IPPROTO_IPV6 IPPROTO_IPV6
285#define IPPROTO_ROUTING IPPROTO_ROUTING
286#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
287#define IPPROTO_ESP IPPROTO_ESP
288#define IPPROTO_AH IPPROTO_AH
289#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
290#define IPPROTO_NONE IPPROTO_NONE
291#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
292#define IPPROTO_EGP IPPROTO_EGP
293#define IPPROTO_PIM IPPROTO_PIM
294#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
295#define IPPROTO_ST IPPROTO_ST // WinSock2 only
296#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
297#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
298#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
299#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
300#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
301#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
302#endif /* MS_WINDOWS */
303
Steve Dower65e4cb12014-11-22 12:54:57 -0800304/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200305#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600306// For if_nametoindex() and if_indextoname()
307#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800308
animalize19e7d482018-02-27 02:10:36 +0800309/* remove some flags on older version Windows during run-time.
310 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
311typedef struct {
312 DWORD build_number; /* available starting with this Win10 BuildNumber */
313 const char flag_name[20];
314} FlagRuntimeInfo;
315
316/* IMPORTANT: make sure the list ordered by descending build_number */
317static FlagRuntimeInfo win_runtime_flags[] = {
318 /* available starting with Windows 10 1709 */
319 {16299, "TCP_KEEPIDLE"},
320 {16299, "TCP_KEEPINTVL"},
321 /* available starting with Windows 10 1703 */
322 {15063, "TCP_KEEPCNT"},
323 /* available starting with Windows 10 1607 */
324 {14393, "TCP_FASTOPEN"}
325};
326
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200327static int
animalize19e7d482018-02-27 02:10:36 +0800328remove_unusable_flags(PyObject *m)
329{
330 PyObject *dict;
331 OSVERSIONINFOEX info;
332 DWORDLONG dwlConditionMask;
333
334 dict = PyModule_GetDict(m);
335 if (dict == NULL) {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200336 return -1;
animalize19e7d482018-02-27 02:10:36 +0800337 }
338
339 /* set to Windows 10, except BuildNumber. */
340 memset(&info, 0, sizeof(info));
341 info.dwOSVersionInfoSize = sizeof(info);
342 info.dwMajorVersion = 10;
343 info.dwMinorVersion = 0;
344
345 /* set Condition Mask */
346 dwlConditionMask = 0;
347 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
348 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
349 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
350
351 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
352 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100353 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800354 Compatibility Mode will not cheat VerifyVersionInfo(...) */
355 if (VerifyVersionInfo(
356 &info,
357 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
358 dwlConditionMask)) {
359 break;
360 }
361 else {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200362 PyObject *flag_name = PyUnicode_FromString(win_runtime_flags[i].flag_name);
363 if (flag_name == NULL) {
364 return -1;
animalize19e7d482018-02-27 02:10:36 +0800365 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200366 PyObject *v = _PyDict_Pop(dict, flag_name, Py_None);
367 Py_DECREF(flag_name);
368 if (v == NULL) {
369 return -1;
370 }
371 Py_DECREF(v);
animalize19e7d482018-02-27 02:10:36 +0800372 }
373 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200374 return 0;
animalize19e7d482018-02-27 02:10:36 +0800375}
376
Jeremy Hylton22308652001-02-02 03:23:09 +0000377#endif
378
Skip Montanaro7befb992004-02-10 16:50:21 +0000379#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000380
Neal Norwitz39d22e52002-11-02 19:55:21 +0000381#ifndef O_NONBLOCK
382# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383#endif
384
Trent Micka708d6e2004-09-07 17:48:26 +0000385/* include Python's addrinfo.h unless it causes trouble */
386#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
387 /* Do not include addinfo.h on some newer IRIX versions.
388 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
389 * for example, but not by 6.5.10.
390 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000392 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
393 * EAI_* constants are defined in (the already included) ws2tcpip.h.
394 */
395#else
396# include "addrinfo.h"
397#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000398
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000399#ifdef __APPLE__
400/* On OS X, getaddrinfo returns no error indication of lookup
401 failure, so we must use the emulation instead of the libinfo
402 implementation. Unfortunately, performing an autoconf test
403 for this bug would require DNS access for the machine performing
404 the configuration, which is not acceptable. Therefore, we
405 determine the bug just by checking for __APPLE__. If this bug
406 gets ever fixed, perhaps checking for sys/version.h would be
407 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000408#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600409/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000410 Find to check for Jaguar is that it has getnameinfo(), which
411 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000412#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000413#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000414
415#ifdef HAVE_INET_ATON
416#define USE_INET_ATON_WEAKLINK
417#endif
418
Jack Jansen84262fb2002-07-02 14:40:42 +0000419#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000420
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000421/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000422#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000423/* avoid clashes with the C library definition of the symbol. */
424#define getaddrinfo fake_getaddrinfo
425#define gai_strerror fake_gai_strerror
426#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000427#include "getaddrinfo.c"
428#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000429#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000430#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000431#include "getnameinfo.c"
432#endif
433
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000434#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000435#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000436#endif
437
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000438#ifdef MS_WIN32
Victor Stinnere822e372020-06-15 21:59:47 +0200439# undef EAFNOSUPPORT
440# define EAFNOSUPPORT WSAEAFNOSUPPORT
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000442
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000443#ifndef SOCKETCLOSE
Victor Stinnere822e372020-06-15 21:59:47 +0200444# define SOCKETCLOSE close
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000445#endif
446
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000447#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000448#define USE_BLUETOOTH 1
449#if defined(__FreeBSD__)
450#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
451#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000452#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453#define SOL_HCI SOL_HCI_RAW
454#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000455#define sockaddr_l2 sockaddr_l2cap
456#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000457#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000458#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
459#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000461#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462#define sockaddr_l2 sockaddr_bt
463#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000464#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000466#define SOL_HCI BTPROTO_HCI
467#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000468#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
469#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000470#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000471#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000472#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000473#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
474#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000475#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000476#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
477#endif
478#endif
479
Greg Bowser8fbece12019-08-02 16:29:52 -0400480#ifdef MS_WINDOWS
481#define sockaddr_rc SOCKADDR_BTH_REDEF
482
483#define USE_BLUETOOTH 1
484#define AF_BLUETOOTH AF_BTH
485#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
486#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
487#endif
488
Charles-François Natali8b759652011-12-23 16:44:51 +0100489/* Convert "sock_addr_t *" to "struct sockaddr *". */
490#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491
Martin v. Löwise9416172003-05-03 10:12:45 +0000492/*
493 * Constants for getnameinfo()
494 */
495#if !defined(NI_MAXHOST)
496#define NI_MAXHOST 1025
497#endif
498#if !defined(NI_MAXSERV)
499#define NI_MAXSERV 32
500#endif
501
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000502#ifndef INVALID_SOCKET /* MS defines this */
503#define INVALID_SOCKET (-1)
504#endif
505
Charles-François Natali0cc86852013-09-13 19:53:08 +0200506#ifndef INADDR_NONE
507#define INADDR_NONE (-1)
508#endif
509
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000510/* XXX There's a problem here: *static* functions are not supposed to have
511 a Py prefix (or use CapitalizedWords). Later... */
512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513/* Global variable holding the exception type for errors detected
514 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000515static PyObject *socket_herror;
516static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517
Tim Peters643a7fc2002-02-17 04:13:21 +0000518/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000519 The sock_type variable contains pointers to various functions,
520 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000521 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000522static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000523
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000524#if defined(HAVE_POLL_H)
525#include <poll.h>
526#elif defined(HAVE_SYS_POLL_H)
527#include <sys/poll.h>
528#endif
529
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000530/* Largest value to try to store in a socklen_t (used when handling
531 ancillary data). POSIX requires socklen_t to hold at least
532 (2**31)-1 and recommends against storing larger values, but
533 socklen_t was originally int in the BSD interface, so to be on the
534 safe side we use the smaller of (2**31)-1 and INT_MAX. */
535#if INT_MAX > 0x7fffffff
536#define SOCKLEN_T_LIMIT 0x7fffffff
537#else
538#define SOCKLEN_T_LIMIT INT_MAX
539#endif
540
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200541#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000542/* Instead of select(), we'll use poll() since poll() works on any fd. */
543#define IS_SELECTABLE(s) 1
544/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000545#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200546/* If there's no timeout left, we don't have to call select, so it's a safe,
547 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100548#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000549#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000550
551static PyObject*
552select_error(void)
553{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200554 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000556}
557
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000558#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000559#ifndef WSAEAGAIN
560#define WSAEAGAIN WSAEWOULDBLOCK
561#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000562#define CHECK_ERRNO(expected) \
563 (WSAGetLastError() == WSA ## expected)
564#else
565#define CHECK_ERRNO(expected) \
566 (errno == expected)
567#endif
568
Victor Stinnerdaf45552013-08-28 00:53:59 +0200569#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200570# define GET_SOCK_ERROR WSAGetLastError()
571# define SET_SOCK_ERROR(err) WSASetLastError(err)
572# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
573# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
574#else
575# define GET_SOCK_ERROR errno
576# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
577# define SOCK_TIMEOUT_ERR EWOULDBLOCK
578# define SOCK_INPROGRESS_ERR EINPROGRESS
579#endif
580
Erik Janssens874809e2018-09-05 08:29:42 +0200581#ifdef _MSC_VER
582# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
583#else
584# define SUPPRESS_DEPRECATED_CALL
585#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200586
587#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200588/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
589static int support_wsa_no_inherit = -1;
590#endif
591
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592/* Convenience function to raise an error according to errno
593 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594
Guido van Rossum73624e91994-10-10 17:59:00 +0000595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000596set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000598#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 int err_no = WSAGetLastError();
600 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
601 recognizes the error codes used by both GetLastError() and
602 WSAGetLastError */
603 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200604 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000605#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000606
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200607 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608}
609
Guido van Rossum30a685f1991-06-27 15:51:29 +0000610
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000612set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615
616#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600617 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 if (v != NULL) {
622 PyErr_SetObject(socket_herror, v);
623 Py_DECREF(v);
624 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627}
628
629
630static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000631set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634
Martin v. Löwis272cb402002-03-01 08:31:07 +0000635#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 /* EAI_SYSTEM is not available on Windows XP. */
637 if (error == EAI_SYSTEM)
638 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000639#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000641#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000643#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (v != NULL) {
647 PyErr_SetObject(socket_gaierror, v);
648 Py_DECREF(v);
649 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652}
653
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000654/* Function to perform the setting of socket blocking mode
655 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656static int
657internal_setblocking(PySocketSockObject *s, int block)
658{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400659 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200660#ifdef MS_WINDOWS
661 u_long arg;
662#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100663#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100664 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100665 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100670#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200672 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400673 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100674#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200676 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400677 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100679 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 else
Victor Stinner9a954832013-12-04 00:41:24 +0100681 new_delay_flag = delay_flag | O_NONBLOCK;
682 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200683 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400684 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100685#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000686#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200687 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200688 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000690#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691
692 result = 0;
693
694 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000696
Yury Selivanovfa22b292016-10-18 16:03:52 -0400697 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200698#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400699 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200700#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400701 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200702#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400703 }
704
705 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706}
707
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000708static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200709internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
710 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100713#ifdef HAVE_POLL
714 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200715 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100716#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200717 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200718 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100719#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000720
Victor Stinnerb7df3142015-03-27 22:59:32 +0100721 /* must be called with the GIL held */
722 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100723
Victor Stinner416f2e62015-03-31 13:56:29 +0200724 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200725 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200728 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* Prefer poll, if available, since you can poll() any fd
732 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100734 pollfd.fd = s->sock_fd;
735 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200736 if (connect) {
737 /* On Windows, the socket becomes writable on connection success,
738 but a connection failure is notified as an error. On POSIX, the
739 socket becomes writable on connection success or on connection
740 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200741 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200742 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000743
Victor Stinner71694d52015-03-28 01:18:54 +0100744 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200745 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200746 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000747
Artem Khramov28146202019-08-15 03:21:48 +0600748 /* On some OSes, typically BSD-based ones, the timeout parameter of the
749 poll() syscall, when negative, must be exactly INFTIM, where defined,
750 or -1. See issue 37811. */
751 if (ms < 0) {
752#ifdef INFTIM
753 ms = INFTIM;
754#else
755 ms = -1;
756#endif
757 }
758
Victor Stinner71694d52015-03-28 01:18:54 +0100759 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200760 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100761 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000762#else
Victor Stinnerced11742015-04-09 10:27:25 +0200763 if (interval >= 0) {
764 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
765 tvp = &tv;
766 }
767 else
768 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000769
Victor Stinner71694d52015-03-28 01:18:54 +0100770 FD_ZERO(&fds);
771 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200772 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200773 if (connect) {
774 /* On Windows, the socket becomes writable on connection success,
775 but a connection failure is notified as an error. On POSIX, the
776 socket becomes writable on connection success or on connection
777 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200778 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200779 }
Victor Stinner71694d52015-03-28 01:18:54 +0100780
781 /* See if the socket is ready */
782 Py_BEGIN_ALLOW_THREADS;
783 if (writing)
784 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200785 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100786 else
787 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200788 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100789 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000790#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 if (n < 0)
793 return -1;
794 if (n == 0)
795 return 1;
796 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000797}
798
Victor Stinner31bf2d52015-04-01 21:57:09 +0200799/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000800
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 On error, raise an exception and return -1 if err is set, or fill err and
802 return -1 otherwise. If a signal was received and the signal handler raised
803 an exception, return -1, and set err to -1 if err is set.
804
805 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100806
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 If the socket has a timeout, wait until the socket is ready before calling
808 the function: wait until the socket is writable if writing is nonzero, wait
809 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100810
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812 the function, except if the signal handler raised an exception (PEP 475).
813
814 When the function is retried, recompute the timeout using a monotonic clock.
815
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 sock_call_ex() must be called with the GIL held. The socket function is
817 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200819sock_call_ex(PySocketSockObject *s,
820 int writing,
821 int (*sock_func) (PySocketSockObject *s, void *data),
822 void *data,
823 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200824 int *err,
825 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826{
Victor Stinner8912d142015-04-06 23:16:34 +0200827 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828 _PyTime_t deadline = 0;
829 int deadline_initialized = 0;
830 int res;
831
832 /* sock_call() must be called with the GIL held. */
833 assert(PyGILState_Check());
834
835 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 /* For connect(), poll even for blocking socket. The connection
839 runs asynchronously. */
840 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200842 _PyTime_t interval;
843
Victor Stinner81c41db2015-04-02 11:50:57 +0200844 if (deadline_initialized) {
845 /* recompute the timeout */
846 interval = deadline - _PyTime_GetMonotonicClock();
847 }
848 else {
849 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200850 deadline = _PyTime_GetMonotonicClock() + timeout;
851 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200852 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200853
Victor Stinner10550cd2015-04-03 13:22:27 +0200854 if (interval >= 0)
855 res = internal_select(s, writing, interval, connect);
856 else
857 res = 1;
858 }
859 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200860 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200861 }
862
Victor Stinner31bf2d52015-04-01 21:57:09 +0200863 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200864 if (err)
865 *err = GET_SOCK_ERROR;
866
Victor Stinner31bf2d52015-04-01 21:57:09 +0200867 if (CHECK_ERRNO(EINTR)) {
868 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200869 if (PyErr_CheckSignals()) {
870 if (err)
871 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200872 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200873 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874
875 /* retry select() */
876 continue;
877 }
878
879 /* select() failed */
880 s->errorhandler();
881 return -1;
882 }
883
884 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200885 if (err)
886 *err = SOCK_TIMEOUT_ERR;
887 else
Christian Heimes03c8ddd2020-11-20 09:26:07 +0100888 PyErr_SetString(PyExc_TimeoutError, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200889 return -1;
890 }
891
892 /* the socket is ready */
893 }
894
Victor Stinner81c41db2015-04-02 11:50:57 +0200895 /* inner loop to retry sock_func() when sock_func() is interrupted
896 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200897 while (1) {
898 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200899 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200900 Py_END_ALLOW_THREADS
901
902 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200903 /* sock_func() succeeded */
904 if (err)
905 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200906 return 0;
907 }
908
Victor Stinner81c41db2015-04-02 11:50:57 +0200909 if (err)
910 *err = GET_SOCK_ERROR;
911
Victor Stinner31bf2d52015-04-01 21:57:09 +0200912 if (!CHECK_ERRNO(EINTR))
913 break;
914
Victor Stinner81c41db2015-04-02 11:50:57 +0200915 /* sock_func() was interrupted by a signal */
916 if (PyErr_CheckSignals()) {
917 if (err)
918 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200919 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200920 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200921
Victor Stinner81c41db2015-04-02 11:50:57 +0200922 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200923 }
924
925 if (s->sock_timeout > 0
926 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200927 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200928
929 For example, select() could indicate a socket is ready for
930 reading, but the data then discarded by the OS because of a
931 wrong checksum.
932
933 Loop on select() to recheck for socket readyness. */
934 continue;
935 }
936
Victor Stinner81c41db2015-04-02 11:50:57 +0200937 /* sock_func() failed */
938 if (!err)
939 s->errorhandler();
940 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000941 return -1;
942 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200943}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000944
Victor Stinner81c41db2015-04-02 11:50:57 +0200945static int
946sock_call(PySocketSockObject *s,
947 int writing,
948 int (*func) (PySocketSockObject *s, void *data),
949 void *data)
950{
Victor Stinner8912d142015-04-06 23:16:34 +0200951 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200952}
953
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000954
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000955/* Initialize a new socket object. */
956
Victor Stinner88ed6402015-04-09 10:23:12 +0200957/* Default timeout for new sockets */
958static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000959
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200960static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000961init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 s->sock_fd = fd;
965 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500968
969 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
970 on some OSes as part of socket.type. We want to reset them here,
971 to make socket.type be set to the same value on all platforms.
972 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
973 not portable.
974 */
975#ifdef SOCK_NONBLOCK
976 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
977#endif
978#ifdef SOCK_CLOEXEC
979 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
980#endif
981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000985#ifdef SOCK_NONBLOCK
986 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100987 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000988 else
989#endif
990 {
991 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200992 if (defaulttimeout >= 0) {
993 if (internal_setblocking(s, 0) == -1) {
994 return -1;
995 }
996 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000997 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200998 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000999}
1000
1001
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002/* Create a new socket object.
1003 This just creates the object and initializes it.
1004 If the creation fails, return NULL and set an exception (implicit
1005 in NEWOBJ()). */
1006
Guido van Rossum73624e91994-10-10 17:59:00 +00001007static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001008new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 PySocketSockObject *s;
1011 s = (PySocketSockObject *)
1012 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001013 if (s == NULL)
1014 return NULL;
1015 if (init_sockobject(s, fd, family, type, proto) == -1) {
1016 Py_DECREF(s);
1017 return NULL;
1018 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020}
1021
Guido van Rossum30a685f1991-06-27 15:51:29 +00001022
Guido van Rossum48a680c2001-03-02 06:34:14 +00001023/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001024 thread to be in gethostbyname or getaddrinfo */
Victor Stinner0de437d2020-05-28 17:23:39 +02001025#if defined(USE_GETHOSTBYNAME_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001026static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001027#endif
1028
1029
Guido van Rossum30a685f1991-06-27 15:51:29 +00001030/* Convert a string specifying a host name or one of a few symbolic
1031 names to a numeric IP address. This usually calls gethostbyname()
1032 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001033 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034 an error occurred; then an exception is raised. */
1035
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001036static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001037setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 struct addrinfo hints, *res;
1040 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1043 if (name[0] == '\0') {
1044 int siz;
1045 memset(&hints, 0, sizeof(hints));
1046 hints.ai_family = af;
1047 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1048 hints.ai_flags = AI_PASSIVE;
1049 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 error = getaddrinfo(NULL, "0", &hints, &res);
1051 Py_END_ALLOW_THREADS
1052 /* We assume that those thread-unsafe getaddrinfo() versions
1053 *are* safe regarding their return value, ie. that a
1054 subsequent call to getaddrinfo() does not destroy the
1055 outcome of the first call. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 if (error) {
1057 set_gaierror(error);
1058 return -1;
1059 }
1060 switch (res->ai_family) {
1061 case AF_INET:
1062 siz = 4;
1063 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001064#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case AF_INET6:
1066 siz = 16;
1067 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 default:
1070 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 "unsupported address family");
1073 return -1;
1074 }
1075 if (res->ai_next) {
1076 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001077 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 "wildcard resolved to multiple address");
1079 return -1;
1080 }
1081 if (res->ai_addrlen < addr_ret_size)
1082 addr_ret_size = res->ai_addrlen;
1083 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1084 freeaddrinfo(res);
1085 return siz;
1086 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001087 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001088 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001089 if (strcmp(name, "255.255.255.255") == 0 ||
1090 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 struct sockaddr_in *sin;
1092 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001093 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 "address family mismatched");
1095 return -1;
1096 }
1097 sin = (struct sockaddr_in *)addr_ret;
1098 memset((void *) sin, '\0', sizeof(*sin));
1099 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001100#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 sin->sin_addr.s_addr = INADDR_BROADCAST;
1104 return sizeof(sin->sin_addr);
1105 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001106
1107 /* avoid a name resolution in case of numeric address */
1108#ifdef HAVE_INET_PTON
1109 /* check for an IPv4 address */
1110 if (af == AF_UNSPEC || af == AF_INET) {
1111 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1112 memset(sin, 0, sizeof(*sin));
1113 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1114 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001115#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001116 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001117#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001118 return 4;
1119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001121#ifdef ENABLE_IPV6
1122 /* check for an IPv6 address - if the address contains a scope ID, we
1123 * fallback to getaddrinfo(), which can handle translation from interface
1124 * name to interface index */
1125 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1126 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1127 memset(sin, 0, sizeof(*sin));
1128 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1129 sin->sin6_family = AF_INET6;
1130#ifdef HAVE_SOCKADDR_SA_LEN
1131 sin->sin6_len = sizeof(*sin);
1132#endif
1133 return 16;
1134 }
1135 }
1136#endif /* ENABLE_IPV6 */
1137#else /* HAVE_INET_PTON */
1138 /* check for an IPv4 address */
1139 if (af == AF_INET || af == AF_UNSPEC) {
1140 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1141 memset(sin, 0, sizeof(*sin));
1142 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1143 sin->sin_family = AF_INET;
1144#ifdef HAVE_SOCKADDR_SA_LEN
1145 sin->sin_len = sizeof(*sin);
1146#endif
1147 return 4;
1148 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001149 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001150#endif /* HAVE_INET_PTON */
1151
1152 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 memset(&hints, 0, sizeof(hints));
1154 hints.ai_family = af;
1155 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001157#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (error == EAI_NONAME && af == AF_UNSPEC) {
1159 /* On Tru64 V5.1, numeric-to-addr conversion fails
1160 if no address family is given. Assume IPv4 for now.*/
1161 hints.ai_family = AF_INET;
1162 error = getaddrinfo(name, NULL, &hints, &res);
1163 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 if (error) {
1167 set_gaierror(error);
1168 return -1;
1169 }
1170 if (res->ai_addrlen < addr_ret_size)
1171 addr_ret_size = res->ai_addrlen;
1172 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1173 freeaddrinfo(res);
1174 switch (addr_ret->sa_family) {
1175 case AF_INET:
1176 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001177#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 case AF_INET6:
1179 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001182 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 return -1;
1184 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185}
1186
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187
Коренберг Марк7766b962018-02-13 00:47:42 +05001188/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189
Guido van Rossum73624e91994-10-10 17:59:00 +00001190static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001191make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001192{
Коренберг Марк7766b962018-02-13 00:47:42 +05001193 char buf[INET_ADDRSTRLEN];
1194 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1195 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 return NULL;
1197 }
1198 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199}
1200
Коренберг Марк7766b962018-02-13 00:47:42 +05001201#ifdef ENABLE_IPV6
1202/* Convert IPv6 sockaddr to a Python str. */
1203
1204static PyObject *
1205make_ipv6_addr(const struct sockaddr_in6 *addr)
1206{
1207 char buf[INET6_ADDRSTRLEN];
1208 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1209 PyErr_SetFromErrno(PyExc_OSError);
1210 return NULL;
1211 }
1212 return PyUnicode_FromString(buf);
1213}
1214#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001216#ifdef USE_BLUETOOTH
1217/* Convert a string representation of a Bluetooth address into a numeric
1218 address. Returns the length (6), or raises an exception and returns -1 if
1219 an error occurred. */
1220
1221static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001222setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 unsigned int b0, b1, b2, b3, b4, b5;
1225 char ch;
1226 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1229 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1230 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001231
1232#ifdef MS_WINDOWS
1233 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1234 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1235 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1236 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1237 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1238 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 bdaddr->b[0] = b0;
1241 bdaddr->b[1] = b1;
1242 bdaddr->b[2] = b2;
1243 bdaddr->b[3] = b3;
1244 bdaddr->b[4] = b4;
1245 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001246#endif
1247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 return 6;
1249 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001250 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 return -1;
1252 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001253}
1254
1255/* Create a string representation of the Bluetooth address. This is always a
1256 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1257 value (zero padded if necessary). */
1258
1259static PyObject *
1260makebdaddr(bdaddr_t *bdaddr)
1261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001263
Greg Bowser8fbece12019-08-02 16:29:52 -04001264#ifdef MS_WINDOWS
1265 int i;
1266 unsigned int octets[6];
1267
1268 for (i = 0; i < 6; ++i) {
1269 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1270 }
1271
1272 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1273 octets[5], octets[4], octets[3],
1274 octets[2], octets[1], octets[0]);
1275#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1277 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1278 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001279#endif
1280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001282}
1283#endif
1284
1285
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286/* Create an object representing the given socket address,
1287 suitable for passing it back to bind(), connect() etc.
1288 The family field of the sockaddr structure is inspected
1289 to determine what kind of address it really is. */
1290
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001292static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001293makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 if (addrlen == 0) {
1296 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001297 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 case AF_INET:
1303 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001304 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1305 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 PyObject *ret = NULL;
1307 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1309 Py_DECREF(addrobj);
1310 }
1311 return ret;
1312 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001313
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001314#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 case AF_UNIX:
1316 {
1317 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001318#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001319 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1320 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1321 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 }
1323 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 {
1326 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001327 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 }
1329 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001330#endif /* AF_UNIX */
1331
Martin v. Löwis11017b12006-01-14 18:12:57 +00001332#if defined(AF_NETLINK)
1333 case AF_NETLINK:
1334 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1336 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001337 }
1338#endif /* AF_NETLINK */
1339
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001340#if defined(AF_QIPCRTR)
1341 case AF_QIPCRTR:
1342 {
1343 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1344 return Py_BuildValue("II", a->sq_node, a->sq_port);
1345 }
1346#endif /* AF_QIPCRTR */
1347
caaveryeffc12f2017-09-06 18:18:10 -04001348#if defined(AF_VSOCK)
1349 case AF_VSOCK:
1350 {
1351 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1352 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1353 }
1354#endif /* AF_VSOCK */
1355
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001356#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 case AF_INET6:
1358 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001359 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1360 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 PyObject *ret = NULL;
1362 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001363 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 addrobj,
1365 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001366 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 a->sin6_scope_id);
1368 Py_DECREF(addrobj);
1369 }
1370 return ret;
1371 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001372#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001373
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001374#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 case AF_BLUETOOTH:
1376 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001377
Greg Bowser8fbece12019-08-02 16:29:52 -04001378#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 case BTPROTO_L2CAP:
1380 {
1381 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1382 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1383 PyObject *ret = NULL;
1384 if (addrobj) {
1385 ret = Py_BuildValue("Oi",
1386 addrobj,
1387 _BT_L2_MEMB(a, psm));
1388 Py_DECREF(addrobj);
1389 }
1390 return ret;
1391 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001392
Greg Bowser8fbece12019-08-02 16:29:52 -04001393#endif /* BTPROTO_L2CAP */
1394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 case BTPROTO_RFCOMM:
1396 {
1397 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1398 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1399 PyObject *ret = NULL;
1400 if (addrobj) {
1401 ret = Py_BuildValue("Oi",
1402 addrobj,
1403 _BT_RC_MEMB(a, channel));
1404 Py_DECREF(addrobj);
1405 }
1406 return ret;
1407 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001408
Greg Bowser8fbece12019-08-02 16:29:52 -04001409#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 case BTPROTO_HCI:
1411 {
1412 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001413#if defined(__NetBSD__) || defined(__DragonFly__)
1414 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001415#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 PyObject *ret = NULL;
1417 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1418 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001419#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001421
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001422#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 case BTPROTO_SCO:
1424 {
1425 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1426 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1427 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001428#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001429#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 default:
1432 PyErr_SetString(PyExc_ValueError,
1433 "Unknown Bluetooth protocol");
1434 return NULL;
1435 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001436#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001437
Antoine Pitroub156a462010-10-27 20:13:57 +00001438#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 case AF_PACKET:
1440 {
1441 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001442 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 struct ifreq ifr;
1444 /* need to look up interface name give index */
1445 if (a->sll_ifindex) {
1446 ifr.ifr_ifindex = a->sll_ifindex;
1447 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1448 ifname = ifr.ifr_name;
1449 }
1450 return Py_BuildValue("shbhy#",
1451 ifname,
1452 ntohs(a->sll_protocol),
1453 a->sll_pkttype,
1454 a->sll_hatype,
1455 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001456 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001458#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001459
Christian Heimes043d6f62008-01-07 17:19:16 +00001460#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 case AF_TIPC:
1462 {
1463 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1464 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1465 return Py_BuildValue("IIIII",
1466 a->addrtype,
1467 a->addr.nameseq.type,
1468 a->addr.nameseq.lower,
1469 a->addr.nameseq.upper,
1470 a->scope);
1471 } else if (a->addrtype == TIPC_ADDR_NAME) {
1472 return Py_BuildValue("IIIII",
1473 a->addrtype,
1474 a->addr.name.name.type,
1475 a->addr.name.name.instance,
1476 a->addr.name.name.instance,
1477 a->scope);
1478 } else if (a->addrtype == TIPC_ADDR_ID) {
1479 return Py_BuildValue("IIIII",
1480 a->addrtype,
1481 a->addr.id.node,
1482 a->addr.id.ref,
1483 0,
1484 a->scope);
1485 } else {
1486 PyErr_SetString(PyExc_ValueError,
1487 "Invalid address type");
1488 return NULL;
1489 }
1490 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001491#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001492
Serhiy Storchakad3187152017-11-09 18:00:38 +02001493#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001494 case AF_CAN:
1495 {
1496 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001497 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001498 struct ifreq ifr;
1499 /* need to look up interface name given index */
1500 if (a->can_ifindex) {
1501 ifr.ifr_ifindex = a->can_ifindex;
1502 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1503 ifname = ifr.ifr_name;
1504 }
1505
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001506 switch (proto) {
1507#ifdef CAN_ISOTP
1508 case CAN_ISOTP:
1509 {
1510 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1511 ifname,
1512 a->can_addr.tp.rx_id,
1513 a->can_addr.tp.tx_id);
1514 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001515#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07001516#ifdef CAN_J1939
1517 case CAN_J1939:
1518 {
1519 return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1520 ifname,
1521 a->can_addr.j1939.name,
1522 a->can_addr.j1939.pgn,
1523 a->can_addr.j1939.addr);
1524 }
1525#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001526 default:
1527 {
bggardner954900a2019-09-12 06:02:48 -04001528 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001529 ifname);
1530 }
1531 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001532 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001533#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001534
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001535#ifdef PF_SYSTEM
1536 case PF_SYSTEM:
1537 switch(proto) {
1538#ifdef SYSPROTO_CONTROL
1539 case SYSPROTO_CONTROL:
1540 {
1541 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1542 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1543 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001544#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001545 default:
1546 PyErr_SetString(PyExc_ValueError,
1547 "Invalid address type");
1548 return 0;
1549 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001550#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001551
Christian Heimesdffa3942016-09-05 23:54:41 +02001552#ifdef HAVE_SOCKADDR_ALG
1553 case AF_ALG:
1554 {
1555 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1556 return Py_BuildValue("s#s#HH",
1557 a->salg_type,
1558 strnlen((const char*)a->salg_type,
1559 sizeof(a->salg_type)),
1560 a->salg_name,
1561 strnlen((const char*)a->salg_name,
1562 sizeof(a->salg_name)),
1563 a->salg_feat,
1564 a->salg_mask);
1565 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001566#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 default:
1571 /* If we don't know the address family, don't raise an
1572 exception -- return it as an (int, bytes) tuple. */
1573 return Py_BuildValue("iy#",
1574 addr->sa_family,
1575 addr->sa_data,
1576 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579}
1580
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001581/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1582 (in particular, numeric IP addresses). */
1583struct maybe_idna {
1584 PyObject *obj;
1585 char *buf;
1586};
1587
1588static void
1589idna_cleanup(struct maybe_idna *data)
1590{
1591 Py_CLEAR(data->obj);
1592}
1593
1594static int
1595idna_converter(PyObject *obj, struct maybe_idna *data)
1596{
1597 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001598 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001599 if (obj == NULL) {
1600 idna_cleanup(data);
1601 return 1;
1602 }
1603 data->obj = NULL;
1604 len = -1;
1605 if (PyBytes_Check(obj)) {
1606 data->buf = PyBytes_AsString(obj);
1607 len = PyBytes_Size(obj);
1608 }
1609 else if (PyByteArray_Check(obj)) {
1610 data->buf = PyByteArray_AsString(obj);
1611 len = PyByteArray_Size(obj);
1612 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001613 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001614 if (PyUnicode_READY(obj) == -1) {
1615 return 0;
1616 }
1617 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001618 data->buf = PyUnicode_DATA(obj);
1619 len = PyUnicode_GET_LENGTH(obj);
1620 }
1621 else {
1622 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1623 if (!obj2) {
1624 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1625 return 0;
1626 }
1627 assert(PyBytes_Check(obj2));
1628 data->obj = obj2;
1629 data->buf = PyBytes_AS_STRING(obj2);
1630 len = PyBytes_GET_SIZE(obj2);
1631 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001632 }
1633 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001634 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001635 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001636 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001637 }
1638 if (strlen(data->buf) != len) {
1639 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001640 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001641 return 0;
1642 }
1643 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001644}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645
1646/* Parse a socket address argument according to the socket object's
1647 address family. Return 1 if the address was in the proper format,
1648 0 of not. The address is returned through addr_ret, its length
1649 through len_ret. */
1650
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001652getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001653 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001657#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 case AF_UNIX:
1659 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001660 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001661 int retval = 0;
1662
1663 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1664 allow embedded nulls on Linux. */
1665 if (PyUnicode_Check(args)) {
1666 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1667 return 0;
1668 }
1669 else
1670 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001671 if (!PyArg_Parse(args, "y*", &path)) {
1672 Py_DECREF(args);
1673 return retval;
1674 }
1675 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001676
Victor Stinnerd565fb92019-10-10 21:30:20 +02001677 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001678#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001679 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001681 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001682 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001684 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 }
1686 }
1687 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001688#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 {
1690 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001691 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001692 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001694 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001696 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 }
1698 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001699 memcpy(addr->sun_path, path.buf, path.len);
1700 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001701 retval = 1;
1702 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001703 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001704 Py_DECREF(args);
1705 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001707#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708
Martin v. Löwis11017b12006-01-14 18:12:57 +00001709#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 case AF_NETLINK:
1711 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001713 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 if (!PyTuple_Check(args)) {
1715 PyErr_Format(
1716 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001717 "%s(): AF_NETLINK address must be tuple, not %.500s",
1718 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 return 0;
1720 }
Oren Milman735171e2018-09-11 19:51:29 +03001721 if (!PyArg_ParseTuple(args,
1722 "II;AF_NETLINK address must be a pair "
1723 "(pid, groups)",
1724 &pid, &groups))
1725 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 addr->nl_family = AF_NETLINK;
1729 addr->nl_pid = pid;
1730 addr->nl_groups = groups;
1731 *len_ret = sizeof(*addr);
1732 return 1;
1733 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001734#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001735
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001736#if defined(AF_QIPCRTR)
1737 case AF_QIPCRTR:
1738 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001739 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001740 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001741 if (!PyTuple_Check(args)) {
1742 PyErr_Format(
1743 PyExc_TypeError,
1744 "getsockaddrarg: "
1745 "AF_QIPCRTR address must be tuple, not %.500s",
1746 Py_TYPE(args)->tp_name);
1747 return 0;
1748 }
1749 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1750 return 0;
1751 addr->sq_family = AF_QIPCRTR;
1752 addr->sq_node = node;
1753 addr->sq_port = port;
1754 *len_ret = sizeof(*addr);
1755 return 1;
1756 }
1757#endif /* AF_QIPCRTR */
1758
caaveryeffc12f2017-09-06 18:18:10 -04001759#if defined(AF_VSOCK)
1760 case AF_VSOCK:
1761 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001762 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001763 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001764 memset(addr, 0, sizeof(struct sockaddr_vm));
1765 if (!PyTuple_Check(args)) {
1766 PyErr_Format(
1767 PyExc_TypeError,
1768 "getsockaddrarg: "
1769 "AF_VSOCK address must be tuple, not %.500s",
1770 Py_TYPE(args)->tp_name);
1771 return 0;
1772 }
1773 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1774 return 0;
1775 addr->svm_family = s->sock_family;
1776 addr->svm_port = port;
1777 addr->svm_cid = cid;
1778 *len_ret = sizeof(*addr);
1779 return 1;
1780 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001781#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001782
1783
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001784#ifdef AF_RDS
1785 case AF_RDS:
1786 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001787#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 case AF_INET:
1790 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001791 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 int port, result;
1793 if (!PyTuple_Check(args)) {
1794 PyErr_Format(
1795 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001796 "%s(): AF_INET address must be tuple, not %.500s",
1797 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 return 0;
1799 }
Oren Milman735171e2018-09-11 19:51:29 +03001800 if (!PyArg_ParseTuple(args,
1801 "O&i;AF_INET address must be a pair "
1802 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001803 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001804 {
1805 assert(PyErr_Occurred());
1806 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1807 PyErr_Format(PyExc_OverflowError,
1808 "%s(): port must be 0-65535.", caller);
1809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001811 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001812 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001813 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001815 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 if (result < 0)
1817 return 0;
1818 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001819 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001821 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 return 0;
1823 }
1824 addr->sin_family = AF_INET;
1825 addr->sin_port = htons((short)port);
1826 *len_ret = sizeof *addr;
1827 return 1;
1828 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001829
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001830#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 case AF_INET6:
1832 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001833 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001834 int port, result;
1835 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 flowinfo = scope_id = 0;
1837 if (!PyTuple_Check(args)) {
1838 PyErr_Format(
1839 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001840 "%s(): AF_INET6 address must be tuple, not %.500s",
1841 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 return 0;
1843 }
Oren Milman735171e2018-09-11 19:51:29 +03001844 if (!PyArg_ParseTuple(args,
1845 "O&i|II;AF_INET6 address must be a tuple "
1846 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001847 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001848 &scope_id))
1849 {
1850 assert(PyErr_Occurred());
1851 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1852 PyErr_Format(PyExc_OverflowError,
1853 "%s(): port must be 0-65535.", caller);
1854 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 return 0;
1856 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001857 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001858 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001860 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 if (result < 0)
1862 return 0;
1863 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001864 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001866 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 return 0;
1868 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001869 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001870 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001871 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001872 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001873 return 0;
1874 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 addr->sin6_family = s->sock_family;
1876 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001877 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 addr->sin6_scope_id = scope_id;
1879 *len_ret = sizeof *addr;
1880 return 1;
1881 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001882#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001883
Hye-Shik Chang81268602004-02-02 06:05:24 +00001884#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 case AF_BLUETOOTH:
1886 {
1887 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001888#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 case BTPROTO_L2CAP:
1890 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001891 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001892
Victor Stinnerd565fb92019-10-10 21:30:20 +02001893 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 memset(addr, 0, sizeof(struct sockaddr_l2));
1895 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1896 if (!PyArg_ParseTuple(args, "si", &straddr,
1897 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001898 PyErr_Format(PyExc_OSError,
1899 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 return 0;
1901 }
1902 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1903 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 *len_ret = sizeof *addr;
1906 return 1;
1907 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001908#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 case BTPROTO_RFCOMM:
1910 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001911 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001912 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1914 if (!PyArg_ParseTuple(args, "si", &straddr,
1915 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001916 PyErr_Format(PyExc_OSError,
1917 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 return 0;
1919 }
1920 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1921 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 *len_ret = sizeof *addr;
1924 return 1;
1925 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001926#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 case BTPROTO_HCI:
1928 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001929 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001930#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001931 const char *straddr;
1932 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1933 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001934 PyErr_Format(PyExc_OSError, "%s: "
1935 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001936 return 0;
1937 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001938 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001939 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1940 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001941#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1943 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001944 PyErr_Format(PyExc_OSError,
1945 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 return 0;
1947 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001948#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 *len_ret = sizeof *addr;
1950 return 1;
1951 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001952#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 case BTPROTO_SCO:
1954 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001955 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001956
Victor Stinnerd565fb92019-10-10 21:30:20 +02001957 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1959 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001960 PyErr_Format(PyExc_OSError,
1961 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 return 0;
1963 }
1964 straddr = PyBytes_AS_STRING(args);
1965 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1966 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 *len_ret = sizeof *addr;
1969 return 1;
1970 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001971#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001972#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 default:
Oren Milman735171e2018-09-11 19:51:29 +03001974 PyErr_Format(PyExc_OSError,
1975 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 return 0;
1977 }
1978 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001979#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001980
Antoine Pitroub156a462010-10-27 20:13:57 +00001981#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 case AF_PACKET:
1983 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001985 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 int protoNumber;
1987 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001988 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001989 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 if (!PyTuple_Check(args)) {
1992 PyErr_Format(
1993 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001994 "%s(): AF_PACKET address must be tuple, not %.500s",
1995 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 return 0;
1997 }
Oren Milman735171e2018-09-11 19:51:29 +03001998 /* XXX: improve the default error message according to the
1999 documentation of AF_PACKET, which would be added as part
2000 of bpo-25041. */
2001 if (!PyArg_ParseTuple(args,
2002 "si|iiy*;AF_PACKET address must be a tuple of "
2003 "two to five elements",
2004 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002005 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002006 {
2007 assert(PyErr_Occurred());
2008 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2009 PyErr_Format(PyExc_OverflowError,
2010 "%s(): address argument out of range", caller);
2011 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002013 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2015 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2016 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2017 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002018 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 return 0;
2020 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002021 if (haddr.buf && haddr.len > 8) {
2022 PyErr_SetString(PyExc_ValueError,
2023 "Hardware address must be 8 bytes or less");
2024 PyBuffer_Release(&haddr);
2025 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 }
2027 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002028 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002030 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002031 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 return 0;
2033 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002034 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 addr->sll_family = AF_PACKET;
2036 addr->sll_protocol = htons((short)protoNumber);
2037 addr->sll_ifindex = ifr.ifr_ifindex;
2038 addr->sll_pkttype = pkttype;
2039 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002040 if (haddr.buf) {
2041 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2042 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002044 else
2045 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002047 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 return 1;
2049 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002050#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002051
Christian Heimes043d6f62008-01-07 17:19:16 +00002052#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 case AF_TIPC:
2054 {
2055 unsigned int atype, v1, v2, v3;
2056 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (!PyTuple_Check(args)) {
2059 PyErr_Format(
2060 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002061 "%s(): AF_TIPC address must be tuple, not %.500s",
2062 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 return 0;
2064 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002067 "IIII|I;AF_TIPC address must be a tuple "
2068 "(addr_type, v1, v2, v3[, scope])",
2069 &atype, &v1, &v2, &v3, &scope))
2070 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002072 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002073
Victor Stinnerd565fb92019-10-10 21:30:20 +02002074 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 addr->family = AF_TIPC;
2078 addr->scope = scope;
2079 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 if (atype == TIPC_ADDR_NAMESEQ) {
2082 addr->addr.nameseq.type = v1;
2083 addr->addr.nameseq.lower = v2;
2084 addr->addr.nameseq.upper = v3;
2085 } else if (atype == TIPC_ADDR_NAME) {
2086 addr->addr.name.name.type = v1;
2087 addr->addr.name.name.instance = v2;
2088 } else if (atype == TIPC_ADDR_ID) {
2089 addr->addr.id.node = v1;
2090 addr->addr.id.ref = v2;
2091 } else {
2092 /* Shouldn't happen */
2093 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2094 return 0;
2095 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 return 1;
2100 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002101#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002102
Serhiy Storchakad3187152017-11-09 18:00:38 +02002103#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002104 case AF_CAN:
2105 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002106#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002107 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002108 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002109#endif
2110#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002111 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002112#endif
2113#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002114 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002115 PyObject *interfaceName;
2116 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002117 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002118 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002119
Oren Milman735171e2018-09-11 19:51:29 +03002120 if (!PyTuple_Check(args)) {
2121 PyErr_Format(PyExc_TypeError,
2122 "%s(): AF_CAN address must be tuple, not %.500s",
2123 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002124 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002125 }
2126 if (!PyArg_ParseTuple(args,
2127 "O&;AF_CAN address must be a tuple "
2128 "(interface, )",
2129 PyUnicode_FSConverter, &interfaceName))
2130 {
2131 return 0;
2132 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002133
2134 len = PyBytes_GET_SIZE(interfaceName);
2135
2136 if (len == 0) {
2137 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002138 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002139 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2140 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002141 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2142 s->errorhandler();
2143 Py_DECREF(interfaceName);
2144 return 0;
2145 }
2146 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002147 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002148 "AF_CAN interface name too long");
2149 Py_DECREF(interfaceName);
2150 return 0;
2151 }
2152
2153 addr->can_family = AF_CAN;
2154 addr->can_ifindex = ifr.ifr_ifindex;
2155
2156 *len_ret = sizeof(*addr);
2157 Py_DECREF(interfaceName);
2158 return 1;
2159 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002160#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002161
2162#ifdef CAN_ISOTP
2163 case CAN_ISOTP:
2164 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002165 PyObject *interfaceName;
2166 struct ifreq ifr;
2167 Py_ssize_t len;
2168 unsigned long int rx_id, tx_id;
2169
Victor Stinnerd565fb92019-10-10 21:30:20 +02002170 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002171
2172 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2173 &interfaceName,
2174 &rx_id,
2175 &tx_id))
2176 return 0;
2177
2178 len = PyBytes_GET_SIZE(interfaceName);
2179
2180 if (len == 0) {
2181 ifr.ifr_ifindex = 0;
2182 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2183 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2184 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2185 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2186 s->errorhandler();
2187 Py_DECREF(interfaceName);
2188 return 0;
2189 }
2190 } else {
2191 PyErr_SetString(PyExc_OSError,
2192 "AF_CAN interface name too long");
2193 Py_DECREF(interfaceName);
2194 return 0;
2195 }
2196
2197 addr->can_family = AF_CAN;
2198 addr->can_ifindex = ifr.ifr_ifindex;
2199 addr->can_addr.tp.rx_id = rx_id;
2200 addr->can_addr.tp.tx_id = tx_id;
2201
2202 *len_ret = sizeof(*addr);
2203 Py_DECREF(interfaceName);
2204 return 1;
2205 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002206#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002207#ifdef CAN_J1939
2208 case CAN_J1939:
2209 {
2210 PyObject *interfaceName;
2211 struct ifreq ifr;
2212 Py_ssize_t len;
2213 uint64_t j1939_name;
2214 uint32_t j1939_pgn;
2215 uint8_t j1939_addr;
2216
2217 struct sockaddr_can *addr = &addrbuf->can;
2218
2219 if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2220 &interfaceName,
2221 &j1939_name,
2222 &j1939_pgn,
2223 &j1939_addr))
2224 return 0;
2225
2226 len = PyBytes_GET_SIZE(interfaceName);
2227
2228 if (len == 0) {
2229 ifr.ifr_ifindex = 0;
2230 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2231 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2232 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2233 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2234 s->errorhandler();
2235 Py_DECREF(interfaceName);
2236 return 0;
2237 }
2238 } else {
2239 PyErr_SetString(PyExc_OSError,
2240 "AF_CAN interface name too long");
2241 Py_DECREF(interfaceName);
2242 return 0;
2243 }
2244
2245 addr->can_family = AF_CAN;
2246 addr->can_ifindex = ifr.ifr_ifindex;
2247 addr->can_addr.j1939.name = j1939_name;
2248 addr->can_addr.j1939.pgn = j1939_pgn;
2249 addr->can_addr.j1939.addr = j1939_addr;
2250
2251 *len_ret = sizeof(*addr);
2252 Py_DECREF(interfaceName);
2253 return 1;
2254 }
2255#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002256 default:
Oren Milman735171e2018-09-11 19:51:29 +03002257 PyErr_Format(PyExc_OSError,
2258 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002259 return 0;
2260 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002261#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002262
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002263#ifdef PF_SYSTEM
2264 case PF_SYSTEM:
2265 switch (s->sock_proto) {
2266#ifdef SYSPROTO_CONTROL
2267 case SYSPROTO_CONTROL:
2268 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002269 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002270 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002271 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002272
2273 if (PyUnicode_Check(args)) {
2274 struct ctl_info info;
2275 PyObject *ctl_name;
2276
2277 if (!PyArg_Parse(args, "O&",
2278 PyUnicode_FSConverter, &ctl_name)) {
2279 return 0;
2280 }
2281
Victor Stinnerf50e1872015-03-20 11:32:24 +01002282 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002283 PyErr_SetString(PyExc_ValueError,
2284 "provided string is too long");
2285 Py_DECREF(ctl_name);
2286 return 0;
2287 }
2288 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2289 sizeof(info.ctl_name));
2290 Py_DECREF(ctl_name);
2291
2292 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2293 PyErr_SetString(PyExc_OSError,
2294 "cannot find kernel control with provided name");
2295 return 0;
2296 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002297
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002298 addr->sc_id = info.ctl_id;
2299 addr->sc_unit = 0;
2300 } else if (!PyArg_ParseTuple(args, "II",
2301 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002302 PyErr_Format(PyExc_TypeError,
2303 "%s(): PF_SYSTEM address must be a str or "
2304 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002305 return 0;
2306 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002307
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002308 *len_ret = sizeof(*addr);
2309 return 1;
2310 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002311#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002312 default:
Oren Milman735171e2018-09-11 19:51:29 +03002313 PyErr_Format(PyExc_OSError,
2314 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002315 return 0;
2316 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002317#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002318#ifdef HAVE_SOCKADDR_ALG
2319 case AF_ALG:
2320 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002321 const char *type;
2322 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002323 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002324
2325 memset(sa, 0, sizeof(*sa));
2326 sa->salg_family = AF_ALG;
2327
Oren Milman735171e2018-09-11 19:51:29 +03002328 if (!PyTuple_Check(args)) {
2329 PyErr_Format(PyExc_TypeError,
2330 "%s(): AF_ALG address must be tuple, not %.500s",
2331 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002332 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002333 }
2334 if (!PyArg_ParseTuple(args,
2335 "ss|HH;AF_ALG address must be a tuple "
2336 "(type, name[, feat[, mask]])",
2337 &type, &name, &sa->salg_feat, &sa->salg_mask))
2338 {
2339 return 0;
2340 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002341 /* sockaddr_alg has fixed-sized char arrays for type, and name
2342 * both must be NULL terminated.
2343 */
2344 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002345 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2346 return 0;
2347 }
2348 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002349 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002350 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2351 return 0;
2352 }
2353 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2354
2355 *len_ret = sizeof(*sa);
2356 return 1;
2357 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002358#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 default:
Oren Milman735171e2018-09-11 19:51:29 +03002363 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002367}
2368
Guido van Rossum30a685f1991-06-27 15:51:29 +00002369
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002371 Return 1 if the family is known, 0 otherwise. The length is returned
2372 through len_ret. */
2373
2374static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002375getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002378
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002379#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 case AF_UNIX:
2381 {
2382 *len_ret = sizeof (struct sockaddr_un);
2383 return 1;
2384 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002385#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002386
Martin v. Löwis11017b12006-01-14 18:12:57 +00002387#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002388 case AF_NETLINK:
2389 {
2390 *len_ret = sizeof (struct sockaddr_nl);
2391 return 1;
2392 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002393#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002394
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002395#if defined(AF_QIPCRTR)
2396 case AF_QIPCRTR:
2397 {
2398 *len_ret = sizeof (struct sockaddr_qrtr);
2399 return 1;
2400 }
2401#endif /* AF_QIPCRTR */
2402
caaveryeffc12f2017-09-06 18:18:10 -04002403#if defined(AF_VSOCK)
2404 case AF_VSOCK:
2405 {
2406 *len_ret = sizeof (struct sockaddr_vm);
2407 return 1;
2408 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002409#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002410
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002411#ifdef AF_RDS
2412 case AF_RDS:
2413 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002414#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 case AF_INET:
2417 {
2418 *len_ret = sizeof (struct sockaddr_in);
2419 return 1;
2420 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002421
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002422#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 case AF_INET6:
2424 {
2425 *len_ret = sizeof (struct sockaddr_in6);
2426 return 1;
2427 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002428#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002429
Hye-Shik Chang81268602004-02-02 06:05:24 +00002430#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 case AF_BLUETOOTH:
2432 {
2433 switch(s->sock_proto)
2434 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002435
Greg Bowser8fbece12019-08-02 16:29:52 -04002436#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 case BTPROTO_L2CAP:
2438 *len_ret = sizeof (struct sockaddr_l2);
2439 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002440#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 case BTPROTO_RFCOMM:
2442 *len_ret = sizeof (struct sockaddr_rc);
2443 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002444#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 case BTPROTO_HCI:
2446 *len_ret = sizeof (struct sockaddr_hci);
2447 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002448#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 case BTPROTO_SCO:
2450 *len_ret = sizeof (struct sockaddr_sco);
2451 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002452#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002453#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002455 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 "unknown BT protocol");
2457 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 }
2460 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002461#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002462
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002463#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 case AF_PACKET:
2465 {
2466 *len_ret = sizeof (struct sockaddr_ll);
2467 return 1;
2468 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002469#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002470
Christian Heimes043d6f62008-01-07 17:19:16 +00002471#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 case AF_TIPC:
2473 {
2474 *len_ret = sizeof (struct sockaddr_tipc);
2475 return 1;
2476 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002477#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002478
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002479#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002480 case AF_CAN:
2481 {
2482 *len_ret = sizeof (struct sockaddr_can);
2483 return 1;
2484 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002485#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002486
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002487#ifdef PF_SYSTEM
2488 case PF_SYSTEM:
2489 switch(s->sock_proto) {
2490#ifdef SYSPROTO_CONTROL
2491 case SYSPROTO_CONTROL:
2492 *len_ret = sizeof (struct sockaddr_ctl);
2493 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002494#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002495 default:
2496 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2497 "unknown PF_SYSTEM protocol");
2498 return 0;
2499 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002500#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002501#ifdef HAVE_SOCKADDR_ALG
2502 case AF_ALG:
2503 {
2504 *len_ret = sizeof (struct sockaddr_alg);
2505 return 1;
2506 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002507#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002512 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002516}
2517
2518
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002519/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2520 Currently, these methods are only compiled if the RFC 2292/3542
2521 CMSG_LEN() macro is available. Older systems seem to have used
2522 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2523 it may be possible to define CMSG_LEN() that way if it's not
2524 provided. Some architectures might need extra padding after the
2525 cmsghdr, however, and CMSG_LEN() would have to take account of
2526 this. */
2527#ifdef CMSG_LEN
2528/* If length is in range, set *result to CMSG_LEN(length) and return
2529 true; otherwise, return false. */
2530static int
2531get_CMSG_LEN(size_t length, size_t *result)
2532{
2533 size_t tmp;
2534
2535 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2536 return 0;
2537 tmp = CMSG_LEN(length);
2538 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2539 return 0;
2540 *result = tmp;
2541 return 1;
2542}
2543
2544#ifdef CMSG_SPACE
2545/* If length is in range, set *result to CMSG_SPACE(length) and return
2546 true; otherwise, return false. */
2547static int
2548get_CMSG_SPACE(size_t length, size_t *result)
2549{
2550 size_t tmp;
2551
2552 /* Use CMSG_SPACE(1) here in order to take account of the padding
2553 necessary before *and* after the data. */
2554 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2555 return 0;
2556 tmp = CMSG_SPACE(length);
2557 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2558 return 0;
2559 *result = tmp;
2560 return 1;
2561}
2562#endif
2563
2564/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2565 pointer in msg->msg_control with at least "space" bytes after it,
2566 and its cmsg_len member inside the buffer. */
2567static int
2568cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2569{
2570 size_t cmsg_offset;
2571 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2572 sizeof(cmsgh->cmsg_len));
2573
Charles-François Natali466517d2011-08-28 18:23:43 +02002574 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002575 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002576 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002577 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2578 annoying under OS X as it's unsigned there and so it triggers a
2579 tautological comparison warning under Clang when compared against 0.
2580 Since the check is valid on other platforms, silence the warning under
2581 Clang. */
2582 #ifdef __clang__
2583 #pragma clang diagnostic push
2584 #pragma clang diagnostic ignored "-Wtautological-compare"
2585 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002586 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002587 #pragma GCC diagnostic push
2588 #pragma GCC diagnostic ignored "-Wtype-limits"
2589 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002590 if (msg->msg_controllen < 0)
2591 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002592 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002593 #pragma GCC diagnostic pop
2594 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002595 #ifdef __clang__
2596 #pragma clang diagnostic pop
2597 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002598 if (space < cmsg_len_end)
2599 space = cmsg_len_end;
2600 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2601 return (cmsg_offset <= (size_t)-1 - space &&
2602 cmsg_offset + space <= msg->msg_controllen);
2603}
2604
2605/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2606 *space to number of bytes following it in the buffer and return
2607 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2608 msg->msg_controllen are valid. */
2609static int
2610get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2611{
2612 size_t data_offset;
2613 char *data_ptr;
2614
2615 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2616 return 0;
2617 data_offset = data_ptr - (char *)msg->msg_control;
2618 if (data_offset > msg->msg_controllen)
2619 return 0;
2620 *space = msg->msg_controllen - data_offset;
2621 return 1;
2622}
2623
2624/* If cmsgh is invalid or not contained in the buffer pointed to by
2625 msg->msg_control, return -1. If cmsgh is valid and its associated
2626 data is entirely contained in the buffer, set *data_len to the
2627 length of the associated data and return 0. If only part of the
2628 associated data is contained in the buffer but cmsgh is otherwise
2629 valid, set *data_len to the length contained in the buffer and
2630 return 1. */
2631static int
2632get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2633{
2634 size_t space, cmsg_data_len;
2635
2636 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2637 cmsgh->cmsg_len < CMSG_LEN(0))
2638 return -1;
2639 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2640 if (!get_cmsg_data_space(msg, cmsgh, &space))
2641 return -1;
2642 if (space >= cmsg_data_len) {
2643 *data_len = cmsg_data_len;
2644 return 0;
2645 }
2646 *data_len = space;
2647 return 1;
2648}
2649#endif /* CMSG_LEN */
2650
2651
Victor Stinner31bf2d52015-04-01 21:57:09 +02002652struct sock_accept {
2653 socklen_t *addrlen;
2654 sock_addr_t *addrbuf;
2655 SOCKET_T result;
2656};
2657
2658#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2659/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2660static int accept4_works = -1;
2661#endif
2662
2663static int
2664sock_accept_impl(PySocketSockObject *s, void *data)
2665{
2666 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002667 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2668 socklen_t *paddrlen = ctx->addrlen;
2669#ifdef HAVE_SOCKADDR_ALG
2670 /* AF_ALG does not support accept() with addr and raises
2671 * ECONNABORTED instead. */
2672 if (s->sock_family == AF_ALG) {
2673 addr = NULL;
2674 paddrlen = NULL;
2675 *ctx->addrlen = 0;
2676 }
2677#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002678
2679#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2680 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002681 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002682 SOCK_CLOEXEC);
2683 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2684 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2685 accept4_works = (errno != ENOSYS);
2686 }
2687 }
2688 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002689 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002690#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002691 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002692#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002693
2694#ifdef MS_WINDOWS
2695 return (ctx->result != INVALID_SOCKET);
2696#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002697 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002698#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002699}
2700
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002701/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002702
Guido van Rossum73624e91994-10-10 17:59:00 +00002703static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302704sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002707 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 socklen_t addrlen;
2709 PyObject *sock = NULL;
2710 PyObject *addr = NULL;
2711 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002712 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 if (!getsockaddrlen(s, &addrlen))
2715 return NULL;
2716 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 if (!IS_SELECTABLE(s))
2719 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002720
Victor Stinner31bf2d52015-04-01 21:57:09 +02002721 ctx.addrlen = &addrlen;
2722 ctx.addrbuf = &addrbuf;
2723 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002725 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002726
Victor Stinnerdaf45552013-08-28 00:53:59 +02002727#ifdef MS_WINDOWS
2728 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2729 PyErr_SetFromWindowsErr(0);
2730 SOCKETCLOSE(newfd);
2731 goto finally;
2732 }
2733#else
2734
2735#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2736 if (!accept4_works)
2737#endif
2738 {
2739 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2740 SOCKETCLOSE(newfd);
2741 goto finally;
2742 }
2743 }
2744#endif
2745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 sock = PyLong_FromSocket_t(newfd);
2747 if (sock == NULL) {
2748 SOCKETCLOSE(newfd);
2749 goto finally;
2750 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2753 addrlen, s->sock_proto);
2754 if (addr == NULL)
2755 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002758
Guido van Rossum67f7a382002-06-06 21:08:16 +00002759finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 Py_XDECREF(sock);
2761 Py_XDECREF(addr);
2762 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002763}
2764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002765PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002766"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002767\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002768Wait for an incoming connection. Return a new socket file descriptor\n\
2769representing the connection, and the address of the client.\n\
2770For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002771
Guido van Rossum11ba0942002-06-13 15:07:44 +00002772/* s.setblocking(flag) method. Argument:
2773 False -- non-blocking mode; same as settimeout(0)
2774 True -- blocking mode; same as settimeout(None)
2775*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002776
Guido van Rossum73624e91994-10-10 17:59:00 +00002777static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002778sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002779{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002780 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 block = PyLong_AsLong(arg);
2783 if (block == -1 && PyErr_Occurred())
2784 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002785
Victor Stinner9001d802015-04-06 23:06:01 +02002786 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002787 if (internal_setblocking(s, block) == -1) {
2788 return NULL;
2789 }
2790 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002791}
Guido van Rossume4485b01994-09-07 14:32:49 +00002792
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002793PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002794"setblocking(flag)\n\
2795\n\
2796Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002797setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799
Yury Selivanovf11b4602018-01-28 17:27:38 -05002800/* s.getblocking() method.
2801 Returns True if socket is in blocking mode,
2802 False if it is in non-blocking mode.
2803*/
2804static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302805sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002806{
2807 if (s->sock_timeout) {
2808 Py_RETURN_TRUE;
2809 }
2810 else {
2811 Py_RETURN_FALSE;
2812 }
2813}
2814
2815PyDoc_STRVAR(getblocking_doc,
2816"getblocking()\n\
2817\n\
2818Returns True if socket is in blocking mode, or False if it\n\
2819is in non-blocking mode.");
2820
Victor Stinner71694d52015-03-28 01:18:54 +01002821static int
2822socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2823{
2824#ifdef MS_WINDOWS
2825 struct timeval tv;
2826#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002827#ifndef HAVE_POLL
2828 _PyTime_t ms;
2829#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002830 int overflow = 0;
2831
2832 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002833 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002834 return 0;
2835 }
2836
Victor Stinner869e1772015-03-30 03:49:14 +02002837 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002838 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002839 return -1;
2840
2841 if (*timeout < 0) {
2842 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2843 return -1;
2844 }
2845
2846#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002847 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002848#endif
2849#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002850 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002851 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002852#endif
2853 if (overflow) {
2854 PyErr_SetString(PyExc_OverflowError,
2855 "timeout doesn't fit into C timeval");
2856 return -1;
2857 }
2858
2859 return 0;
2860}
2861
Guido van Rossum11ba0942002-06-13 15:07:44 +00002862/* s.settimeout(timeout) method. Argument:
2863 None -- no timeout, blocking mode; same as setblocking(True)
2864 0.0 -- non-blocking mode; same as setblocking(False)
2865 > 0 -- timeout mode; operations time out after timeout seconds
2866 < 0 -- illegal; raises an exception
2867*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002868static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002869sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002870{
Victor Stinner71694d52015-03-28 01:18:54 +01002871 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Victor Stinner71694d52015-03-28 01:18:54 +01002873 if (socket_parse_timeout(&timeout, arg) < 0)
2874 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002877
2878 int block = timeout < 0;
2879 /* Blocking mode for a Python socket object means that operations
2880 like :meth:`recv` or :meth:`sendall` will block the execution of
2881 the current thread until they are complete or aborted with a
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002882 `TimeoutError` or `socket.error` errors. When timeout is `None`,
Yury Selivanovf11b4602018-01-28 17:27:38 -05002883 the underlying FD is in a blocking mode. When timeout is a positive
2884 number, the FD is in a non-blocking mode, and socket ops are
2885 implemented with a `select()` call.
2886
2887 When timeout is 0.0, the FD is in a non-blocking mode.
2888
2889 This table summarizes all states in which the socket object and
2890 its underlying FD can be:
2891
2892 ==================== ===================== ==============
2893 `gettimeout()` `getblocking()` FD
2894 ==================== ===================== ==============
2895 ``None`` ``True`` blocking
2896 ``0.0`` ``False`` non-blocking
2897 ``> 0`` ``True`` non-blocking
2898 */
2899
2900 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002901 return NULL;
2902 }
2903 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002904}
2905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002907"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002908\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002909Set a timeout on socket operations. 'timeout' can be a float,\n\
2910giving in seconds, or None. Setting a timeout of None disables\n\
2911the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002912Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002913
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002914/* s.gettimeout() method.
2915 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002916static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302917sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002918{
Victor Stinner71694d52015-03-28 01:18:54 +01002919 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002920 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 }
Victor Stinner71694d52015-03-28 01:18:54 +01002922 else {
2923 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2924 return PyFloat_FromDouble(seconds);
2925 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002926}
2927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002928PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002929"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002930\n\
oldkaa0735f2018-02-02 16:52:55 +08002931Returns the timeout in seconds (float) associated with socket\n\
2932operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002933operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002934
Guido van Rossumaee08791992-09-08 09:05:33 +00002935/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002936 With an integer third argument, sets an integer optval with optlen=4.
2937 With None as third argument and an integer fourth argument, set
2938 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002939 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002940 use optional built-in module 'struct' to encode the string.
2941*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002942
Guido van Rossum73624e91994-10-10 17:59:00 +00002943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002944sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 int level;
2947 int optname;
2948 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002949 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002951 unsigned int optlen;
2952 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002953
caaveryeffc12f2017-09-06 18:18:10 -04002954#ifdef AF_VSOCK
2955 if (s->sock_family == AF_VSOCK) {
2956 uint64_t vflag; // Must be set width of 64 bits
2957 /* setsockopt(level, opt, flag) */
2958 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2959 &level, &optname, &vflag)) {
2960 // level should always be set to AF_VSOCK
2961 res = setsockopt(s->sock_fd, level, optname,
2962 (void*)&vflag, sizeof vflag);
2963 goto done;
2964 }
2965 return NULL;
2966 }
2967#endif
2968
Christian Heimesdffa3942016-09-05 23:54:41 +02002969 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 if (PyArg_ParseTuple(args, "iii:setsockopt",
2971 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002972 res = setsockopt(s->sock_fd, level, optname,
2973 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002974 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002976
2977 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002978 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002979 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2980 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2981 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002982 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002983 NULL, (socklen_t)optlen);
2984 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002986
2987 PyErr_Clear();
2988 /* setsockopt(level, opt, buffer) */
2989 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2990 &level, &optname, &optval))
2991 return NULL;
2992
2993#ifdef MS_WINDOWS
2994 if (optval.len > INT_MAX) {
2995 PyBuffer_Release(&optval);
2996 PyErr_Format(PyExc_OverflowError,
2997 "socket option is larger than %i bytes",
2998 INT_MAX);
2999 return NULL;
3000 }
3001 res = setsockopt(s->sock_fd, level, optname,
3002 optval.buf, (int)optval.len);
3003#else
3004 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3005#endif
3006 PyBuffer_Release(&optval);
3007
3008done:
Victor Stinnercc739322016-03-23 21:35:29 +01003009 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003011 }
3012
3013 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003014}
3015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003016PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003017"setsockopt(level, option, value: int)\n\
3018setsockopt(level, option, value: buffer)\n\
3019setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003020\n\
3021Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003022The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003023None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003024
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003025
Guido van Rossumaee08791992-09-08 09:05:33 +00003026/* s.getsockopt() method.
3027 With two arguments, retrieves an integer option.
3028 With a third integer argument, retrieves a string buffer of that size;
3029 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003030
Guido van Rossum73624e91994-10-10 17:59:00 +00003031static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003032sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 int level;
3035 int optname;
3036 int res;
3037 PyObject *buf;
3038 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003039 int flag = 0;
3040 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3043 &level, &optname, &buflen))
3044 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003047#ifdef AF_VSOCK
3048 if (s->sock_family == AF_VSOCK) {
3049 uint64_t vflag = 0; // Must be set width of 64 bits
3050 flagsize = sizeof vflag;
3051 res = getsockopt(s->sock_fd, level, optname,
3052 (void *)&vflag, &flagsize);
3053 if (res < 0)
3054 return s->errorhandler();
3055 return PyLong_FromUnsignedLong(vflag);
3056 }
3057#endif
3058 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 res = getsockopt(s->sock_fd, level, optname,
3060 (void *)&flag, &flagsize);
3061 if (res < 0)
3062 return s->errorhandler();
3063 return PyLong_FromLong(flag);
3064 }
caaveryeffc12f2017-09-06 18:18:10 -04003065#ifdef AF_VSOCK
3066 if (s->sock_family == AF_VSOCK) {
3067 PyErr_SetString(PyExc_OSError,
3068 "getsockopt string buffer not allowed");
3069 return NULL;
3070 }
3071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003073 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 "getsockopt buflen out of range");
3075 return NULL;
3076 }
3077 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3078 if (buf == NULL)
3079 return NULL;
3080 res = getsockopt(s->sock_fd, level, optname,
3081 (void *)PyBytes_AS_STRING(buf), &buflen);
3082 if (res < 0) {
3083 Py_DECREF(buf);
3084 return s->errorhandler();
3085 }
3086 _PyBytes_Resize(&buf, buflen);
3087 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003088}
3089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003090PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003091"getsockopt(level, option[, buffersize]) -> value\n\
3092\n\
3093Get a socket option. See the Unix manual for level and option.\n\
3094If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003095string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003097
Fred Drake728819a2000-07-01 03:40:12 +00003098/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003099
Guido van Rossum73624e91994-10-10 17:59:00 +00003100static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003101sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 sock_addr_t addrbuf;
3104 int addrlen;
3105 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003106
Victor Stinnerd565fb92019-10-10 21:30:20 +02003107 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003109 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003110
3111 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3112 return NULL;
3113 }
3114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 Py_BEGIN_ALLOW_THREADS
3116 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3117 Py_END_ALLOW_THREADS
3118 if (res < 0)
3119 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003120 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003121}
3122
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003124"bind(address)\n\
3125\n\
3126Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003127pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003128sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003129
Guido van Rossum30a685f1991-06-27 15:51:29 +00003130
3131/* s.close() method.
3132 Set the file descriptor to -1 so operations tried subsequently
3133 will surely fail. */
3134
Guido van Rossum73624e91994-10-10 17:59:00 +00003135static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303136sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003139 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003140
Victor Stinner19a8e842016-03-21 16:36:48 +01003141 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003142 if (fd != INVALID_SOCKET) {
3143 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003144
3145 /* We do not want to retry upon EINTR: see
3146 http://lwn.net/Articles/576478/ and
3147 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3148 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003150 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003152 /* bpo-30319: The peer can already have closed the connection.
3153 Python ignores ECONNRESET on close(). */
3154 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003155 return s->errorhandler();
3156 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003158 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003159}
3160
Christian Heimesd0e31b92018-01-27 09:54:13 +01003161PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003162"close()\n\
3163\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003164Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003165
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003166static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303167sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003168{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003169 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003170 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003171 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003172}
3173
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003174PyDoc_STRVAR(detach_doc,
3175"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003176\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003177Close the socket object without closing the underlying file descriptor.\n\
3178The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003179can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003180
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003181static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003182sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003183{
Victor Stinner81c41db2015-04-02 11:50:57 +02003184 int err;
3185 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003186
Victor Stinner81c41db2015-04-02 11:50:57 +02003187 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3188 /* getsockopt() failed */
3189 return 0;
3190 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003191
Victor Stinner81c41db2015-04-02 11:50:57 +02003192 if (err == EISCONN)
3193 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003194 if (err != 0) {
3195 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3196 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003197 return 0;
3198 }
3199 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003200}
3201
3202static int
3203internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3204 int raise)
3205{
3206 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003207
3208 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003210 Py_END_ALLOW_THREADS
3211
Victor Stinner70a46f62015-03-31 22:03:59 +02003212 if (!res) {
3213 /* connect() succeeded, the socket is connected */
3214 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003216
Victor Stinner81c41db2015-04-02 11:50:57 +02003217 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003218
Victor Stinner81c41db2015-04-02 11:50:57 +02003219 /* save error, PyErr_CheckSignals() can replace it */
3220 err = GET_SOCK_ERROR;
3221 if (CHECK_ERRNO(EINTR)) {
3222 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003223 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003224
3225 /* Issue #23618: when connect() fails with EINTR, the connection is
3226 running asynchronously.
3227
3228 If the socket is blocking or has a timeout, wait until the
3229 connection completes, fails or timed out using select(), and then
3230 get the connection status using getsockopt(SO_ERROR).
3231
3232 If the socket is non-blocking, raise InterruptedError. The caller is
3233 responsible to wait until the connection completes, fails or timed
3234 out (it's the case in asyncio for example). */
3235 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3236 }
3237 else {
3238 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3239 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003240 }
3241
Victor Stinner81c41db2015-04-02 11:50:57 +02003242 if (!wait_connect) {
3243 if (raise) {
3244 /* restore error, maybe replaced by PyErr_CheckSignals() */
3245 SET_SOCK_ERROR(err);
3246 s->errorhandler();
3247 return -1;
3248 }
3249 else
3250 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003251 }
3252
Victor Stinner81c41db2015-04-02 11:50:57 +02003253 if (raise) {
3254 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003255 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3256 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003257 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003258 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003259 else {
3260 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003261 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3262 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003263 return err;
3264 }
3265 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003266}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003267
Fred Drake728819a2000-07-01 03:40:12 +00003268/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003269
Guido van Rossum73624e91994-10-10 17:59:00 +00003270static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003271sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 sock_addr_t addrbuf;
3274 int addrlen;
3275 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003276
Victor Stinnerd565fb92019-10-10 21:30:20 +02003277 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003279 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003280
Steve Dowerb82e17e2019-05-23 08:45:22 -07003281 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3282 return NULL;
3283 }
3284
Victor Stinner81c41db2015-04-02 11:50:57 +02003285 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003286 if (res < 0)
3287 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003288
Victor Stinneree699e92015-03-31 21:28:42 +02003289 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003290}
3291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293"connect(address)\n\
3294\n\
3295Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003296is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003297
Guido van Rossum30a685f1991-06-27 15:51:29 +00003298
Fred Drake728819a2000-07-01 03:40:12 +00003299/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003300
3301static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003302sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 sock_addr_t addrbuf;
3305 int addrlen;
3306 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003307
Victor Stinnerd565fb92019-10-10 21:30:20 +02003308 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003311
Steve Dowerb82e17e2019-05-23 08:45:22 -07003312 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3313 return NULL;
3314 }
3315
Victor Stinner81c41db2015-04-02 11:50:57 +02003316 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003317 if (res < 0)
3318 return NULL;
3319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003321}
3322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003323PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003324"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003325\n\
3326This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003327instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003328
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003329
Guido van Rossumed233a51992-06-23 09:07:03 +00003330/* s.fileno() method */
3331
Guido van Rossum73624e91994-10-10 17:59:00 +00003332static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303333sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003336}
3337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003338PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003339"fileno() -> integer\n\
3340\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003341Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003342
Guido van Rossumed233a51992-06-23 09:07:03 +00003343
Guido van Rossumc89705d1992-11-26 08:54:07 +00003344/* s.getsockname() method */
3345
Guido van Rossum73624e91994-10-10 17:59:00 +00003346static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303347sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 sock_addr_t addrbuf;
3350 int res;
3351 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 if (!getsockaddrlen(s, &addrlen))
3354 return NULL;
3355 memset(&addrbuf, 0, addrlen);
3356 Py_BEGIN_ALLOW_THREADS
3357 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3358 Py_END_ALLOW_THREADS
3359 if (res < 0)
3360 return s->errorhandler();
3361 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3362 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003363}
3364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003365PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003366"getsockname() -> address info\n\
3367\n\
3368Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003369info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003370
Guido van Rossumc89705d1992-11-26 08:54:07 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003373/* s.getpeername() method */
3374
Guido van Rossum73624e91994-10-10 17:59:00 +00003375static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303376sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 sock_addr_t addrbuf;
3379 int res;
3380 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 if (!getsockaddrlen(s, &addrlen))
3383 return NULL;
3384 memset(&addrbuf, 0, addrlen);
3385 Py_BEGIN_ALLOW_THREADS
3386 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3387 Py_END_ALLOW_THREADS
3388 if (res < 0)
3389 return s->errorhandler();
3390 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3391 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003392}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003394PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003395"getpeername() -> address info\n\
3396\n\
3397Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003398info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003399
Guido van Rossumb6775db1994-08-01 11:34:53 +00003400#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003401
3402
Guido van Rossum30a685f1991-06-27 15:51:29 +00003403/* s.listen(n) method */
3404
Guido van Rossum73624e91994-10-10 17:59:00 +00003405static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003406sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003407{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003408 /* We try to choose a default backlog high enough to avoid connection drops
3409 * for common workloads, yet not too high to limit resource usage. */
3410 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003412
Charles-François Natali644b8f52014-05-22 19:45:39 +01003413 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003417 /* To avoid problems on systems that don't allow a negative backlog
3418 * (which doesn't make sense anyway) we force a minimum value of 0. */
3419 if (backlog < 0)
3420 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 res = listen(s->sock_fd, backlog);
3422 Py_END_ALLOW_THREADS
3423 if (res < 0)
3424 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003425 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003426}
3427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003428PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003429"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003430\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003431Enable a server to accept connections. If backlog is specified, it must be\n\
3432at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003433unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003434connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003435
Victor Stinner31bf2d52015-04-01 21:57:09 +02003436struct sock_recv {
3437 char *cbuf;
3438 Py_ssize_t len;
3439 int flags;
3440 Py_ssize_t result;
3441};
3442
3443static int
3444sock_recv_impl(PySocketSockObject *s, void *data)
3445{
3446 struct sock_recv *ctx = data;
3447
3448#ifdef MS_WINDOWS
3449 if (ctx->len > INT_MAX)
3450 ctx->len = INT_MAX;
3451 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3452#else
3453 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3454#endif
3455 return (ctx->result >= 0);
3456}
3457
Guido van Rossum82a5c661998-07-07 20:45:43 +00003458
Thomas Wouters477c8d52006-05-27 19:21:47 +00003459/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003460 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003461 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003462 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003463 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003464 * also possible that we return a number of bytes smaller than the request
3465 * bytes.
3466 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003467
Antoine Pitrou19467d22010-08-17 19:33:30 +00003468static Py_ssize_t
3469sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003470{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003471 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 if (!IS_SELECTABLE(s)) {
3474 select_error();
3475 return -1;
3476 }
3477 if (len == 0) {
3478 /* If 0 bytes were requested, do nothing. */
3479 return 0;
3480 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003481
Victor Stinner31bf2d52015-04-01 21:57:09 +02003482 ctx.cbuf = cbuf;
3483 ctx.len = len;
3484 ctx.flags = flags;
3485 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003487
3488 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003489}
3490
Guido van Rossum48a680c2001-03-02 06:34:14 +00003491
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003492/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003493
Guido van Rossum73624e91994-10-10 17:59:00 +00003494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003495sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003496{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003497 Py_ssize_t recvlen, outlen;
3498 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003500
Antoine Pitrou19467d22010-08-17 19:33:30 +00003501 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 if (recvlen < 0) {
3505 PyErr_SetString(PyExc_ValueError,
3506 "negative buffersize in recv");
3507 return NULL;
3508 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 /* Allocate a new string. */
3511 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3512 if (buf == NULL)
3513 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 /* Call the guts */
3516 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3517 if (outlen < 0) {
3518 /* An error occurred, release the string and return an
3519 error. */
3520 Py_DECREF(buf);
3521 return NULL;
3522 }
3523 if (outlen != recvlen) {
3524 /* We did not read as many bytes as we anticipated, resize the
3525 string if possible and be successful. */
3526 _PyBytes_Resize(&buf, outlen);
3527 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003530}
3531
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003532PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003533"recv(buffersize[, flags]) -> data\n\
3534\n\
3535Receive up to buffersize bytes from the socket. For the optional flags\n\
3536argument, see the Unix manual. When no data is available, block until\n\
3537at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003538the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003539
Guido van Rossum30a685f1991-06-27 15:51:29 +00003540
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003541/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003542
Thomas Wouters477c8d52006-05-27 19:21:47 +00003543static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003544sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003547
Antoine Pitrou19467d22010-08-17 19:33:30 +00003548 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 Py_buffer pbuf;
3550 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003551 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003554 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 &pbuf, &recvlen, &flags))
3556 return NULL;
3557 buf = pbuf.buf;
3558 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 if (recvlen < 0) {
3561 PyBuffer_Release(&pbuf);
3562 PyErr_SetString(PyExc_ValueError,
3563 "negative buffersize in recv_into");
3564 return NULL;
3565 }
3566 if (recvlen == 0) {
3567 /* If nbytes was not specified, use the buffer's length */
3568 recvlen = buflen;
3569 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 /* Check if the buffer is large enough */
3572 if (buflen < recvlen) {
3573 PyBuffer_Release(&pbuf);
3574 PyErr_SetString(PyExc_ValueError,
3575 "buffer too small for requested bytes");
3576 return NULL;
3577 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 /* Call the guts */
3580 readlen = sock_recv_guts(s, buf, recvlen, flags);
3581 if (readlen < 0) {
3582 /* Return an error. */
3583 PyBuffer_Release(&pbuf);
3584 return NULL;
3585 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 PyBuffer_Release(&pbuf);
3588 /* Return the number of bytes read. Note that we do not do anything
3589 special here in the case that readlen < recvlen. */
3590 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003591}
3592
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003593PyDoc_STRVAR(recv_into_doc,
3594"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003595\n\
oldkaa0735f2018-02-02 16:52:55 +08003596A version of recv() that stores its data into a buffer rather than creating\n\
3597a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003598is not specified (or 0), receive up to the size available in the given buffer.\n\
3599\n\
3600See recv() for documentation about the flags.");
3601
Victor Stinner31bf2d52015-04-01 21:57:09 +02003602struct sock_recvfrom {
3603 char* cbuf;
3604 Py_ssize_t len;
3605 int flags;
3606 socklen_t *addrlen;
3607 sock_addr_t *addrbuf;
3608 Py_ssize_t result;
3609};
3610
3611static int
3612sock_recvfrom_impl(PySocketSockObject *s, void *data)
3613{
3614 struct sock_recvfrom *ctx = data;
3615
3616 memset(ctx->addrbuf, 0, *ctx->addrlen);
3617
3618#ifdef MS_WINDOWS
3619 if (ctx->len > INT_MAX)
3620 ctx->len = INT_MAX;
3621 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3622 SAS2SA(ctx->addrbuf), ctx->addrlen);
3623#else
3624 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3625 SAS2SA(ctx->addrbuf), ctx->addrlen);
3626#endif
3627 return (ctx->result >= 0);
3628}
3629
Thomas Wouters477c8d52006-05-27 19:21:47 +00003630
3631/*
Christian Heimes99170a52007-12-19 02:07:34 +00003632 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3633 * into a char buffer. If you have any inc/def ref to do to the objects that
3634 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003635 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003636 * that it is also possible that we return a number of bytes smaller than the
3637 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003638 *
3639 * 'addr' is a return value for the address object. Note that you must decref
3640 * it yourself.
3641 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003642static Py_ssize_t
3643sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003648 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 if (!getsockaddrlen(s, &addrlen))
3653 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655 if (!IS_SELECTABLE(s)) {
3656 select_error();
3657 return -1;
3658 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003659
Victor Stinner31bf2d52015-04-01 21:57:09 +02003660 ctx.cbuf = cbuf;
3661 ctx.len = len;
3662 ctx.flags = flags;
3663 ctx.addrbuf = &addrbuf;
3664 ctx.addrlen = &addrlen;
3665 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003667
Victor Stinner31bf2d52015-04-01 21:57:09 +02003668 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3669 s->sock_proto);
3670 if (*addr == NULL)
3671 return -1;
3672
3673 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003674}
3675
3676/* s.recvfrom(nbytes [,flags]) method */
3677
3678static PyObject *
3679sock_recvfrom(PySocketSockObject *s, PyObject *args)
3680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 PyObject *buf = NULL;
3682 PyObject *addr = NULL;
3683 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003684 int flags = 0;
3685 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003686
Antoine Pitrou19467d22010-08-17 19:33:30 +00003687 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 if (recvlen < 0) {
3691 PyErr_SetString(PyExc_ValueError,
3692 "negative buffersize in recvfrom");
3693 return NULL;
3694 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3697 if (buf == NULL)
3698 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3701 recvlen, flags, &addr);
3702 if (outlen < 0) {
3703 goto finally;
3704 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 if (outlen != recvlen) {
3707 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003708 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003710 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 goto finally;
3712 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003714 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003715
3716finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 Py_XDECREF(buf);
3718 Py_XDECREF(addr);
3719 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003720}
3721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003722PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003723"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3724\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003725Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003726
Thomas Wouters477c8d52006-05-27 19:21:47 +00003727
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003728/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003729
3730static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003731sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003734
Antoine Pitrou19467d22010-08-17 19:33:30 +00003735 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 Py_buffer pbuf;
3737 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003738 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003741
Antoine Pitrou19467d22010-08-17 19:33:30 +00003742 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 kwlist, &pbuf,
3744 &recvlen, &flags))
3745 return NULL;
3746 buf = pbuf.buf;
3747 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 if (recvlen < 0) {
3750 PyBuffer_Release(&pbuf);
3751 PyErr_SetString(PyExc_ValueError,
3752 "negative buffersize in recvfrom_into");
3753 return NULL;
3754 }
3755 if (recvlen == 0) {
3756 /* If nbytes was not specified, use the buffer's length */
3757 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003758 } else if (recvlen > buflen) {
3759 PyBuffer_Release(&pbuf);
3760 PyErr_SetString(PyExc_ValueError,
3761 "nbytes is greater than the length of the buffer");
3762 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3766 if (readlen < 0) {
3767 PyBuffer_Release(&pbuf);
3768 /* Return an error */
3769 Py_XDECREF(addr);
3770 return NULL;
3771 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 PyBuffer_Release(&pbuf);
3774 /* Return the number of bytes read and the address. Note that we do
3775 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003776 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003777}
3778
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003779PyDoc_STRVAR(recvfrom_into_doc,
3780"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003781\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003782Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003783
Victor Stinner35bee932015-04-02 12:28:07 +02003784/* The sendmsg() and recvmsg[_into]() methods require a working
3785 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3786#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003787struct sock_recvmsg {
3788 struct msghdr *msg;
3789 int flags;
3790 ssize_t result;
3791};
3792
3793static int
3794sock_recvmsg_impl(PySocketSockObject *s, void *data)
3795{
3796 struct sock_recvmsg *ctx = data;
3797
3798 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3799 return (ctx->result >= 0);
3800}
3801
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003802/*
3803 * Call recvmsg() with the supplied iovec structures, flags, and
3804 * ancillary data buffer size (controllen). Returns the tuple return
3805 * value for recvmsg() or recvmsg_into(), with the first item provided
3806 * by the supplied makeval() function. makeval() will be called with
3807 * the length read and makeval_data as arguments, and must return a
3808 * new reference (which will be decrefed if there is a subsequent
3809 * error). On error, closes any file descriptors received via
3810 * SCM_RIGHTS.
3811 */
3812static PyObject *
3813sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3814 int flags, Py_ssize_t controllen,
3815 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3816{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003817 sock_addr_t addrbuf;
3818 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003819 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003820 PyObject *cmsg_list = NULL, *retval = NULL;
3821 void *controlbuf = NULL;
3822 struct cmsghdr *cmsgh;
3823 size_t cmsgdatalen = 0;
3824 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003825 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826
3827 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3828 ignored" when the socket is connected (Linux fills them in
3829 anyway for AF_UNIX sockets at least). Normally msg_namelen
3830 seems to be set to 0 if there's no address, but try to
3831 initialize msg_name to something that won't be mistaken for a
3832 real address if that doesn't happen. */
3833 if (!getsockaddrlen(s, &addrbuflen))
3834 return NULL;
3835 memset(&addrbuf, 0, addrbuflen);
3836 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3837
3838 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3839 PyErr_SetString(PyExc_ValueError,
3840 "invalid ancillary data buffer length");
3841 return NULL;
3842 }
3843 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3844 return PyErr_NoMemory();
3845
3846 /* Make the system call. */
3847 if (!IS_SELECTABLE(s)) {
3848 select_error();
3849 goto finally;
3850 }
3851
Victor Stinner31bf2d52015-04-01 21:57:09 +02003852 msg.msg_name = SAS2SA(&addrbuf);
3853 msg.msg_namelen = addrbuflen;
3854 msg.msg_iov = iov;
3855 msg.msg_iovlen = iovlen;
3856 msg.msg_control = controlbuf;
3857 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003858
Victor Stinner31bf2d52015-04-01 21:57:09 +02003859 ctx.msg = &msg;
3860 ctx.flags = flags;
3861 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863
3864 /* Make list of (level, type, data) tuples from control messages. */
3865 if ((cmsg_list = PyList_New(0)) == NULL)
3866 goto err_closefds;
3867 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3868 implementations didn't do so. */
3869 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3870 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3871 PyObject *bytes, *tuple;
3872 int tmp;
3873
3874 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3875 if (cmsg_status != 0) {
3876 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3877 "received malformed or improperly-truncated "
3878 "ancillary data", 1) == -1)
3879 goto err_closefds;
3880 }
3881 if (cmsg_status < 0)
3882 break;
3883 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003884 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003885 goto err_closefds;
3886 }
3887
3888 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3889 cmsgdatalen);
3890 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3891 (int)cmsgh->cmsg_type, bytes);
3892 if (tuple == NULL)
3893 goto err_closefds;
3894 tmp = PyList_Append(cmsg_list, tuple);
3895 Py_DECREF(tuple);
3896 if (tmp != 0)
3897 goto err_closefds;
3898
3899 if (cmsg_status != 0)
3900 break;
3901 }
3902
3903 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003904 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905 cmsg_list,
3906 (int)msg.msg_flags,
3907 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3908 ((msg.msg_namelen > addrbuflen) ?
3909 addrbuflen : msg.msg_namelen),
3910 s->sock_proto));
3911 if (retval == NULL)
3912 goto err_closefds;
3913
3914finally:
3915 Py_XDECREF(cmsg_list);
3916 PyMem_Free(controlbuf);
3917 return retval;
3918
3919err_closefds:
3920#ifdef SCM_RIGHTS
3921 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3922 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3923 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3924 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3925 if (cmsg_status < 0)
3926 break;
3927 if (cmsgh->cmsg_level == SOL_SOCKET &&
3928 cmsgh->cmsg_type == SCM_RIGHTS) {
3929 size_t numfds;
3930 int *fdp;
3931
3932 numfds = cmsgdatalen / sizeof(int);
3933 fdp = (int *)CMSG_DATA(cmsgh);
3934 while (numfds-- > 0)
3935 close(*fdp++);
3936 }
3937 if (cmsg_status != 0)
3938 break;
3939 }
3940#endif /* SCM_RIGHTS */
3941 goto finally;
3942}
3943
3944
3945static PyObject *
3946makeval_recvmsg(ssize_t received, void *data)
3947{
3948 PyObject **buf = data;
3949
3950 if (received < PyBytes_GET_SIZE(*buf))
3951 _PyBytes_Resize(buf, received);
3952 Py_XINCREF(*buf);
3953 return *buf;
3954}
3955
3956/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3957
3958static PyObject *
3959sock_recvmsg(PySocketSockObject *s, PyObject *args)
3960{
3961 Py_ssize_t bufsize, ancbufsize = 0;
3962 int flags = 0;
3963 struct iovec iov;
3964 PyObject *buf = NULL, *retval = NULL;
3965
3966 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3967 return NULL;
3968
3969 if (bufsize < 0) {
3970 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3971 return NULL;
3972 }
3973 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3974 return NULL;
3975 iov.iov_base = PyBytes_AS_STRING(buf);
3976 iov.iov_len = bufsize;
3977
3978 /* Note that we're passing a pointer to *our pointer* to the bytes
3979 object here (&buf); makeval_recvmsg() may incref the object, or
3980 deallocate it and set our pointer to NULL. */
3981 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3982 &makeval_recvmsg, &buf);
3983 Py_XDECREF(buf);
3984 return retval;
3985}
3986
3987PyDoc_STRVAR(recvmsg_doc,
3988"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3989\n\
3990Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3991socket. The ancbufsize argument sets the size in bytes of the\n\
3992internal buffer used to receive the ancillary data; it defaults to 0,\n\
3993meaning that no ancillary data will be received. Appropriate buffer\n\
3994sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3995CMSG_LEN(), and items which do not fit into the buffer might be\n\
3996truncated or discarded. The flags argument defaults to 0 and has the\n\
3997same meaning as for recv().\n\
3998\n\
3999The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4000The data item is a bytes object holding the non-ancillary data\n\
4001received. The ancdata item is a list of zero or more tuples\n\
4002(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4003(control messages) received: cmsg_level and cmsg_type are integers\n\
4004specifying the protocol level and protocol-specific type respectively,\n\
4005and cmsg_data is a bytes object holding the associated data. The\n\
4006msg_flags item is the bitwise OR of various flags indicating\n\
4007conditions on the received message; see your system documentation for\n\
4008details. If the receiving socket is unconnected, address is the\n\
4009address of the sending socket, if available; otherwise, its value is\n\
4010unspecified.\n\
4011\n\
4012If recvmsg() raises an exception after the system call returns, it\n\
4013will first attempt to close any file descriptors received via the\n\
4014SCM_RIGHTS mechanism.");
4015
4016
4017static PyObject *
4018makeval_recvmsg_into(ssize_t received, void *data)
4019{
4020 return PyLong_FromSsize_t(received);
4021}
4022
4023/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4024
4025static PyObject *
4026sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4027{
4028 Py_ssize_t ancbufsize = 0;
4029 int flags = 0;
4030 struct iovec *iovs = NULL;
4031 Py_ssize_t i, nitems, nbufs = 0;
4032 Py_buffer *bufs = NULL;
4033 PyObject *buffers_arg, *fast, *retval = NULL;
4034
4035 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4036 &buffers_arg, &ancbufsize, &flags))
4037 return NULL;
4038
4039 if ((fast = PySequence_Fast(buffers_arg,
4040 "recvmsg_into() argument 1 must be an "
4041 "iterable")) == NULL)
4042 return NULL;
4043 nitems = PySequence_Fast_GET_SIZE(fast);
4044 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004045 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004046 goto finally;
4047 }
4048
4049 /* Fill in an iovec for each item, and save the Py_buffer
4050 structs to release afterwards. */
4051 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4052 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4053 PyErr_NoMemory();
4054 goto finally;
4055 }
4056 for (; nbufs < nitems; nbufs++) {
4057 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4058 "w*;recvmsg_into() argument 1 must be an iterable "
4059 "of single-segment read-write buffers",
4060 &bufs[nbufs]))
4061 goto finally;
4062 iovs[nbufs].iov_base = bufs[nbufs].buf;
4063 iovs[nbufs].iov_len = bufs[nbufs].len;
4064 }
4065
4066 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4067 &makeval_recvmsg_into, NULL);
4068finally:
4069 for (i = 0; i < nbufs; i++)
4070 PyBuffer_Release(&bufs[i]);
4071 PyMem_Free(bufs);
4072 PyMem_Free(iovs);
4073 Py_DECREF(fast);
4074 return retval;
4075}
4076
4077PyDoc_STRVAR(recvmsg_into_doc,
4078"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4079\n\
4080Receive normal data and ancillary data from the socket, scattering the\n\
4081non-ancillary data into a series of buffers. The buffers argument\n\
4082must be an iterable of objects that export writable buffers\n\
4083(e.g. bytearray objects); these will be filled with successive chunks\n\
4084of the non-ancillary data until it has all been written or there are\n\
4085no more buffers. The ancbufsize argument sets the size in bytes of\n\
4086the internal buffer used to receive the ancillary data; it defaults to\n\
40870, meaning that no ancillary data will be received. Appropriate\n\
4088buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4089or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4090truncated or discarded. The flags argument defaults to 0 and has the\n\
4091same meaning as for recv().\n\
4092\n\
4093The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4094The nbytes item is the total number of bytes of non-ancillary data\n\
4095written into the buffers. The ancdata item is a list of zero or more\n\
4096tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4097data (control messages) received: cmsg_level and cmsg_type are\n\
4098integers specifying the protocol level and protocol-specific type\n\
4099respectively, and cmsg_data is a bytes object holding the associated\n\
4100data. The msg_flags item is the bitwise OR of various flags\n\
4101indicating conditions on the received message; see your system\n\
4102documentation for details. If the receiving socket is unconnected,\n\
4103address is the address of the sending socket, if available; otherwise,\n\
4104its value is unspecified.\n\
4105\n\
4106If recvmsg_into() raises an exception after the system call returns,\n\
4107it will first attempt to close any file descriptors received via the\n\
4108SCM_RIGHTS mechanism.");
4109#endif /* CMSG_LEN */
4110
4111
Victor Stinner31bf2d52015-04-01 21:57:09 +02004112struct sock_send {
4113 char *buf;
4114 Py_ssize_t len;
4115 int flags;
4116 Py_ssize_t result;
4117};
4118
4119static int
4120sock_send_impl(PySocketSockObject *s, void *data)
4121{
4122 struct sock_send *ctx = data;
4123
4124#ifdef MS_WINDOWS
4125 if (ctx->len > INT_MAX)
4126 ctx->len = INT_MAX;
4127 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4128#else
4129 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4130#endif
4131 return (ctx->result >= 0);
4132}
4133
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004134/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004135
Guido van Rossum73624e91994-10-10 17:59:00 +00004136static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004137sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004138{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004139 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004141 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4144 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 if (!IS_SELECTABLE(s)) {
4147 PyBuffer_Release(&pbuf);
4148 return select_error();
4149 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004150 ctx.buf = pbuf.buf;
4151 ctx.len = pbuf.len;
4152 ctx.flags = flags;
4153 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004154 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 return NULL;
4156 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004157 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004158
4159 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004160}
4161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004162PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004163"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004164\n\
4165Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004166argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004167sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004168
4169
4170/* s.sendall(data [,flags]) method */
4171
4172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004173sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004176 Py_ssize_t len, n;
4177 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004179 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004180 int has_timeout = (s->sock_timeout > 0);
4181 _PyTime_t interval = s->sock_timeout;
4182 _PyTime_t deadline = 0;
4183 int deadline_initialized = 0;
4184 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4187 return NULL;
4188 buf = pbuf.buf;
4189 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 if (!IS_SELECTABLE(s)) {
4192 PyBuffer_Release(&pbuf);
4193 return select_error();
4194 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004197 if (has_timeout) {
4198 if (deadline_initialized) {
4199 /* recompute the timeout */
4200 interval = deadline - _PyTime_GetMonotonicClock();
4201 }
4202 else {
4203 deadline_initialized = 1;
4204 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4205 }
4206
4207 if (interval <= 0) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004208 PyErr_SetString(PyExc_TimeoutError, "timed out");
Victor Stinner8912d142015-04-06 23:16:34 +02004209 goto done;
4210 }
4211 }
4212
Victor Stinner02f32ab2015-04-01 22:53:26 +02004213 ctx.buf = buf;
4214 ctx.len = len;
4215 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004216 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4217 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004218 n = ctx.result;
4219 assert(n >= 0);
4220
4221 buf += n;
4222 len -= n;
4223
4224 /* We must run our signal handlers before looping again.
4225 send() can return a successful partial write when it is
4226 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004227 if (PyErr_CheckSignals())
4228 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004229 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004231
Victor Stinner8912d142015-04-06 23:16:34 +02004232 Py_INCREF(Py_None);
4233 res = Py_None;
4234
4235done:
4236 PyBuffer_Release(&pbuf);
4237 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004238}
4239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004240PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004241"sendall(data[, flags])\n\
4242\n\
4243Send a data string to the socket. For the optional flags\n\
4244argument, see the Unix manual. This calls send() repeatedly\n\
4245until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004246to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004247
Guido van Rossum30a685f1991-06-27 15:51:29 +00004248
Victor Stinner31bf2d52015-04-01 21:57:09 +02004249struct sock_sendto {
4250 char *buf;
4251 Py_ssize_t len;
4252 int flags;
4253 int addrlen;
4254 sock_addr_t *addrbuf;
4255 Py_ssize_t result;
4256};
4257
4258static int
4259sock_sendto_impl(PySocketSockObject *s, void *data)
4260{
4261 struct sock_sendto *ctx = data;
4262
4263#ifdef MS_WINDOWS
4264 if (ctx->len > INT_MAX)
4265 ctx->len = INT_MAX;
4266 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4267 SAS2SA(ctx->addrbuf), ctx->addrlen);
4268#else
4269 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4270 SAS2SA(ctx->addrbuf), ctx->addrlen);
4271#endif
4272 return (ctx->result >= 0);
4273}
4274
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004275/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004276
Guido van Rossum73624e91994-10-10 17:59:00 +00004277static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004278sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 Py_buffer pbuf;
4281 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004282 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004284 int addrlen, flags;
4285 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004288 arglen = PyTuple_Size(args);
4289 switch (arglen) {
4290 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004291 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4292 return NULL;
4293 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004294 break;
4295 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004296 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4297 &pbuf, &flags, &addro)) {
4298 return NULL;
4299 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004300 break;
4301 default:
4302 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004303 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004304 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004305 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 if (!IS_SELECTABLE(s)) {
4309 PyBuffer_Release(&pbuf);
4310 return select_error();
4311 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004312
Victor Stinnerd565fb92019-10-10 21:30:20 +02004313 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 PyBuffer_Release(&pbuf);
4315 return NULL;
4316 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004317
Steve Dowerb82e17e2019-05-23 08:45:22 -07004318 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4319 return NULL;
4320 }
4321
Victor Stinner31bf2d52015-04-01 21:57:09 +02004322 ctx.buf = pbuf.buf;
4323 ctx.len = pbuf.len;
4324 ctx.flags = flags;
4325 ctx.addrlen = addrlen;
4326 ctx.addrbuf = &addrbuf;
4327 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004328 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 return NULL;
4330 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004331 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004332
4333 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004334}
4335
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004336PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004337"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004338\n\
4339Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004340For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004341
Guido van Rossum30a685f1991-06-27 15:51:29 +00004342
Victor Stinner35bee932015-04-02 12:28:07 +02004343/* The sendmsg() and recvmsg[_into]() methods require a working
4344 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4345#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004346struct sock_sendmsg {
4347 struct msghdr *msg;
4348 int flags;
4349 ssize_t result;
4350};
4351
4352static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004353sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4354 struct msghdr *msg,
4355 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4356 Py_ssize_t ndataparts, ndatabufs = 0;
4357 int result = -1;
4358 struct iovec *iovs = NULL;
4359 PyObject *data_fast = NULL;
4360 Py_buffer *databufs = NULL;
4361
4362 /* Fill in an iovec for each message part, and save the Py_buffer
4363 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004364 data_fast = PySequence_Fast(data_arg,
4365 "sendmsg() argument 1 must be an "
4366 "iterable");
4367 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004368 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004369 }
4370
Christian Heimesdffa3942016-09-05 23:54:41 +02004371 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4372 if (ndataparts > INT_MAX) {
4373 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4374 goto finally;
4375 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004376
Christian Heimesdffa3942016-09-05 23:54:41 +02004377 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004378 if (ndataparts > 0) {
4379 iovs = PyMem_New(struct iovec, ndataparts);
4380 if (iovs == NULL) {
4381 PyErr_NoMemory();
4382 goto finally;
4383 }
4384 msg->msg_iov = iovs;
4385
4386 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004387 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004388 PyErr_NoMemory();
4389 goto finally;
4390 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004391 }
4392 for (; ndatabufs < ndataparts; ndatabufs++) {
4393 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4394 "y*;sendmsg() argument 1 must be an iterable of "
4395 "bytes-like objects",
4396 &databufs[ndatabufs]))
4397 goto finally;
4398 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4399 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4400 }
4401 result = 0;
4402 finally:
4403 *databufsout = databufs;
4404 *ndatabufsout = ndatabufs;
4405 Py_XDECREF(data_fast);
4406 return result;
4407}
4408
4409static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004410sock_sendmsg_impl(PySocketSockObject *s, void *data)
4411{
4412 struct sock_sendmsg *ctx = data;
4413
4414 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4415 return (ctx->result >= 0);
4416}
4417
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004418/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4419
4420static PyObject *
4421sock_sendmsg(PySocketSockObject *s, PyObject *args)
4422{
Christian Heimesdffa3942016-09-05 23:54:41 +02004423 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004424 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004426 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427 struct cmsginfo {
4428 int level;
4429 int type;
4430 Py_buffer data;
4431 } *cmsgs = NULL;
4432 void *controlbuf = NULL;
4433 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004434 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004435 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004436 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004437 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004438
4439 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004440 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004441 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004442 }
4443
4444 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004445
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004446 /* Parse destination address. */
4447 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004448 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004449 "sendmsg"))
4450 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004451 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004452 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004453 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4454 return NULL;
4455 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004456 msg.msg_name = &addrbuf;
4457 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004458 } else {
4459 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4460 return NULL;
4461 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004462 }
4463
4464 /* Fill in an iovec for each message part, and save the Py_buffer
4465 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004466 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468 }
4469
4470 if (cmsg_arg == NULL)
4471 ncmsgs = 0;
4472 else {
4473 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4474 "sendmsg() argument 2 must be an "
4475 "iterable")) == NULL)
4476 goto finally;
4477 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4478 }
4479
4480#ifndef CMSG_SPACE
4481 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004482 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004483 "sending multiple control messages is not supported "
4484 "on this system");
4485 goto finally;
4486 }
4487#endif
4488 /* Save level, type and Py_buffer for each control message,
4489 and calculate total size. */
4490 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4491 PyErr_NoMemory();
4492 goto finally;
4493 }
4494 controllen = controllen_last = 0;
4495 while (ncmsgbufs < ncmsgs) {
4496 size_t bufsize, space;
4497
4498 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4499 "(iiy*):[sendmsg() ancillary data items]",
4500 &cmsgs[ncmsgbufs].level,
4501 &cmsgs[ncmsgbufs].type,
4502 &cmsgs[ncmsgbufs].data))
4503 goto finally;
4504 bufsize = cmsgs[ncmsgbufs++].data.len;
4505
4506#ifdef CMSG_SPACE
4507 if (!get_CMSG_SPACE(bufsize, &space)) {
4508#else
4509 if (!get_CMSG_LEN(bufsize, &space)) {
4510#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004511 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004512 goto finally;
4513 }
4514 controllen += space;
4515 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004516 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004517 goto finally;
4518 }
4519 controllen_last = controllen;
4520 }
4521
4522 /* Construct ancillary data block from control message info. */
4523 if (ncmsgbufs > 0) {
4524 struct cmsghdr *cmsgh = NULL;
4525
Victor Stinner52d61e42016-09-12 11:41:58 +02004526 controlbuf = PyMem_Malloc(controllen);
4527 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004528 PyErr_NoMemory();
4529 goto finally;
4530 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004531 msg.msg_control = controlbuf;
4532
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004533 msg.msg_controllen = controllen;
4534
4535 /* Need to zero out the buffer as a workaround for glibc's
4536 CMSG_NXTHDR() implementation. After getting the pointer to
4537 the next header, it checks its (uninitialized) cmsg_len
4538 member to see if the "message" fits in the buffer, and
4539 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004540 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004541 memset(controlbuf, 0, controllen);
4542
4543 for (i = 0; i < ncmsgbufs; i++) {
4544 size_t msg_len, data_len = cmsgs[i].data.len;
4545 int enough_space = 0;
4546
4547 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4548 if (cmsgh == NULL) {
4549 PyErr_Format(PyExc_RuntimeError,
4550 "unexpected NULL result from %s()",
4551 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4552 goto finally;
4553 }
4554 if (!get_CMSG_LEN(data_len, &msg_len)) {
4555 PyErr_SetString(PyExc_RuntimeError,
4556 "item size out of range for CMSG_LEN()");
4557 goto finally;
4558 }
4559 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4560 size_t space;
4561
4562 cmsgh->cmsg_len = msg_len;
4563 if (get_cmsg_data_space(&msg, cmsgh, &space))
4564 enough_space = (space >= data_len);
4565 }
4566 if (!enough_space) {
4567 PyErr_SetString(PyExc_RuntimeError,
4568 "ancillary data does not fit in calculated "
4569 "space");
4570 goto finally;
4571 }
4572 cmsgh->cmsg_level = cmsgs[i].level;
4573 cmsgh->cmsg_type = cmsgs[i].type;
4574 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4575 }
4576 }
4577
4578 /* Make the system call. */
4579 if (!IS_SELECTABLE(s)) {
4580 select_error();
4581 goto finally;
4582 }
4583
Victor Stinner31bf2d52015-04-01 21:57:09 +02004584 ctx.msg = &msg;
4585 ctx.flags = flags;
4586 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004587 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004588
4589 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004590
4591finally:
4592 PyMem_Free(controlbuf);
4593 for (i = 0; i < ncmsgbufs; i++)
4594 PyBuffer_Release(&cmsgs[i].data);
4595 PyMem_Free(cmsgs);
4596 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004597 PyMem_Free(msg.msg_iov);
4598 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004599 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004600 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004601 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004602 return retval;
4603}
4604
4605PyDoc_STRVAR(sendmsg_doc,
4606"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4607\n\
4608Send normal and ancillary data to the socket, gathering the\n\
4609non-ancillary data from a series of buffers and concatenating it into\n\
4610a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004611data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004612The ancdata argument specifies the ancillary data (control messages)\n\
4613as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4614cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4615protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004616is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004617argument defaults to 0 and has the same meaning as for send(). If\n\
4618address is supplied and not None, it sets a destination address for\n\
4619the message. The return value is the number of bytes of non-ancillary\n\
4620data sent.");
4621#endif /* CMSG_LEN */
4622
Christian Heimesdffa3942016-09-05 23:54:41 +02004623#ifdef HAVE_SOCKADDR_ALG
4624static PyObject*
4625sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4626{
4627 PyObject *retval = NULL;
4628
4629 Py_ssize_t i, ndatabufs = 0;
4630 Py_buffer *databufs = NULL;
4631 PyObject *data_arg = NULL;
4632
4633 Py_buffer iv = {NULL, NULL};
4634
4635 PyObject *opobj = NULL;
4636 int op = -1;
4637
4638 PyObject *assoclenobj = NULL;
4639 int assoclen = -1;
4640
4641 unsigned int *uiptr;
4642 int flags = 0;
4643
4644 struct msghdr msg;
4645 struct cmsghdr *header = NULL;
4646 struct af_alg_iv *alg_iv = NULL;
4647 struct sock_sendmsg ctx;
4648 Py_ssize_t controllen;
4649 void *controlbuf = NULL;
4650 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4651
4652 if (self->sock_family != AF_ALG) {
4653 PyErr_SetString(PyExc_OSError,
4654 "algset is only supported for AF_ALG");
4655 return NULL;
4656 }
4657
4658 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4659 "|O$O!y*O!i:sendmsg_afalg", keywords,
4660 &data_arg,
4661 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004662 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004663 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004664 }
4665
4666 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004667
4668 /* op is a required, keyword-only argument >= 0 */
4669 if (opobj != NULL) {
4670 op = _PyLong_AsInt(opobj);
4671 }
4672 if (op < 0) {
4673 /* override exception from _PyLong_AsInt() */
4674 PyErr_SetString(PyExc_TypeError,
4675 "Invalid or missing argument 'op'");
4676 goto finally;
4677 }
4678 /* assoclen is optional but must be >= 0 */
4679 if (assoclenobj != NULL) {
4680 assoclen = _PyLong_AsInt(assoclenobj);
4681 if (assoclen == -1 && PyErr_Occurred()) {
4682 goto finally;
4683 }
4684 if (assoclen < 0) {
4685 PyErr_SetString(PyExc_TypeError,
4686 "assoclen must be positive");
4687 goto finally;
4688 }
4689 }
4690
4691 controllen = CMSG_SPACE(4);
4692 if (iv.buf != NULL) {
4693 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4694 }
4695 if (assoclen >= 0) {
4696 controllen += CMSG_SPACE(4);
4697 }
4698
4699 controlbuf = PyMem_Malloc(controllen);
4700 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004701 PyErr_NoMemory();
4702 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004703 }
4704 memset(controlbuf, 0, controllen);
4705
Christian Heimesdffa3942016-09-05 23:54:41 +02004706 msg.msg_controllen = controllen;
4707 msg.msg_control = controlbuf;
4708
4709 /* Fill in an iovec for each message part, and save the Py_buffer
4710 structs to release afterwards. */
4711 if (data_arg != NULL) {
4712 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4713 goto finally;
4714 }
4715 }
4716
4717 /* set operation to encrypt or decrypt */
4718 header = CMSG_FIRSTHDR(&msg);
4719 if (header == NULL) {
4720 PyErr_SetString(PyExc_RuntimeError,
4721 "unexpected NULL result from CMSG_FIRSTHDR");
4722 goto finally;
4723 }
4724 header->cmsg_level = SOL_ALG;
4725 header->cmsg_type = ALG_SET_OP;
4726 header->cmsg_len = CMSG_LEN(4);
4727 uiptr = (void*)CMSG_DATA(header);
4728 *uiptr = (unsigned int)op;
4729
4730 /* set initialization vector */
4731 if (iv.buf != NULL) {
4732 header = CMSG_NXTHDR(&msg, header);
4733 if (header == NULL) {
4734 PyErr_SetString(PyExc_RuntimeError,
4735 "unexpected NULL result from CMSG_NXTHDR(iv)");
4736 goto finally;
4737 }
4738 header->cmsg_level = SOL_ALG;
4739 header->cmsg_type = ALG_SET_IV;
4740 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4741 alg_iv = (void*)CMSG_DATA(header);
4742 alg_iv->ivlen = iv.len;
4743 memcpy(alg_iv->iv, iv.buf, iv.len);
4744 }
4745
4746 /* set length of associated data for AEAD */
4747 if (assoclen >= 0) {
4748 header = CMSG_NXTHDR(&msg, header);
4749 if (header == NULL) {
4750 PyErr_SetString(PyExc_RuntimeError,
4751 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4752 goto finally;
4753 }
4754 header->cmsg_level = SOL_ALG;
4755 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4756 header->cmsg_len = CMSG_LEN(4);
4757 uiptr = (void*)CMSG_DATA(header);
4758 *uiptr = (unsigned int)assoclen;
4759 }
4760
4761 ctx.msg = &msg;
4762 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004763 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004764 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004765 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004766
4767 retval = PyLong_FromSsize_t(ctx.result);
4768
4769 finally:
4770 PyMem_Free(controlbuf);
4771 if (iv.buf != NULL) {
4772 PyBuffer_Release(&iv);
4773 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004774 PyMem_Free(msg.msg_iov);
4775 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004776 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004777 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004778 PyMem_Free(databufs);
4779 return retval;
4780}
4781
4782PyDoc_STRVAR(sendmsg_afalg_doc,
4783"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4784\n\
4785Set operation mode, IV and length of associated data for an AF_ALG\n\
4786operation socket.");
4787#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004788
Guido van Rossum30a685f1991-06-27 15:51:29 +00004789/* s.shutdown(how) method */
4790
Guido van Rossum73624e91994-10-10 17:59:00 +00004791static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004792sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 int how;
4795 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004796
Serhiy Storchaka78980432013-01-15 01:12:17 +02004797 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 if (how == -1 && PyErr_Occurred())
4799 return NULL;
4800 Py_BEGIN_ALLOW_THREADS
4801 res = shutdown(s->sock_fd, how);
4802 Py_END_ALLOW_THREADS
4803 if (res < 0)
4804 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004805 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004806}
4807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004808PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004809"shutdown(flag)\n\
4810\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004811Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4812of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004813
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004814#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004815static PyObject*
4816sock_ioctl(PySocketSockObject *s, PyObject *arg)
4817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 unsigned long cmd = SIO_RCVALL;
4819 PyObject *argO;
4820 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4823 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 switch (cmd) {
4826 case SIO_RCVALL: {
4827 unsigned int option = RCVALL_ON;
4828 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4829 return NULL;
4830 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4831 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4832 return set_error();
4833 }
4834 return PyLong_FromUnsignedLong(recv); }
4835 case SIO_KEEPALIVE_VALS: {
4836 struct tcp_keepalive ka;
4837 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4838 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4839 return NULL;
4840 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4841 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4842 return set_error();
4843 }
4844 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004845#if defined(SIO_LOOPBACK_FAST_PATH)
4846 case SIO_LOOPBACK_FAST_PATH: {
4847 unsigned int option;
4848 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4849 return NULL;
4850 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4851 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4852 return set_error();
4853 }
4854 return PyLong_FromUnsignedLong(recv); }
4855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004857 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 return NULL;
4859 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004860}
4861PyDoc_STRVAR(sock_ioctl_doc,
4862"ioctl(cmd, option) -> long\n\
4863\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004864Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4865SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004866SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4867SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004868#endif
4869
4870#if defined(MS_WINDOWS)
4871static PyObject*
4872sock_share(PySocketSockObject *s, PyObject *arg)
4873{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004874 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004875 DWORD processId;
4876 int result;
4877
4878 if (!PyArg_ParseTuple(arg, "I", &processId))
4879 return NULL;
4880
4881 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004882 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004883 Py_END_ALLOW_THREADS
4884 if (result == SOCKET_ERROR)
4885 return set_error();
4886 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4887}
4888PyDoc_STRVAR(sock_share_doc,
4889"share(process_id) -> bytes\n\
4890\n\
4891Share the socket with another process. The target process id\n\
4892must be provided and the resulting bytes object passed to the target\n\
4893process. There the shared socket can be instantiated by calling\n\
4894socket.fromshare().");
4895
Christian Heimesfaf2f632008-01-06 16:59:19 +00004896
4897#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004898
4899/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004900
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004901static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4903 accept_doc},
4904 {"bind", (PyCFunction)sock_bind, METH_O,
4905 bind_doc},
4906 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004907 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 {"connect", (PyCFunction)sock_connect, METH_O,
4909 connect_doc},
4910 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4911 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004912 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4913 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4915 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004916#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 {"getpeername", (PyCFunction)sock_getpeername,
4918 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 {"getsockname", (PyCFunction)sock_getsockname,
4921 METH_NOARGS, getsockname_doc},
4922 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4923 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004924#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4926 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004927#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004928#if defined(MS_WINDOWS)
4929 {"share", (PyCFunction)sock_share, METH_VARARGS,
4930 sock_share_doc},
4931#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004932 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 listen_doc},
4934 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4935 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004936 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 recv_into_doc},
4938 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4939 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004940 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 recvfrom_into_doc},
4942 {"send", (PyCFunction)sock_send, METH_VARARGS,
4943 send_doc},
4944 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4945 sendall_doc},
4946 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4947 sendto_doc},
4948 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4949 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004950 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4951 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4953 settimeout_doc},
4954 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4955 gettimeout_doc},
4956 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4957 setsockopt_doc},
4958 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4959 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004960#ifdef CMSG_LEN
4961 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4962 recvmsg_doc},
4963 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4964 recvmsg_into_doc,},
4965 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4966 sendmsg_doc},
4967#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004968#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004969 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004970 sendmsg_afalg_doc},
4971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004973};
4974
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004975/* SockObject members */
4976static PyMemberDef sock_memberlist[] = {
4977 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4978 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4979 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004980 {0},
4981};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004982
Victor Stinner71694d52015-03-28 01:18:54 +01004983static PyGetSetDef sock_getsetlist[] = {
4984 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4985 {NULL} /* sentinel */
4986};
4987
Guido van Rossum73624e91994-10-10 17:59:00 +00004988/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004989 First close the file description. */
4990
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004991static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004992sock_finalize(PySocketSockObject *s)
4993{
4994 SOCKET_T fd;
4995 PyObject *error_type, *error_value, *error_traceback;
4996
4997 /* Save the current exception, if any. */
4998 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4999
Victor Stinnerd3afb622016-07-22 17:47:09 +02005000 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005001 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5002 /* Spurious errors can appear at shutdown */
5003 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5004 PyErr_WriteUnraisable((PyObject *)s);
5005 }
5006 }
5007
5008 /* Only close the socket *after* logging the ResourceWarning warning
5009 to allow the logger to call socket methods like
5010 socket.getsockname(). If the socket is closed before, socket
5011 methods fails with the EBADF error. */
5012 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005013 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005014
5015 /* We do not want to retry upon EINTR: see sock_close() */
5016 Py_BEGIN_ALLOW_THREADS
5017 (void) SOCKETCLOSE(fd);
5018 Py_END_ALLOW_THREADS
5019 }
5020
5021 /* Restore the saved exception. */
5022 PyErr_Restore(error_type, error_value, error_traceback);
5023}
5024
5025static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005026sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005027{
Victor Stinner19a8e842016-03-21 16:36:48 +01005028 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5029 return;
5030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005032}
5033
Guido van Rossum30a685f1991-06-27 15:51:29 +00005034
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005035static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005036sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005037{
Victor Stinnere254e532014-07-26 14:36:55 +02005038 long sock_fd;
5039 /* On Windows, this test is needed because SOCKET_T is unsigned */
5040 if (s->sock_fd == INVALID_SOCKET) {
5041 sock_fd = -1;
5042 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005043#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005044 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 /* this can occur on Win64, and actually there is a special
5046 ugly printf formatter for decimal pointer length integer
5047 printing, only bother if necessary*/
5048 PyErr_SetString(PyExc_OverflowError,
5049 "no printf formatter to display "
5050 "the socket descriptor in decimal");
5051 return NULL;
5052 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005053#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005054 else
5055 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 return PyUnicode_FromFormat(
5057 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005058 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 s->sock_type,
5060 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005061}
5062
5063
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005064/* Create a new, uninitialized socket object. */
5065
5066static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005067sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 new = type->tp_alloc(type, 0);
5072 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005073 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005074 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 ((PySocketSockObject *)new)->errorhandler = &set_error;
5076 }
5077 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005078}
5079
5080
5081/* Initialize a new socket object. */
5082
Victor Stinnerdaf45552013-08-28 00:53:59 +02005083#ifdef SOCK_CLOEXEC
5084/* socket() and socketpair() fail with EINVAL on Linux kernel older
5085 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5086static int sock_cloexec_works = -1;
5087#endif
5088
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005089/*ARGSUSED*/
5090static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005091sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 PySocketSockObject *s = (PySocketSockObject *)self;
5094 PyObject *fdobj = NULL;
5095 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005096 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005098#ifndef MS_WINDOWS
5099#ifdef SOCK_CLOEXEC
5100 int *atomic_flag_works = &sock_cloexec_works;
5101#else
5102 int *atomic_flag_works = NULL;
5103#endif
5104#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5107 "|iiiO:socket", keywords,
5108 &family, &type, &proto, &fdobj))
5109 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005110
Steve Dowerb82e17e2019-05-23 08:45:22 -07005111#ifdef MS_WINDOWS
5112 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005113 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005114#endif
5115 {
5116 if (PySys_Audit("socket.__new__", "Oiii",
5117 s, family, type, proto) < 0) {
5118 return -1;
5119 }
5120 }
5121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005123#ifdef MS_WINDOWS
5124 /* recreate a socket that was duplicated */
5125 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005126 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005127 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5128 PyErr_Format(PyExc_ValueError,
5129 "socket descriptor string has wrong size, "
5130 "should be %zu bytes.", sizeof(info));
5131 return -1;
5132 }
5133 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005134
Steve Dower63ba5cc2020-03-31 12:38:53 +01005135 if (PySys_Audit("socket.__new__", "Oiii", s,
5136 info.iAddressFamily, info.iSocketType,
5137 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005138 return -1;
5139 }
5140
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005141 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005142 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005143 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5144 Py_END_ALLOW_THREADS
5145 if (fd == INVALID_SOCKET) {
5146 set_error();
5147 return -1;
5148 }
5149 family = info.iAddressFamily;
5150 type = info.iSocketType;
5151 proto = info.iProtocol;
5152 }
5153 else
5154#endif
5155 {
Dima Tisneke9912702018-12-17 22:07:55 +09005156 fd = PyLong_AsSocket_t(fdobj);
5157 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5158 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005159#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005160 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005161#else
Dima Tisneke9912702018-12-17 22:07:55 +09005162 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005163#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005164 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5165 return -1;
5166 }
5167
5168 /* validate that passed file descriptor is valid and a socket. */
5169 sock_addr_t addrbuf;
5170 socklen_t addrlen = sizeof(sock_addr_t);
5171
5172 memset(&addrbuf, 0, addrlen);
5173 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5174 if (family == -1) {
5175 family = SAS2SA(&addrbuf)->sa_family;
5176 }
5177 } else {
5178#ifdef MS_WINDOWS
5179 /* getsockname() on an unbound socket is an error on Windows.
5180 Invalid descriptor and not a socket is same error code.
5181 Error out if family must be resolved, or bad descriptor. */
5182 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5183#else
5184 /* getsockname() is not supported for SOL_ALG on Linux. */
5185 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5186#endif
5187 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005188 return -1;
5189 }
5190 }
5191#ifdef SO_TYPE
5192 if (type == -1) {
5193 int tmp;
5194 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005195 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5196 (void *)&tmp, &slen) == 0)
5197 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005198 type = tmp;
5199 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005200 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005201 return -1;
5202 }
5203 }
5204#else
5205 type = SOCK_STREAM;
5206#endif
5207#ifdef SO_PROTOCOL
5208 if (proto == -1) {
5209 int tmp;
5210 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005211 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5212 (void *)&tmp, &slen) == 0)
5213 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005214 proto = tmp;
5215 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005216 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005217 return -1;
5218 }
5219 }
5220#else
5221 proto = 0;
5222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 }
5224 }
5225 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005226 /* No fd, default to AF_INET and SOCK_STREAM */
5227 if (family == -1) {
5228 family = AF_INET;
5229 }
5230 if (type == -1) {
5231 type = SOCK_STREAM;
5232 }
5233 if (proto == -1) {
5234 proto = 0;
5235 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005236#ifdef MS_WINDOWS
5237 /* Windows implementation */
5238#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5239#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5240#endif
5241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005243 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005244 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005245 NULL, 0,
5246 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5247 if (fd == INVALID_SOCKET) {
5248 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5249 support_wsa_no_inherit = 0;
5250 fd = socket(family, type, proto);
5251 }
5252 }
5253 else {
5254 fd = socket(family, type, proto);
5255 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 if (fd == INVALID_SOCKET) {
5259 set_error();
5260 return -1;
5261 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005262
5263 if (!support_wsa_no_inherit) {
5264 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5265 closesocket(fd);
5266 PyErr_SetFromWindowsErr(0);
5267 return -1;
5268 }
5269 }
5270#else
5271 /* UNIX */
5272 Py_BEGIN_ALLOW_THREADS
5273#ifdef SOCK_CLOEXEC
5274 if (sock_cloexec_works != 0) {
5275 fd = socket(family, type | SOCK_CLOEXEC, proto);
5276 if (sock_cloexec_works == -1) {
5277 if (fd >= 0) {
5278 sock_cloexec_works = 1;
5279 }
5280 else if (errno == EINVAL) {
5281 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5282 sock_cloexec_works = 0;
5283 fd = socket(family, type, proto);
5284 }
5285 }
5286 }
5287 else
5288#endif
5289 {
5290 fd = socket(family, type, proto);
5291 }
5292 Py_END_ALLOW_THREADS
5293
5294 if (fd == INVALID_SOCKET) {
5295 set_error();
5296 return -1;
5297 }
5298
5299 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5300 SOCKETCLOSE(fd);
5301 return -1;
5302 }
5303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005305 if (init_sockobject(s, fd, family, type, proto) == -1) {
5306 SOCKETCLOSE(fd);
5307 return -1;
5308 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005311
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005312}
5313
5314
Guido van Rossumb6775db1994-08-01 11:34:53 +00005315/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005316
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005317static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5319 "_socket.socket", /* tp_name */
5320 sizeof(PySocketSockObject), /* tp_basicsize */
5321 0, /* tp_itemsize */
5322 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005323 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 0, /* tp_getattr */
5325 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005326 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 (reprfunc)sock_repr, /* tp_repr */
5328 0, /* tp_as_number */
5329 0, /* tp_as_sequence */
5330 0, /* tp_as_mapping */
5331 0, /* tp_hash */
5332 0, /* tp_call */
5333 0, /* tp_str */
5334 PyObject_GenericGetAttr, /* tp_getattro */
5335 0, /* tp_setattro */
5336 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 sock_doc, /* tp_doc */
5339 0, /* tp_traverse */
5340 0, /* tp_clear */
5341 0, /* tp_richcompare */
5342 0, /* tp_weaklistoffset */
5343 0, /* tp_iter */
5344 0, /* tp_iternext */
5345 sock_methods, /* tp_methods */
5346 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005347 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 0, /* tp_base */
5349 0, /* tp_dict */
5350 0, /* tp_descr_get */
5351 0, /* tp_descr_set */
5352 0, /* tp_dictoffset */
5353 sock_initobj, /* tp_init */
5354 PyType_GenericAlloc, /* tp_alloc */
5355 sock_new, /* tp_new */
5356 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005357 0, /* tp_is_gc */
5358 0, /* tp_bases */
5359 0, /* tp_mro */
5360 0, /* tp_cache */
5361 0, /* tp_subclasses */
5362 0, /* tp_weaklist */
5363 0, /* tp_del */
5364 0, /* tp_version_tag */
5365 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005366};
5367
Guido van Rossum30a685f1991-06-27 15:51:29 +00005368
Guido van Rossum81194471991-07-27 21:42:02 +00005369/* Python interface to gethostname(). */
5370
5371/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005372static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005373socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005374{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005375 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5376 return NULL;
5377 }
5378
Martin v. Löwis72f48422010-10-29 18:20:08 +00005379#ifdef MS_WINDOWS
5380 /* Don't use winsock's gethostname, as this returns the ANSI
5381 version of the hostname, whereas we need a Unicode string.
5382 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005383 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005384 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005385 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005386 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005387
5388 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005389 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005390
5391 if (GetLastError() != ERROR_MORE_DATA)
5392 return PyErr_SetFromWindowsErr(0);
5393
5394 if (size == 0)
5395 return PyUnicode_New(0, 0);
5396
5397 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5398 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005399 name = PyMem_New(wchar_t, size);
5400 if (!name) {
5401 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005402 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005403 }
Victor Stinner74168972011-11-17 01:11:36 +01005404 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5405 name,
5406 &size))
5407 {
5408 PyMem_Free(name);
5409 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005410 }
Victor Stinner74168972011-11-17 01:11:36 +01005411
5412 result = PyUnicode_FromWideChar(name, size);
5413 PyMem_Free(name);
5414 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005415#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 char buf[1024];
5417 int res;
5418 Py_BEGIN_ALLOW_THREADS
5419 res = gethostname(buf, (int) sizeof buf - 1);
5420 Py_END_ALLOW_THREADS
5421 if (res < 0)
5422 return set_error();
5423 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005424 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005425#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005426}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005427
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005428PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005429"gethostname() -> string\n\
5430\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005431Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005432
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005433#ifdef HAVE_SETHOSTNAME
5434PyDoc_STRVAR(sethostname_doc,
5435"sethostname(name)\n\n\
5436Sets the hostname to name.");
5437
5438static PyObject *
5439socket_sethostname(PyObject *self, PyObject *args)
5440{
5441 PyObject *hnobj;
5442 Py_buffer buf;
5443 int res, flag = 0;
5444
Christian Heimesd2774c72013-06-19 02:06:29 +02005445#ifdef _AIX
5446/* issue #18259, not declared in any useful header file */
5447extern int sethostname(const char *, size_t);
5448#endif
5449
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005450 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5451 PyErr_Clear();
5452 if (!PyArg_ParseTuple(args, "O&:sethostname",
5453 PyUnicode_FSConverter, &hnobj))
5454 return NULL;
5455 flag = 1;
5456 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005457
5458 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5459 return NULL;
5460 }
5461
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005462 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5463 if (!res) {
5464 res = sethostname(buf.buf, buf.len);
5465 PyBuffer_Release(&buf);
5466 }
5467 if (flag)
5468 Py_DECREF(hnobj);
5469 if (res)
5470 return set_error();
5471 Py_RETURN_NONE;
5472}
5473#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005474
Guido van Rossum30a685f1991-06-27 15:51:29 +00005475/* Python interface to gethostbyname(name). */
5476
5477/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005479socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005482 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005483 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005484
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005485 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005487 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5488 goto finally;
5489 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005490 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005491 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005492 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005493finally:
5494 PyMem_Free(name);
5495 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005496}
5497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005498PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005499"gethostbyname(host) -> address\n\
5500\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005501Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005502
5503
Victor Stinner72400302016-01-28 15:41:01 +01005504static PyObject*
5505sock_decode_hostname(const char *name)
5506{
5507#ifdef MS_WINDOWS
5508 /* Issue #26227: gethostbyaddr() returns a string encoded
5509 * to the ANSI code page */
5510 return PyUnicode_DecodeFSDefault(name);
5511#else
5512 /* Decode from UTF-8 */
5513 return PyUnicode_FromString(name);
5514#endif
5515}
5516
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005517/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5518
5519static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005520gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 char **pch;
5523 PyObject *rtn_tuple = (PyObject *)NULL;
5524 PyObject *name_list = (PyObject *)NULL;
5525 PyObject *addr_list = (PyObject *)NULL;
5526 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005527 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 if (h == NULL) {
5530 /* Let's get real error message to return */
5531 set_herror(h_errno);
5532 return NULL;
5533 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 if (h->h_addrtype != af) {
5536 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005537 errno = EAFNOSUPPORT;
5538 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 return NULL;
5540 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 case AF_INET:
5545 if (alen < sizeof(struct sockaddr_in))
5546 return NULL;
5547 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005548
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005549#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 case AF_INET6:
5551 if (alen < sizeof(struct sockaddr_in6))
5552 return NULL;
5553 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005554#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 if ((name_list = PyList_New(0)) == NULL)
5559 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005561 if ((addr_list = PyList_New(0)) == NULL)
5562 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 /* SF #1511317: h_aliases can be NULL */
5565 if (h->h_aliases) {
5566 for (pch = h->h_aliases; *pch != NULL; pch++) {
5567 int status;
5568 tmp = PyUnicode_FromString(*pch);
5569 if (tmp == NULL)
5570 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 status = PyList_Append(name_list, tmp);
5573 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 if (status)
5576 goto err;
5577 }
5578 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5581 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 case AF_INET:
5586 {
5587 struct sockaddr_in sin;
5588 memset(&sin, 0, sizeof(sin));
5589 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005590#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005594 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 if (pch == h->h_addr_list && alen >= sizeof(sin))
5597 memcpy((char *) addr, &sin, sizeof(sin));
5598 break;
5599 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005600
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005601#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 case AF_INET6:
5603 {
5604 struct sockaddr_in6 sin6;
5605 memset(&sin6, 0, sizeof(sin6));
5606 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005607#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005611 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5614 memcpy((char *) addr, &sin6, sizeof(sin6));
5615 break;
5616 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005617#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005620 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 "unsupported address family");
5622 return NULL;
5623 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 if (tmp == NULL)
5626 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 status = PyList_Append(addr_list, tmp);
5629 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 if (status)
5632 goto err;
5633 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005634
Victor Stinner72400302016-01-28 15:41:01 +01005635 name = sock_decode_hostname(h->h_name);
5636 if (name == NULL)
5637 goto err;
5638 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005639
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005640 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 Py_XDECREF(name_list);
5642 Py_XDECREF(addr_list);
5643 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005644}
5645
5646
5647/* Python interface to gethostbyname_ex(name). */
5648
5649/*ARGSUSED*/
5650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005651socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 char *name;
5654 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005655 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005657 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005658#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005660#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 char buf[16384];
5664 int buf_len = (sizeof buf) - 1;
5665 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005666#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005667#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005669#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005670#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005671
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005672 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005674 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5675 goto finally;
5676 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005677 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005678 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005680#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005681#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005682 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005684#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005686#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 memset((void *) &data, '\0', sizeof(data));
5688 result = gethostbyname_r(name, &hp_allocated, &data);
5689 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005690#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005691#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005692#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005693 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005694#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005695 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005697#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 Py_END_ALLOW_THREADS
5699 /* Some C libraries would require addr.__ss_family instead of
5700 addr.ss_family.
5701 Therefore, we cast the sockaddr_storage into sockaddr to
5702 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005703 sa = SAS2SA(&addr);
5704 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005706#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005708#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005709finally:
5710 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005712}
5713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005714PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005715"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5716\n\
5717Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005718for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005719
5720
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005721/* Python interface to gethostbyaddr(IP). */
5722
5723/*ARGSUSED*/
5724static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005725socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005726{
Charles-François Natali8b759652011-12-23 16:44:51 +01005727 sock_addr_t addr;
5728 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 char *ip_num;
5730 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005731 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005732#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005734#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005736#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 /* glibcs up to 2.10 assume that the buf argument to
5738 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5739 does not ensure. The attribute below instructs the compiler
5740 to maintain this alignment. */
5741 char buf[16384] Py_ALIGNED(8);
5742 int buf_len = (sizeof buf) - 1;
5743 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005744#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005745#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005747#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005748#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005749 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 int al;
5751 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005752
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005753 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005755 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5756 goto finally;
5757 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 af = AF_UNSPEC;
5759 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005760 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 af = sa->sa_family;
5762 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005763 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 switch (af) {
5765 case AF_INET:
5766 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5767 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5768 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005769#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 case AF_INET6:
5771 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5772 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5773 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005776 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005777 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 }
5779 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005780#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005781#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005782 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 &hp_allocated, buf, buf_len,
5784 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005785#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 h = gethostbyaddr_r(ap, al, af,
5787 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005788#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789 memset((void *) &data, '\0', sizeof(data));
5790 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5791 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005792#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005793#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005794#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005796#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005797 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005799#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005801 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005802#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005804#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005805finally:
5806 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005808}
5809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005810PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005811"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5812\n\
5813Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005814for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005815
Guido van Rossum30a685f1991-06-27 15:51:29 +00005816
5817/* Python interface to getservbyname(name).
5818 This only returns the port number, since the other info is already
5819 known or not useful (like the list of aliases). */
5820
5821/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005823socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005824{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005825 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 struct servent *sp;
5827 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5828 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005829
5830 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5831 return NULL;
5832 }
5833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 Py_BEGIN_ALLOW_THREADS
5835 sp = getservbyname(name, proto);
5836 Py_END_ALLOW_THREADS
5837 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005838 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 return NULL;
5840 }
5841 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005842}
5843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005844PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005845"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005846\n\
5847Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005848The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5849otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005850
Guido van Rossum30a685f1991-06-27 15:51:29 +00005851
Barry Warsaw11b91a02004-06-28 00:50:43 +00005852/* Python interface to getservbyport(port).
5853 This only returns the service name, since the other info is already
5854 known or not useful (like the list of aliases). */
5855
5856/*ARGSUSED*/
5857static PyObject *
5858socket_getservbyport(PyObject *self, PyObject *args)
5859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005861 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 struct servent *sp;
5863 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5864 return NULL;
5865 if (port < 0 || port > 0xffff) {
5866 PyErr_SetString(
5867 PyExc_OverflowError,
5868 "getservbyport: port must be 0-65535.");
5869 return NULL;
5870 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005871
5872 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5873 return NULL;
5874 }
5875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 Py_BEGIN_ALLOW_THREADS
5877 sp = getservbyport(htons((short)port), proto);
5878 Py_END_ALLOW_THREADS
5879 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005880 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 return NULL;
5882 }
5883 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005884}
5885
5886PyDoc_STRVAR(getservbyport_doc,
5887"getservbyport(port[, protocolname]) -> string\n\
5888\n\
5889Return the service name from a port number and protocol name.\n\
5890The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5891otherwise any protocol will match.");
5892
Guido van Rossum3901d851996-12-19 16:35:04 +00005893/* Python interface to getprotobyname(name).
5894 This only returns the protocol number, since the other info is
5895 already known or not useful (like the list of aliases). */
5896
5897/*ARGSUSED*/
5898static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005899socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005900{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005901 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 struct protoent *sp;
5903 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5904 return NULL;
5905 Py_BEGIN_ALLOW_THREADS
5906 sp = getprotobyname(name);
5907 Py_END_ALLOW_THREADS
5908 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005909 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 return NULL;
5911 }
5912 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005913}
5914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005915PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005916"getprotobyname(name) -> integer\n\
5917\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005918Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005919
Christian Heimesd0e31b92018-01-27 09:54:13 +01005920static PyObject *
5921socket_close(PyObject *self, PyObject *fdobj)
5922{
5923 SOCKET_T fd;
5924 int res;
5925
5926 fd = PyLong_AsSocket_t(fdobj);
5927 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5928 return NULL;
5929 Py_BEGIN_ALLOW_THREADS
5930 res = SOCKETCLOSE(fd);
5931 Py_END_ALLOW_THREADS
5932 /* bpo-30319: The peer can already have closed the connection.
5933 Python ignores ECONNRESET on close(). */
5934 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5935 return set_error();
5936 }
5937 Py_RETURN_NONE;
5938}
5939
5940PyDoc_STRVAR(close_doc,
5941"close(integer) -> None\n\
5942\n\
5943Close an integer socket file descriptor. This is like os.close(), but for\n\
5944sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005945
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005946#ifndef NO_DUP
5947/* dup() function for socket fds */
5948
5949static PyObject *
5950socket_dup(PyObject *self, PyObject *fdobj)
5951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 SOCKET_T fd, newfd;
5953 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005954#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005955 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005956#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 fd = PyLong_AsSocket_t(fdobj);
5959 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5960 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005961
Victor Stinnerdaf45552013-08-28 00:53:59 +02005962#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005963 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005964 return set_error();
5965
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005966 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005967 FROM_PROTOCOL_INFO,
5968 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 if (newfd == INVALID_SOCKET)
5970 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005971
Victor Stinnerdaf45552013-08-28 00:53:59 +02005972 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5973 closesocket(newfd);
5974 PyErr_SetFromWindowsErr(0);
5975 return NULL;
5976 }
5977#else
5978 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5979 newfd = _Py_dup(fd);
5980 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005981 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005982#endif
5983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 newfdobj = PyLong_FromSocket_t(newfd);
5985 if (newfdobj == NULL)
5986 SOCKETCLOSE(newfd);
5987 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005988}
5989
5990PyDoc_STRVAR(dup_doc,
5991"dup(integer) -> integer\n\
5992\n\
5993Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5994sockets; on some platforms os.dup() won't work for socket file descriptors.");
5995#endif
5996
5997
Dave Cole331708b2004-08-09 04:51:41 +00005998#ifdef HAVE_SOCKETPAIR
5999/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006000 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006001 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006002
6003/*ARGSUSED*/
6004static PyObject *
6005socket_socketpair(PyObject *self, PyObject *args)
6006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 PySocketSockObject *s0 = NULL, *s1 = NULL;
6008 SOCKET_T sv[2];
6009 int family, type = SOCK_STREAM, proto = 0;
6010 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006011#ifdef SOCK_CLOEXEC
6012 int *atomic_flag_works = &sock_cloexec_works;
6013#else
6014 int *atomic_flag_works = NULL;
6015#endif
6016 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006017
6018#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006020#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6024 &family, &type, &proto))
6025 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006028 Py_BEGIN_ALLOW_THREADS
6029#ifdef SOCK_CLOEXEC
6030 if (sock_cloexec_works != 0) {
6031 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6032 if (sock_cloexec_works == -1) {
6033 if (ret >= 0) {
6034 sock_cloexec_works = 1;
6035 }
6036 else if (errno == EINVAL) {
6037 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6038 sock_cloexec_works = 0;
6039 ret = socketpair(family, type, proto, sv);
6040 }
6041 }
6042 }
6043 else
6044#endif
6045 {
6046 ret = socketpair(family, type, proto, sv);
6047 }
6048 Py_END_ALLOW_THREADS
6049
6050 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006052
6053 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6054 goto finally;
6055 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6056 goto finally;
6057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 s0 = new_sockobject(sv[0], family, type, proto);
6059 if (s0 == NULL)
6060 goto finally;
6061 s1 = new_sockobject(sv[1], family, type, proto);
6062 if (s1 == NULL)
6063 goto finally;
6064 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006065
6066finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 if (res == NULL) {
6068 if (s0 == NULL)
6069 SOCKETCLOSE(sv[0]);
6070 if (s1 == NULL)
6071 SOCKETCLOSE(sv[1]);
6072 }
6073 Py_XDECREF(s0);
6074 Py_XDECREF(s1);
6075 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006076}
6077
6078PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006079"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006080\n\
6081Create a pair of socket objects from the sockets returned by the platform\n\
6082socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006083The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006084AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006085
6086#endif /* HAVE_SOCKETPAIR */
6087
6088
Guido van Rossum006bf911996-06-12 04:04:55 +00006089static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006090socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006091{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006092 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006093
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006094 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 return NULL;
6096 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006097 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006099 "ntohs: can't convert negative Python int to C "
6100 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 return NULL;
6102 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006103 if (x > 0xffff) {
6104 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6105 "ntohs: Python int too large to convert to C "
6106 "16-bit unsigned integer (The silent truncation "
6107 "is deprecated)",
6108 1)) {
6109 return NULL;
6110 }
6111 }
6112 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006113}
6114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006115PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006116"ntohs(integer) -> integer\n\
6117\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006118Convert a 16-bit unsigned integer from network to host byte order.\n\
6119Note that in case the received integer does not fit in 16-bit unsigned\n\
6120integer, but does fit in a positive C int, it is silently truncated to\n\
612116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006122However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006123exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006124
6125
Guido van Rossum006bf911996-06-12 04:04:55 +00006126static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006127socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 if (PyLong_Check(arg)) {
6132 x = PyLong_AsUnsignedLong(arg);
6133 if (x == (unsigned long) -1 && PyErr_Occurred())
6134 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006135#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 {
6137 unsigned long y;
6138 /* only want the trailing 32 bits */
6139 y = x & 0xFFFFFFFFUL;
6140 if (y ^ x)
6141 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006142 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 x = y;
6144 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 }
6147 else
6148 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006149 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006152}
6153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006154PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006155"ntohl(integer) -> integer\n\
6156\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006157Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006158
6159
Guido van Rossum006bf911996-06-12 04:04:55 +00006160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006161socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006162{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006163 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006164
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006165 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 return NULL;
6167 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006168 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006170 "htons: can't convert negative Python int to C "
6171 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 return NULL;
6173 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006174 if (x > 0xffff) {
6175 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6176 "htons: Python int too large to convert to C "
6177 "16-bit unsigned integer (The silent truncation "
6178 "is deprecated)",
6179 1)) {
6180 return NULL;
6181 }
6182 }
6183 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006184}
6185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006186PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006187"htons(integer) -> integer\n\
6188\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006189Convert a 16-bit unsigned integer from host to network byte order.\n\
6190Note that in case the received integer does not fit in 16-bit unsigned\n\
6191integer, but does fit in a positive C int, it is silently truncated to\n\
619216-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006193However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006194exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006195
6196
Guido van Rossum006bf911996-06-12 04:04:55 +00006197static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006198socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 if (PyLong_Check(arg)) {
6203 x = PyLong_AsUnsignedLong(arg);
6204 if (x == (unsigned long) -1 && PyErr_Occurred())
6205 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006206#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 {
6208 unsigned long y;
6209 /* only want the trailing 32 bits */
6210 y = x & 0xFFFFFFFFUL;
6211 if (y ^ x)
6212 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006213 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214 x = y;
6215 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 }
6218 else
6219 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006220 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 Py_TYPE(arg)->tp_name);
6222 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006223}
6224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006225PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006226"htonl(integer) -> integer\n\
6227\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006228Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006229
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006230/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006231
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006232PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006233"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006234\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006235Convert 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 +00006236binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006237
6238static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006239socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006240{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006241#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006243#endif
6244
6245#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006246#if (SIZEOF_INT != 4)
6247#error "Not sure if in_addr_t exists and int is not 32-bits."
6248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 /* Have to use inet_addr() instead */
6250 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006251#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006252 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6255 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006256
Tim Peters1df9fdd2003-02-13 03:13:40 +00006257
6258#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006259
6260#ifdef USE_INET_ATON_WEAKLINK
6261 if (inet_aton != NULL) {
6262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 if (inet_aton(ip_addr, &buf))
6264 return PyBytes_FromStringAndSize((char *)(&buf),
6265 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006266
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006267 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 "illegal IP address string passed to inet_aton");
6269 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006270
Thomas Wouters477c8d52006-05-27 19:21:47 +00006271#ifdef USE_INET_ATON_WEAKLINK
6272 } else {
6273#endif
6274
6275#endif
6276
6277#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 /* special-case this address as inet_addr might return INADDR_NONE
6280 * for this */
6281 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006282 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006284
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006285 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006289 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 "illegal IP address string passed to inet_aton");
6291 return NULL;
6292 }
6293 }
6294 return PyBytes_FromStringAndSize((char *) &packed_addr,
6295 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006296
6297#ifdef USE_INET_ATON_WEAKLINK
6298 }
6299#endif
6300
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006301#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006302}
6303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006304PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006305"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006306\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006307Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006308
6309static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006310socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006311{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006312 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006314
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006315 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 return NULL;
6317 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006318
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006319 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006320 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006322 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 return NULL;
6324 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006325
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006326 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6327 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006328
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006329 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006331}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006332
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006333#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006334
6335PyDoc_STRVAR(inet_pton_doc,
6336"inet_pton(af, ip) -> packed IP address string\n\
6337\n\
6338Convert an IP address from string format to a packed string suitable\n\
6339for use with low-level network functions.");
6340
6341static PyObject *
6342socket_inet_pton(PyObject *self, PyObject *args)
6343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006345 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006347#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006348 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6353 return NULL;
6354 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006355
Martin v. Löwis04697e82004-06-02 12:35:29 +00006356#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006358 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 "can't use AF_INET6, IPv6 is disabled");
6360 return NULL;
6361 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006362#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 retval = inet_pton(af, ip, packed);
6365 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006366 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 return NULL;
6368 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006369 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 "illegal IP address string passed to inet_pton");
6371 return NULL;
6372 } else if (af == AF_INET) {
6373 return PyBytes_FromStringAndSize(packed,
6374 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006375#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 } else if (af == AF_INET6) {
6377 return PyBytes_FromStringAndSize(packed,
6378 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006381 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 return NULL;
6383 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006384}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006385
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006386PyDoc_STRVAR(inet_ntop_doc,
6387"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6388\n\
6389Convert a packed IP address of the given family to string format.");
6390
6391static PyObject *
6392socket_inet_ntop(PyObject *self, PyObject *args)
6393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006395 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006397#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006398 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006399#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006400 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006401#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006402
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006403 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 return NULL;
6405 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006408 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 PyErr_SetString(PyExc_ValueError,
6410 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006411 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 return NULL;
6413 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006414#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006416 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 PyErr_SetString(PyExc_ValueError,
6418 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006419 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 return NULL;
6421 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 } else {
6424 PyErr_Format(PyExc_ValueError,
6425 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006426 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 return NULL;
6428 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006429
Коренберг Марк7766b962018-02-13 00:47:42 +05006430 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006431 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6432 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006434 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 return NULL;
6436 } else {
6437 return PyUnicode_FromString(retval);
6438 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006439}
6440
6441#endif /* HAVE_INET_PTON */
6442
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006443/* Python interface to getaddrinfo(host, port). */
6444
6445/*ARGSUSED*/
6446static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006447socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006448{
Victor Stinner77af1722011-05-26 14:05:59 +02006449 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006450 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 struct addrinfo hints, *res;
6452 struct addrinfo *res0 = NULL;
6453 PyObject *hobj = NULL;
6454 PyObject *pobj = (PyObject *)NULL;
6455 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006456 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 int family, socktype, protocol, flags;
6458 int error;
6459 PyObject *all = (PyObject *)NULL;
6460 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006461
Georg Brandl6083a4b2013-10-14 06:51:46 +02006462 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006464 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006465 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 &protocol, &flags)) {
6467 return NULL;
6468 }
6469 if (hobj == Py_None) {
6470 hptr = NULL;
6471 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006472 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 if (!idna)
6474 return NULL;
6475 assert(PyBytes_Check(idna));
6476 hptr = PyBytes_AS_STRING(idna);
6477 } else if (PyBytes_Check(hobj)) {
6478 hptr = PyBytes_AsString(hobj);
6479 } else {
6480 PyErr_SetString(PyExc_TypeError,
6481 "getaddrinfo() argument 1 must be string or None");
6482 return NULL;
6483 }
6484 if (PyLong_CheckExact(pobj)) {
6485 long value = PyLong_AsLong(pobj);
6486 if (value == -1 && PyErr_Occurred())
6487 goto err;
6488 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6489 pptr = pbuf;
6490 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006491 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006492 if (pptr == NULL)
6493 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006495 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 } else if (pobj == Py_None) {
6497 pptr = (char *)NULL;
6498 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006499 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 goto err;
6501 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006502#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006503 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006504 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006505 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6506 * This workaround avoids a segfault in libsystem.
6507 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006508 pptr = "00";
6509 }
6510#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006511
6512 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6513 hobj, pobj, family, socktype, protocol) < 0) {
6514 return NULL;
6515 }
6516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 memset(&hints, 0, sizeof(hints));
6518 hints.ai_family = family;
6519 hints.ai_socktype = socktype;
6520 hints.ai_protocol = protocol;
6521 hints.ai_flags = flags;
6522 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523 error = getaddrinfo(hptr, pptr, &hints, &res0);
6524 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 if (error) {
6526 set_gaierror(error);
6527 goto err;
6528 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006529
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006530 all = PyList_New(0);
6531 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 goto err;
6533 for (res = res0; res; res = res->ai_next) {
6534 PyObject *single;
6535 PyObject *addr =
6536 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6537 if (addr == NULL)
6538 goto err;
6539 single = Py_BuildValue("iiisO", res->ai_family,
6540 res->ai_socktype, res->ai_protocol,
6541 res->ai_canonname ? res->ai_canonname : "",
6542 addr);
6543 Py_DECREF(addr);
6544 if (single == NULL)
6545 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006546
Zackery Spytz4c596d52018-11-14 15:39:01 -07006547 if (PyList_Append(all, single)) {
6548 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006550 }
6551 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 }
6553 Py_XDECREF(idna);
6554 if (res0)
6555 freeaddrinfo(res0);
6556 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006557 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 Py_XDECREF(all);
6559 Py_XDECREF(idna);
6560 if (res0)
6561 freeaddrinfo(res0);
6562 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563}
6564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006565PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006566"getaddrinfo(host, port [, family, type, proto, flags])\n\
6567 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006568\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006569Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006570
6571/* Python interface to getnameinfo(sa, flags). */
6572
6573/*ARGSUSED*/
6574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006575socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyObject *sa = (PyObject *)NULL;
6578 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006579 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006580 int port;
6581 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6583 struct addrinfo hints, *res = NULL;
6584 int error;
6585 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006586 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 flags = flowinfo = scope_id = 0;
6589 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6590 return NULL;
6591 if (!PyTuple_Check(sa)) {
6592 PyErr_SetString(PyExc_TypeError,
6593 "getnameinfo() argument 1 must be a tuple");
6594 return NULL;
6595 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006596 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006598 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006600 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006601 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006602 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006603 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006604 return NULL;
6605 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006606
6607 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6608 return NULL;
6609 }
6610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6612 memset(&hints, 0, sizeof(hints));
6613 hints.ai_family = AF_UNSPEC;
6614 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006615 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 error = getaddrinfo(hostp, pbuf, &hints, &res);
6618 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 if (error) {
6620 set_gaierror(error);
6621 goto fail;
6622 }
6623 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006624 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 "sockaddr resolved to multiple addresses");
6626 goto fail;
6627 }
6628 switch (res->ai_family) {
6629 case AF_INET:
6630 {
6631 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006632 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 "IPv4 sockaddr must be 2 tuple");
6634 goto fail;
6635 }
6636 break;
6637 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006638#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 case AF_INET6:
6640 {
6641 struct sockaddr_in6 *sin6;
6642 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006643 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 sin6->sin6_scope_id = scope_id;
6645 break;
6646 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006649 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6651 if (error) {
6652 set_gaierror(error);
6653 goto fail;
6654 }
Victor Stinner72400302016-01-28 15:41:01 +01006655
6656 name = sock_decode_hostname(hbuf);
6657 if (name == NULL)
6658 goto fail;
6659 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006660
6661fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 if (res)
6663 freeaddrinfo(res);
6664 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006665}
6666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006667PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006668"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006669\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006670Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006671
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006672
6673/* Python API to getting and setting the default timeout value. */
6674
6675static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306676socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006677{
Victor Stinner71694d52015-03-28 01:18:54 +01006678 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006679 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 }
Victor Stinner71694d52015-03-28 01:18:54 +01006681 else {
6682 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6683 return PyFloat_FromDouble(seconds);
6684 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006685}
6686
6687PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006688"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006689\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006690Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006691A value of None indicates that new socket objects have no timeout.\n\
6692When the socket module is first imported, the default is None.");
6693
6694static PyObject *
6695socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6696{
Victor Stinner71694d52015-03-28 01:18:54 +01006697 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006698
Victor Stinner71694d52015-03-28 01:18:54 +01006699 if (socket_parse_timeout(&timeout, arg) < 0)
6700 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006703
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006704 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006705}
6706
6707PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006708"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006709\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006710Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006711A value of None indicates that new socket objects have no timeout.\n\
6712When the socket module is first imported, the default is None.");
6713
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006714#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006715/* Python API for getting interface indices and names */
6716
6717static PyObject *
6718socket_if_nameindex(PyObject *self, PyObject *arg)
6719{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006720 PyObject *list = PyList_New(0);
6721 if (list == NULL) {
6722 return NULL;
6723 }
6724#ifdef MS_WINDOWS
6725 PMIB_IF_TABLE2 tbl;
6726 int ret;
6727 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6728 Py_DECREF(list);
6729 // ret is used instead of GetLastError()
6730 return PyErr_SetFromWindowsErr(ret);
6731 }
6732 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6733 MIB_IF_ROW2 r = tbl->Table[i];
6734 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6735 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6736 Py_ARRAY_LENGTH(buf)))) {
6737 Py_DECREF(list);
6738 FreeMibTable(tbl);
6739 // ret is used instead of GetLastError()
6740 return PyErr_SetFromWindowsErr(ret);
6741 }
6742 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6743 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6744 Py_XDECREF(tuple);
6745 Py_DECREF(list);
6746 FreeMibTable(tbl);
6747 return NULL;
6748 }
6749 Py_DECREF(tuple);
6750 }
6751 FreeMibTable(tbl);
6752 return list;
6753#else
Charles-François Natali60713592011-05-20 16:55:06 +02006754 int i;
6755 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006756
Charles-François Natali60713592011-05-20 16:55:06 +02006757 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006758 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006759 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006760 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006761 return NULL;
6762 }
6763
Gregory P. Smithb474e672018-12-30 17:05:36 -08006764#ifdef _Py_MEMORY_SANITIZER
6765 __msan_unpoison(ni, sizeof(ni));
6766 __msan_unpoison(&ni[0], sizeof(ni[0]));
6767#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006768 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006769#ifdef _Py_MEMORY_SANITIZER
6770 /* This one isn't the end sentinel, the next one must exist. */
6771 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6772 /* Otherwise Py_BuildValue internals are flagged by MSan when
6773 they access the not-msan-tracked if_name string data. */
6774 {
6775 char *to_sanitize = ni[i].if_name;
6776 do {
6777 __msan_unpoison(to_sanitize, 1);
6778 } while (*to_sanitize++ != '\0');
6779 }
6780#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006781 PyObject *ni_tuple = Py_BuildValue("IO&",
6782 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006783
6784 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6785 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006786 Py_DECREF(list);
6787 if_freenameindex(ni);
6788 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006789 }
6790 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006791 }
6792
6793 if_freenameindex(ni);
6794 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006795#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006796}
6797
6798PyDoc_STRVAR(if_nameindex_doc,
6799"if_nameindex()\n\
6800\n\
6801Returns a list of network interface information (index, name) tuples.");
6802
Charles-François Natali60713592011-05-20 16:55:06 +02006803static PyObject *
6804socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006805{
Charles-François Natali60713592011-05-20 16:55:06 +02006806 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006807#ifdef MS_WINDOWS
6808 NET_IFINDEX index;
6809#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006810 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006811#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006812 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6813 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006814 return NULL;
6815
Charles-François Natali60713592011-05-20 16:55:06 +02006816 index = if_nametoindex(PyBytes_AS_STRING(oname));
6817 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006818 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006819 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006820 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006821 return NULL;
6822 }
6823
6824 return PyLong_FromUnsignedLong(index);
6825}
6826
6827PyDoc_STRVAR(if_nametoindex_doc,
6828"if_nametoindex(if_name)\n\
6829\n\
6830Returns the interface index corresponding to the interface name if_name.");
6831
Charles-François Natali60713592011-05-20 16:55:06 +02006832static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006833socket_if_indextoname(PyObject *self, PyObject *arg)
6834{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006835#ifdef MS_WINDOWS
6836 NET_IFINDEX index;
6837#else
Charles-François Natali60713592011-05-20 16:55:06 +02006838 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006839#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006840 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006841
Charles-François Natali60713592011-05-20 16:55:06 +02006842 index = PyLong_AsUnsignedLong(arg);
6843 if (index == (unsigned long) -1)
6844 return NULL;
6845
6846 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006847 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006848 return NULL;
6849 }
6850
Charles-François Natali60713592011-05-20 16:55:06 +02006851 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006852}
6853
6854PyDoc_STRVAR(if_indextoname_doc,
6855"if_indextoname(if_index)\n\
6856\n\
6857Returns the interface name corresponding to the interface index if_index.");
6858
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006859#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006860
6861
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006862#ifdef CMSG_LEN
6863/* Python interface to CMSG_LEN(length). */
6864
6865static PyObject *
6866socket_CMSG_LEN(PyObject *self, PyObject *args)
6867{
6868 Py_ssize_t length;
6869 size_t result;
6870
6871 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6872 return NULL;
6873 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6874 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6875 return NULL;
6876 }
6877 return PyLong_FromSize_t(result);
6878}
6879
6880PyDoc_STRVAR(CMSG_LEN_doc,
6881"CMSG_LEN(length) -> control message length\n\
6882\n\
6883Return the total length, without trailing padding, of an ancillary\n\
6884data item with associated data of the given length. This value can\n\
6885often be used as the buffer size for recvmsg() to receive a single\n\
6886item of ancillary data, but RFC 3542 requires portable applications to\n\
6887use CMSG_SPACE() and thus include space for padding, even when the\n\
6888item will be the last in the buffer. Raises OverflowError if length\n\
6889is outside the permissible range of values.");
6890
6891
6892#ifdef CMSG_SPACE
6893/* Python interface to CMSG_SPACE(length). */
6894
6895static PyObject *
6896socket_CMSG_SPACE(PyObject *self, PyObject *args)
6897{
6898 Py_ssize_t length;
6899 size_t result;
6900
6901 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6902 return NULL;
6903 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6904 PyErr_SetString(PyExc_OverflowError,
6905 "CMSG_SPACE() argument out of range");
6906 return NULL;
6907 }
6908 return PyLong_FromSize_t(result);
6909}
6910
6911PyDoc_STRVAR(CMSG_SPACE_doc,
6912"CMSG_SPACE(length) -> buffer size\n\
6913\n\
6914Return the buffer size needed for recvmsg() to receive an ancillary\n\
6915data item with associated data of the given length, along with any\n\
6916trailing padding. The buffer space needed to receive multiple items\n\
6917is the sum of the CMSG_SPACE() values for their associated data\n\
6918lengths. Raises OverflowError if length is outside the permissible\n\
6919range of values.");
6920#endif /* CMSG_SPACE */
6921#endif /* CMSG_LEN */
6922
6923
Guido van Rossum30a685f1991-06-27 15:51:29 +00006924/* List of functions exported by this module. */
6925
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006926static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927 {"gethostbyname", socket_gethostbyname,
6928 METH_VARARGS, gethostbyname_doc},
6929 {"gethostbyname_ex", socket_gethostbyname_ex,
6930 METH_VARARGS, ghbn_ex_doc},
6931 {"gethostbyaddr", socket_gethostbyaddr,
6932 METH_VARARGS, gethostbyaddr_doc},
6933 {"gethostname", socket_gethostname,
6934 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006935#ifdef HAVE_SETHOSTNAME
6936 {"sethostname", socket_sethostname,
6937 METH_VARARGS, sethostname_doc},
6938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939 {"getservbyname", socket_getservbyname,
6940 METH_VARARGS, getservbyname_doc},
6941 {"getservbyport", socket_getservbyport,
6942 METH_VARARGS, getservbyport_doc},
6943 {"getprotobyname", socket_getprotobyname,
6944 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006945 {"close", socket_close,
6946 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006947#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 {"dup", socket_dup,
6949 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006950#endif
Dave Cole331708b2004-08-09 04:51:41 +00006951#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 {"socketpair", socket_socketpair,
6953 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 {"ntohs", socket_ntohs,
6956 METH_VARARGS, ntohs_doc},
6957 {"ntohl", socket_ntohl,
6958 METH_O, ntohl_doc},
6959 {"htons", socket_htons,
6960 METH_VARARGS, htons_doc},
6961 {"htonl", socket_htonl,
6962 METH_O, htonl_doc},
6963 {"inet_aton", socket_inet_aton,
6964 METH_VARARGS, inet_aton_doc},
6965 {"inet_ntoa", socket_inet_ntoa,
6966 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006967#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 {"inet_pton", socket_inet_pton,
6969 METH_VARARGS, inet_pton_doc},
6970 {"inet_ntop", socket_inet_ntop,
6971 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006972#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006973 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006974 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975 {"getnameinfo", socket_getnameinfo,
6976 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306977 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978 METH_NOARGS, getdefaulttimeout_doc},
6979 {"setdefaulttimeout", socket_setdefaulttimeout,
6980 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006981#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006982 {"if_nameindex", socket_if_nameindex,
6983 METH_NOARGS, if_nameindex_doc},
6984 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006985 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006986 {"if_indextoname", socket_if_indextoname,
6987 METH_O, if_indextoname_doc},
6988#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006989#ifdef CMSG_LEN
6990 {"CMSG_LEN", socket_CMSG_LEN,
6991 METH_VARARGS, CMSG_LEN_doc},
6992#ifdef CMSG_SPACE
6993 {"CMSG_SPACE", socket_CMSG_SPACE,
6994 METH_VARARGS, CMSG_SPACE_doc},
6995#endif
6996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006997 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006998};
6999
Guido van Rossum30a685f1991-06-27 15:51:29 +00007000
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007001#ifdef MS_WINDOWS
7002#define OS_INIT_DEFINED
7003
7004/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007005
7006static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007007os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007010}
7011
7012static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007013os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 WSADATA WSAData;
7016 int ret;
7017 ret = WSAStartup(0x0101, &WSAData);
7018 switch (ret) {
7019 case 0: /* No error */
7020 Py_AtExit(os_cleanup);
7021 return 1; /* Success */
7022 case WSASYSNOTREADY:
7023 PyErr_SetString(PyExc_ImportError,
7024 "WSAStartup failed: network not ready");
7025 break;
7026 case WSAVERNOTSUPPORTED:
7027 case WSAEINVAL:
7028 PyErr_SetString(
7029 PyExc_ImportError,
7030 "WSAStartup failed: requested version not supported");
7031 break;
7032 default:
7033 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7034 break;
7035 }
7036 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007037}
7038
Guido van Rossum8d665e61996-06-26 18:22:49 +00007039#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007040
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007041
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007042
7043#ifndef OS_INIT_DEFINED
7044static int
7045os_init(void)
7046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007048}
7049#endif
7050
7051
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007052/* C API table - always add new things to the end for binary
7053 compatibility. */
7054static
7055PySocketModule_APIObject PySocketModuleAPI =
7056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007057 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007058 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007060};
7061
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007062
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007063/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007064
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007065 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007066 "socket.py" which implements some additional functionality.
7067 The import of "_socket" may fail with an ImportError exception if
7068 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007069 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007070 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007071*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007073PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007074"Implementation module for socket operations.\n\
7075\n\
7076See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007077
Martin v. Löwis1a214512008-06-11 05:26:20 +00007078static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079 PyModuleDef_HEAD_INIT,
7080 PySocket_MODULE_NAME,
7081 socket_doc,
7082 -1,
7083 socket_methods,
7084 NULL,
7085 NULL,
7086 NULL,
7087 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007088};
7089
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007090PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007091PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007093 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 if (!os_init())
7096 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007097
Victor Stinnerdaf45552013-08-28 00:53:59 +02007098#ifdef MS_WINDOWS
7099 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007100 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007101 }
7102#endif
7103
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007104 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105 m = PyModule_Create(&socketmodule);
7106 if (m == NULL)
7107 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007108
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007109 Py_INCREF(PyExc_OSError);
7110 PySocketModuleAPI.error = PyExc_OSError;
7111 Py_INCREF(PyExc_OSError);
7112 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007114 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 if (socket_herror == NULL)
7116 return NULL;
7117 Py_INCREF(socket_herror);
7118 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007119 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 NULL);
7121 if (socket_gaierror == NULL)
7122 return NULL;
7123 Py_INCREF(socket_gaierror);
7124 PyModule_AddObject(m, "gaierror", socket_gaierror);
Christian Heimes03c8ddd2020-11-20 09:26:07 +01007125
7126 PySocketModuleAPI.timeout_error = PyExc_TimeoutError;
7127 PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError);
7128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 Py_INCREF((PyObject *)&sock_type);
7130 if (PyModule_AddObject(m, "SocketType",
7131 (PyObject *)&sock_type) != 0)
7132 return NULL;
7133 Py_INCREF((PyObject *)&sock_type);
7134 if (PyModule_AddObject(m, "socket",
7135 (PyObject *)&sock_type) != 0)
7136 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007137
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007138#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 Py_INCREF(has_ipv6);
7144 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 /* Export C API */
7147 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7148 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7149 ) != 0)
7150 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007153#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007155#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007157#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007159#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007160#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007161 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007163#endif
7164#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007166#endif
7167#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007170#endif
7171#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007174#endif
7175#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007176 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007178#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007179#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007182#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007183#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007186#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007187#ifdef HAVE_SOCKADDR_ALG
7188 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7189#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007190#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007193#endif
7194#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007196#endif
7197#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007200#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007201#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007204#endif
7205#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007208#endif
7209#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007212#endif
7213#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007216#endif
7217#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AF_NETLINK);
7220 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007221#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007223#endif
7224#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007226#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7228 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007229#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007231#endif
7232#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007234#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007235#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007237#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007238#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007240#endif
7241#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007243#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007245#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007247#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007248#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007250#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007251#ifdef NETLINK_CRYPTO
7252 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7253#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007254#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007255
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007256#ifdef AF_QIPCRTR
7257 /* Qualcomm IPCROUTER */
7258 PyModule_AddIntMacro(m, AF_QIPCRTR);
7259#endif
7260
caaveryeffc12f2017-09-06 18:18:10 -04007261#ifdef AF_VSOCK
7262 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7263 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7264 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7265 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7266 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7267 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7268 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7269 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7270 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7271#endif
7272
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007273#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007276#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007277#ifdef AF_LINK
7278 PyModule_AddIntMacro(m, AF_LINK);
7279#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007280#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007283#endif
7284#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007287#endif
7288#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007291#endif
7292#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007295#endif
7296#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007299#endif
7300#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007303#endif
7304#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007307#endif
7308#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007311#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007312
Hye-Shik Chang81268602004-02-02 06:05:24 +00007313#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007315#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007317#endif /* BTPROTO_L2CAP */
7318#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, BTPROTO_HCI);
7320 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007321#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007323#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007326#endif /* !__FreeBSD__ */
7327#endif /* !__NetBSD__ && !__DragonFly__ */
7328#endif /* BTPROTO_HCI */
7329#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007331#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7333 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007334#ifdef BTPROTO_SCO
7335 PyModule_AddIntMacro(m, BTPROTO_SCO);
7336#endif /* BTPROTO_SCO */
7337#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007338
Charles-François Natali47413c12011-10-06 19:47:44 +02007339#ifdef AF_CAN
7340 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007342#endif
7343#ifdef PF_CAN
7344 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007346#endif
7347
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007348/* Reliable Datagram Sockets */
7349#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007351#endif
7352#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007354#endif
7355
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007356/* Kernel event messages */
7357#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007359#endif
7360#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007362#endif
7363
Antoine Pitroub156a462010-10-27 20:13:57 +00007364#ifdef AF_PACKET
7365 PyModule_AddIntMacro(m, AF_PACKET);
7366#endif
7367#ifdef PF_PACKET
7368 PyModule_AddIntMacro(m, PF_PACKET);
7369#endif
7370#ifdef PACKET_HOST
7371 PyModule_AddIntMacro(m, PACKET_HOST);
7372#endif
7373#ifdef PACKET_BROADCAST
7374 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7375#endif
7376#ifdef PACKET_MULTICAST
7377 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7378#endif
7379#ifdef PACKET_OTHERHOST
7380 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7381#endif
7382#ifdef PACKET_OUTGOING
7383 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7384#endif
7385#ifdef PACKET_LOOPBACK
7386 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7387#endif
7388#ifdef PACKET_FASTROUTE
7389 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007390#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007391
Christian Heimes043d6f62008-01-07 17:19:16 +00007392#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7397 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7398 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007399
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7401 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7402 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007404 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, SOL_TIPC);
7406 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7407 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7408 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7409 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007410
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7412 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7413 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7414 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7418 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007419#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007422#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7424 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7425 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7426 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7427 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7428 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007429#endif
7430
Christian Heimesdffa3942016-09-05 23:54:41 +02007431#ifdef HAVE_SOCKADDR_ALG
7432 /* Socket options */
7433 PyModule_AddIntMacro(m, ALG_SET_KEY);
7434 PyModule_AddIntMacro(m, ALG_SET_IV);
7435 PyModule_AddIntMacro(m, ALG_SET_OP);
7436 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7437 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7438 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7439
7440 /* Operations */
7441 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7442 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7443 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7444 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7445#endif
7446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007447 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, SOCK_STREAM);
7449 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007450/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007451#ifdef SOCK_RAW
7452 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007454#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007456#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007458#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007459#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007461#endif
7462#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007464#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007474#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007475#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007477#endif
7478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007479#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007482#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007485#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007496#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007497#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007500#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007508#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007528#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007529#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007531#endif
7532#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007534#endif
7535#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007537#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007538#ifdef SO_PASSSEC
7539 PyModule_AddIntMacro(m, SO_PASSSEC);
7540#endif
7541#ifdef SO_PEERSEC
7542 PyModule_AddIntMacro(m, SO_PEERSEC);
7543#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007544#ifdef SO_BINDTODEVICE
7545 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7546#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007547#ifdef SO_PRIORITY
7548 PyModule_AddIntMacro(m, SO_PRIORITY);
7549#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007550#ifdef SO_MARK
7551 PyModule_AddIntMacro(m, SO_MARK);
7552#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007553#ifdef SO_DOMAIN
7554 PyModule_AddIntMacro(m, SO_DOMAIN);
7555#endif
7556#ifdef SO_PROTOCOL
7557 PyModule_AddIntMacro(m, SO_PROTOCOL);
7558#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007560 /* Maximum number of connections for "listen" */
7561#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007565#endif
7566
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007567 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007568#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007570#endif
7571#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007573#endif
7574#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007576#endif
7577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 /* Flags for send, recv */
7579#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007609#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007611#endif
7612#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007614#endif
7615#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007617#endif
7618#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007620#endif
7621#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007623#endif
7624#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007626#endif
7627#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007629#endif
7630#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007632#endif
7633#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007635#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007636#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007638#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007640 /* Protocol level and numbers, usable for [gs]etsockopt */
7641#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007646#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007649#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007651#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007652#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007655#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007658#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007661#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007664#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007671#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007672 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007673#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007674#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007676#endif
7677#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7679 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007680#endif
7681#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7683 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7684 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007685
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7687 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7688 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007689#ifdef CAN_ISOTP
7690 PyModule_AddIntMacro(m, CAN_ISOTP);
7691#endif
karl ding360371f2020-04-29 15:31:19 -07007692#ifdef CAN_J1939
7693 PyModule_AddIntMacro(m, CAN_J1939);
7694#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007695#endif
7696#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7698 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7699 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7700 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007701#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007702#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7703 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7704#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007705#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7706 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7707#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007708#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007710
7711 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007712 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7713 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7714 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7715 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7716 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7717 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7718 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7719 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7720 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7721 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7722 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7723 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007724
7725 /* BCM flags */
7726 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7727 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7728 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7729 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7730 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7731 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7732 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7733 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7734 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7735 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7736 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7737#ifdef CAN_FD_FRAME
7738 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7739 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7740#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007741#endif
karl ding360371f2020-04-29 15:31:19 -07007742#ifdef HAVE_LINUX_CAN_J1939_H
7743 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7744 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7745 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7746 PyModule_AddIntMacro(m, J1939_NO_NAME);
7747 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7748 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7749 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7750 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7751 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7752 PyModule_AddIntMacro(m, J1939_NO_PGN);
7753
7754 /* J1939 socket options */
7755 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7756 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7757 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7758 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7759
7760 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7761 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7762 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7763 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7764
7765 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7766 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7767
7768 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7769 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7770
7771 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7772#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007773#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007774 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007775#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007776#ifdef HAVE_SOCKADDR_ALG
7777 PyModule_AddIntMacro(m, SOL_ALG);
7778#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007779#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007781#endif
7782#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007783 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007784#endif
7785#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007787#endif
7788#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007790#endif
7791#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007793#endif
7794#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007797#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007799#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007800 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007802#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007805#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007806 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007807#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007808 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007810#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007813#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007816#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007827#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007830#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007831 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007833#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007834 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007836#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007837 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007838#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007839 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007840#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007841#ifdef IPPROTO_UDPLITE
7842 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7843 #ifndef UDPLITE_SEND_CSCOV
7844 #define UDPLITE_SEND_CSCOV 10
7845 #endif
7846 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7847 #ifndef UDPLITE_RECV_CSCOV
7848 #define UDPLITE_RECV_CSCOV 11
7849 #endif
7850 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007852#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007855#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007858#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007861#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007864#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007873#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007879#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007888#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007891#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007894#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007897#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007900#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007906#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007908#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007909#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007912#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007914#endif
7915/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007916#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007917 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007918#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007919 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007923#endif
7924
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007925#ifdef MS_WINDOWS
7926 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7927 PyModule_AddIntMacro(m, IPPROTO_ST);
7928 PyModule_AddIntMacro(m, IPPROTO_CBT);
7929 PyModule_AddIntMacro(m, IPPROTO_IGP);
7930 PyModule_AddIntMacro(m, IPPROTO_RDP);
7931 PyModule_AddIntMacro(m, IPPROTO_PGM);
7932 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7933 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7934#endif
7935
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007936#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007938#endif
7939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007940 /* Some port configuration */
7941#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007942 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007943#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007947 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007948#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007950#endif
7951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007952 /* Some reserved IP v.4 addresses */
7953#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007954 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007955#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007956 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007958#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007960#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007963#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007965#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef INADDR_ALLHOSTS_GROUP
7974 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7975 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007976#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007977 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007979#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007980 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007981#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007982 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007984#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007985 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007987 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007988#endif
7989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007990 /* IPv4 [gs]etsockopt options */
7991#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007992 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007995 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007998 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008000#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008001 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008003#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008004 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008006#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008007 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008013 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008019 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008021#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008022 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008024#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008025 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008028 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008030#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008031 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008033#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008034 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008036#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008037 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008038#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008039#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008040 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008041#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008043 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8044#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008045 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008047#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008048 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008050#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008051 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008053#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008054 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008056#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008057 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008059#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008062 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008063#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008064 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008066 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008067#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008068 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008069#endif
8070#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008071 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008072#endif
8073#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008074 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008075#endif
8076#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008077 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008078#endif
8079#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008080 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008081#endif
8082#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008083 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008084#endif
8085#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008087#endif
8088#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008090#endif
8091#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008093#endif
8094#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008096#endif
8097#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008099#endif
8100#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008102#endif
8103#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008105#endif
8106#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008108#endif
8109#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008111#endif
8112#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008114#endif
8115#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008117#endif
8118#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008120#endif
8121#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008123#endif
8124#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008126#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008128 /* TCP options */
8129#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008130 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008132#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008133 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008135#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008136 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008138#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008139 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008141#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008142 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008144#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008147#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008150#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008151 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008153#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008154 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008156#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008157 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008159#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008160 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008162#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008163 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008164#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008165#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008166 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008167#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008168#ifdef TCP_CONGESTION
8169 PyModule_AddIntMacro(m, TCP_CONGESTION);
8170#endif
8171#ifdef TCP_USER_TIMEOUT
8172 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8173#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008174#ifdef TCP_NOTSENT_LOWAT
8175 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8176#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008178 /* IPX options */
8179#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008180 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008181#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008182
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008183/* Reliable Datagram Sockets */
8184#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008185 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008186#endif
8187#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008188 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008189#endif
8190#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008191 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008192#endif
8193#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008194 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008195#endif
8196#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008197 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008198#endif
8199#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008200 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008201#endif
8202#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008203 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008204#endif
8205#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008206 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008207#endif
8208#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008209 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008210#endif
8211#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008212 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008213#endif
8214#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008215 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008216#endif
8217#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008218 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008219#endif
8220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008221 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008222#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008224#endif
8225#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008226 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008227#endif
8228#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008229 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008230#endif
8231#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008232 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008233#endif
8234#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008235 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008236#endif
8237#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008238 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008239#endif
8240#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008241 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008242#endif
8243#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008244 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008245#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008246#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008248#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008249#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008250 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008251#endif
8252#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008253 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008254#endif
8255#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008256 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008257#endif
8258#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008259 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008260#endif
8261#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008263#endif
8264#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008265 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008266#endif
8267#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008268 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008269#endif
8270#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008271 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008272#endif
8273#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008274 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008275#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008276#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008277 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008278#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008279#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008280 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008281#endif
8282#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008283 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008284#endif
8285#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008287#endif
8288#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008289 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008290#endif
8291#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008292 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008293#endif
8294#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008295 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008296#endif
8297#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008298 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008299#endif
8300#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008301 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008302#endif
8303#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008304 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008305#endif
8306#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008307 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008308#endif
8309#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008310 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008311#endif
8312#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008313 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008314#endif
8315#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008316 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008317#endif
8318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008319 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008320#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008321 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008322#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008323 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008324#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008325 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008326#endif
8327#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008328 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008329#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008330 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008332 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008333#endif
8334#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008335 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008336#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008337 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008338#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008339 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008340#endif
8341
Christian Heimesfaf2f632008-01-06 16:59:19 +00008342#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008343 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008344 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8345#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008346 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008347#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008348 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008349 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8350#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008351 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008352#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008353 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008354 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008355 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008356 PyObject *tmp;
8357 tmp = PyLong_FromUnsignedLong(codes[i]);
8358 if (tmp == NULL)
8359 return NULL;
8360 PyModule_AddObject(m, names[i], tmp);
8361 }
8362 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008363 PyModule_AddIntMacro(m, RCVALL_OFF);
8364 PyModule_AddIntMacro(m, RCVALL_ON);
8365 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008366#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008367 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008368#endif
8369#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008370 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008371#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008372#endif /* _MSTCPIP_ */
8373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008374 /* Initialize gethostbyname lock */
Victor Stinner0de437d2020-05-28 17:23:39 +02008375#if defined(USE_GETHOSTBYNAME_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008376 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008377#endif
animalize19e7d482018-02-27 02:10:36 +08008378
8379#ifdef MS_WINDOWS
8380 /* remove some flags on older version Windows during run-time */
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02008381 if (remove_unusable_flags(m) < 0) {
8382 Py_DECREF(m);
8383 return NULL;
8384 }
animalize19e7d482018-02-27 02:10:36 +08008385#endif
8386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008387 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008388}