blob: 0f56d94229fbaf874b5f06c18d69d3d5cb0e0746 [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\
Christian Heimescf3565c2020-12-23 08:25:57 +01003368Return the address of the local endpoint. The format depends on the\n\
3369address family. For IPv4 sockets, the address info is a pair\n\
3370(hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003371
Guido van Rossumc89705d1992-11-26 08:54:07 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003374/* s.getpeername() method */
3375
Guido van Rossum73624e91994-10-10 17:59:00 +00003376static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303377sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 sock_addr_t addrbuf;
3380 int res;
3381 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 if (!getsockaddrlen(s, &addrlen))
3384 return NULL;
3385 memset(&addrbuf, 0, addrlen);
3386 Py_BEGIN_ALLOW_THREADS
3387 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3388 Py_END_ALLOW_THREADS
3389 if (res < 0)
3390 return s->errorhandler();
3391 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3392 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003393}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003395PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003396"getpeername() -> address info\n\
3397\n\
3398Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003399info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003400
Guido van Rossumb6775db1994-08-01 11:34:53 +00003401#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003402
3403
Guido van Rossum30a685f1991-06-27 15:51:29 +00003404/* s.listen(n) method */
3405
Guido van Rossum73624e91994-10-10 17:59:00 +00003406static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003407sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003408{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003409 /* We try to choose a default backlog high enough to avoid connection drops
3410 * for common workloads, yet not too high to limit resource usage. */
3411 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003413
Charles-François Natali644b8f52014-05-22 19:45:39 +01003414 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003418 /* To avoid problems on systems that don't allow a negative backlog
3419 * (which doesn't make sense anyway) we force a minimum value of 0. */
3420 if (backlog < 0)
3421 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 res = listen(s->sock_fd, backlog);
3423 Py_END_ALLOW_THREADS
3424 if (res < 0)
3425 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003426 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003427}
3428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003429PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003430"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003431\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003432Enable a server to accept connections. If backlog is specified, it must be\n\
3433at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003434unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003435connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003436
Victor Stinner31bf2d52015-04-01 21:57:09 +02003437struct sock_recv {
3438 char *cbuf;
3439 Py_ssize_t len;
3440 int flags;
3441 Py_ssize_t result;
3442};
3443
3444static int
3445sock_recv_impl(PySocketSockObject *s, void *data)
3446{
3447 struct sock_recv *ctx = data;
3448
3449#ifdef MS_WINDOWS
3450 if (ctx->len > INT_MAX)
3451 ctx->len = INT_MAX;
3452 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3453#else
3454 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3455#endif
3456 return (ctx->result >= 0);
3457}
3458
Guido van Rossum82a5c661998-07-07 20:45:43 +00003459
Thomas Wouters477c8d52006-05-27 19:21:47 +00003460/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003461 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003462 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003463 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003464 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003465 * also possible that we return a number of bytes smaller than the request
3466 * bytes.
3467 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003468
Antoine Pitrou19467d22010-08-17 19:33:30 +00003469static Py_ssize_t
3470sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003471{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003472 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 if (!IS_SELECTABLE(s)) {
3475 select_error();
3476 return -1;
3477 }
3478 if (len == 0) {
3479 /* If 0 bytes were requested, do nothing. */
3480 return 0;
3481 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003482
Victor Stinner31bf2d52015-04-01 21:57:09 +02003483 ctx.cbuf = cbuf;
3484 ctx.len = len;
3485 ctx.flags = flags;
3486 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003488
3489 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003490}
3491
Guido van Rossum48a680c2001-03-02 06:34:14 +00003492
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003493/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003494
Guido van Rossum73624e91994-10-10 17:59:00 +00003495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003496sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003497{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003498 Py_ssize_t recvlen, outlen;
3499 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003501
Antoine Pitrou19467d22010-08-17 19:33:30 +00003502 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 if (recvlen < 0) {
3506 PyErr_SetString(PyExc_ValueError,
3507 "negative buffersize in recv");
3508 return NULL;
3509 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 /* Allocate a new string. */
3512 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3513 if (buf == NULL)
3514 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 /* Call the guts */
3517 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3518 if (outlen < 0) {
3519 /* An error occurred, release the string and return an
3520 error. */
3521 Py_DECREF(buf);
3522 return NULL;
3523 }
3524 if (outlen != recvlen) {
3525 /* We did not read as many bytes as we anticipated, resize the
3526 string if possible and be successful. */
3527 _PyBytes_Resize(&buf, outlen);
3528 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003531}
3532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003533PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003534"recv(buffersize[, flags]) -> data\n\
3535\n\
3536Receive up to buffersize bytes from the socket. For the optional flags\n\
3537argument, see the Unix manual. When no data is available, block until\n\
3538at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003539the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003540
Guido van Rossum30a685f1991-06-27 15:51:29 +00003541
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003542/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003543
Thomas Wouters477c8d52006-05-27 19:21:47 +00003544static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003545sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003548
Antoine Pitrou19467d22010-08-17 19:33:30 +00003549 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 Py_buffer pbuf;
3551 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003552 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003555 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 &pbuf, &recvlen, &flags))
3557 return NULL;
3558 buf = pbuf.buf;
3559 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 if (recvlen < 0) {
3562 PyBuffer_Release(&pbuf);
3563 PyErr_SetString(PyExc_ValueError,
3564 "negative buffersize in recv_into");
3565 return NULL;
3566 }
3567 if (recvlen == 0) {
3568 /* If nbytes was not specified, use the buffer's length */
3569 recvlen = buflen;
3570 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 /* Check if the buffer is large enough */
3573 if (buflen < recvlen) {
3574 PyBuffer_Release(&pbuf);
3575 PyErr_SetString(PyExc_ValueError,
3576 "buffer too small for requested bytes");
3577 return NULL;
3578 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 /* Call the guts */
3581 readlen = sock_recv_guts(s, buf, recvlen, flags);
3582 if (readlen < 0) {
3583 /* Return an error. */
3584 PyBuffer_Release(&pbuf);
3585 return NULL;
3586 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 PyBuffer_Release(&pbuf);
3589 /* Return the number of bytes read. Note that we do not do anything
3590 special here in the case that readlen < recvlen. */
3591 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003592}
3593
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003594PyDoc_STRVAR(recv_into_doc,
3595"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003596\n\
oldkaa0735f2018-02-02 16:52:55 +08003597A version of recv() that stores its data into a buffer rather than creating\n\
3598a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003599is not specified (or 0), receive up to the size available in the given buffer.\n\
3600\n\
3601See recv() for documentation about the flags.");
3602
Victor Stinner31bf2d52015-04-01 21:57:09 +02003603struct sock_recvfrom {
3604 char* cbuf;
3605 Py_ssize_t len;
3606 int flags;
3607 socklen_t *addrlen;
3608 sock_addr_t *addrbuf;
3609 Py_ssize_t result;
3610};
3611
3612static int
3613sock_recvfrom_impl(PySocketSockObject *s, void *data)
3614{
3615 struct sock_recvfrom *ctx = data;
3616
3617 memset(ctx->addrbuf, 0, *ctx->addrlen);
3618
3619#ifdef MS_WINDOWS
3620 if (ctx->len > INT_MAX)
3621 ctx->len = INT_MAX;
3622 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3623 SAS2SA(ctx->addrbuf), ctx->addrlen);
3624#else
3625 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3626 SAS2SA(ctx->addrbuf), ctx->addrlen);
3627#endif
3628 return (ctx->result >= 0);
3629}
3630
Thomas Wouters477c8d52006-05-27 19:21:47 +00003631
3632/*
Christian Heimes99170a52007-12-19 02:07:34 +00003633 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3634 * into a char buffer. If you have any inc/def ref to do to the objects that
3635 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003636 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003637 * that it is also possible that we return a number of bytes smaller than the
3638 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003639 *
3640 * 'addr' is a return value for the address object. Note that you must decref
3641 * it yourself.
3642 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003643static Py_ssize_t
3644sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003645 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003649 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 if (!getsockaddrlen(s, &addrlen))
3654 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 if (!IS_SELECTABLE(s)) {
3657 select_error();
3658 return -1;
3659 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003660
Victor Stinner31bf2d52015-04-01 21:57:09 +02003661 ctx.cbuf = cbuf;
3662 ctx.len = len;
3663 ctx.flags = flags;
3664 ctx.addrbuf = &addrbuf;
3665 ctx.addrlen = &addrlen;
3666 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003668
Victor Stinner31bf2d52015-04-01 21:57:09 +02003669 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3670 s->sock_proto);
3671 if (*addr == NULL)
3672 return -1;
3673
3674 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003675}
3676
3677/* s.recvfrom(nbytes [,flags]) method */
3678
3679static PyObject *
3680sock_recvfrom(PySocketSockObject *s, PyObject *args)
3681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 PyObject *buf = NULL;
3683 PyObject *addr = NULL;
3684 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003685 int flags = 0;
3686 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003687
Antoine Pitrou19467d22010-08-17 19:33:30 +00003688 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 if (recvlen < 0) {
3692 PyErr_SetString(PyExc_ValueError,
3693 "negative buffersize in recvfrom");
3694 return NULL;
3695 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3698 if (buf == NULL)
3699 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3702 recvlen, flags, &addr);
3703 if (outlen < 0) {
3704 goto finally;
3705 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 if (outlen != recvlen) {
3708 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003709 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003711 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 goto finally;
3713 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003716
3717finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 Py_XDECREF(buf);
3719 Py_XDECREF(addr);
3720 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003721}
3722
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003723PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003724"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3725\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003726Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003727
Thomas Wouters477c8d52006-05-27 19:21:47 +00003728
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003729/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003730
3731static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003732sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003735
Antoine Pitrou19467d22010-08-17 19:33:30 +00003736 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 Py_buffer pbuf;
3738 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003739 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003742
Antoine Pitrou19467d22010-08-17 19:33:30 +00003743 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 kwlist, &pbuf,
3745 &recvlen, &flags))
3746 return NULL;
3747 buf = pbuf.buf;
3748 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 if (recvlen < 0) {
3751 PyBuffer_Release(&pbuf);
3752 PyErr_SetString(PyExc_ValueError,
3753 "negative buffersize in recvfrom_into");
3754 return NULL;
3755 }
3756 if (recvlen == 0) {
3757 /* If nbytes was not specified, use the buffer's length */
3758 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003759 } else if (recvlen > buflen) {
3760 PyBuffer_Release(&pbuf);
3761 PyErr_SetString(PyExc_ValueError,
3762 "nbytes is greater than the length of the buffer");
3763 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3767 if (readlen < 0) {
3768 PyBuffer_Release(&pbuf);
3769 /* Return an error */
3770 Py_XDECREF(addr);
3771 return NULL;
3772 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003774 PyBuffer_Release(&pbuf);
3775 /* Return the number of bytes read and the address. Note that we do
3776 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003777 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003778}
3779
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003780PyDoc_STRVAR(recvfrom_into_doc,
3781"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003782\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003783Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003784
Victor Stinner35bee932015-04-02 12:28:07 +02003785/* The sendmsg() and recvmsg[_into]() methods require a working
3786 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3787#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003788struct sock_recvmsg {
3789 struct msghdr *msg;
3790 int flags;
3791 ssize_t result;
3792};
3793
3794static int
3795sock_recvmsg_impl(PySocketSockObject *s, void *data)
3796{
3797 struct sock_recvmsg *ctx = data;
3798
3799 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3800 return (ctx->result >= 0);
3801}
3802
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803/*
3804 * Call recvmsg() with the supplied iovec structures, flags, and
3805 * ancillary data buffer size (controllen). Returns the tuple return
3806 * value for recvmsg() or recvmsg_into(), with the first item provided
3807 * by the supplied makeval() function. makeval() will be called with
3808 * the length read and makeval_data as arguments, and must return a
3809 * new reference (which will be decrefed if there is a subsequent
3810 * error). On error, closes any file descriptors received via
3811 * SCM_RIGHTS.
3812 */
3813static PyObject *
3814sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3815 int flags, Py_ssize_t controllen,
3816 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3817{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003818 sock_addr_t addrbuf;
3819 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003820 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003821 PyObject *cmsg_list = NULL, *retval = NULL;
3822 void *controlbuf = NULL;
3823 struct cmsghdr *cmsgh;
3824 size_t cmsgdatalen = 0;
3825 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003826 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003827
3828 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3829 ignored" when the socket is connected (Linux fills them in
3830 anyway for AF_UNIX sockets at least). Normally msg_namelen
3831 seems to be set to 0 if there's no address, but try to
3832 initialize msg_name to something that won't be mistaken for a
3833 real address if that doesn't happen. */
3834 if (!getsockaddrlen(s, &addrbuflen))
3835 return NULL;
3836 memset(&addrbuf, 0, addrbuflen);
3837 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3838
3839 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3840 PyErr_SetString(PyExc_ValueError,
3841 "invalid ancillary data buffer length");
3842 return NULL;
3843 }
3844 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3845 return PyErr_NoMemory();
3846
3847 /* Make the system call. */
3848 if (!IS_SELECTABLE(s)) {
3849 select_error();
3850 goto finally;
3851 }
3852
Victor Stinner31bf2d52015-04-01 21:57:09 +02003853 msg.msg_name = SAS2SA(&addrbuf);
3854 msg.msg_namelen = addrbuflen;
3855 msg.msg_iov = iov;
3856 msg.msg_iovlen = iovlen;
3857 msg.msg_control = controlbuf;
3858 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003859
Victor Stinner31bf2d52015-04-01 21:57:09 +02003860 ctx.msg = &msg;
3861 ctx.flags = flags;
3862 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864
3865 /* Make list of (level, type, data) tuples from control messages. */
3866 if ((cmsg_list = PyList_New(0)) == NULL)
3867 goto err_closefds;
3868 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3869 implementations didn't do so. */
3870 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3871 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3872 PyObject *bytes, *tuple;
3873 int tmp;
3874
3875 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3876 if (cmsg_status != 0) {
3877 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3878 "received malformed or improperly-truncated "
3879 "ancillary data", 1) == -1)
3880 goto err_closefds;
3881 }
3882 if (cmsg_status < 0)
3883 break;
3884 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003885 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003886 goto err_closefds;
3887 }
3888
3889 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3890 cmsgdatalen);
3891 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3892 (int)cmsgh->cmsg_type, bytes);
3893 if (tuple == NULL)
3894 goto err_closefds;
3895 tmp = PyList_Append(cmsg_list, tuple);
3896 Py_DECREF(tuple);
3897 if (tmp != 0)
3898 goto err_closefds;
3899
3900 if (cmsg_status != 0)
3901 break;
3902 }
3903
3904 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003905 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003906 cmsg_list,
3907 (int)msg.msg_flags,
3908 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3909 ((msg.msg_namelen > addrbuflen) ?
3910 addrbuflen : msg.msg_namelen),
3911 s->sock_proto));
3912 if (retval == NULL)
3913 goto err_closefds;
3914
3915finally:
3916 Py_XDECREF(cmsg_list);
3917 PyMem_Free(controlbuf);
3918 return retval;
3919
3920err_closefds:
3921#ifdef SCM_RIGHTS
3922 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3923 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3924 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3925 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3926 if (cmsg_status < 0)
3927 break;
3928 if (cmsgh->cmsg_level == SOL_SOCKET &&
3929 cmsgh->cmsg_type == SCM_RIGHTS) {
3930 size_t numfds;
3931 int *fdp;
3932
3933 numfds = cmsgdatalen / sizeof(int);
3934 fdp = (int *)CMSG_DATA(cmsgh);
3935 while (numfds-- > 0)
3936 close(*fdp++);
3937 }
3938 if (cmsg_status != 0)
3939 break;
3940 }
3941#endif /* SCM_RIGHTS */
3942 goto finally;
3943}
3944
3945
3946static PyObject *
3947makeval_recvmsg(ssize_t received, void *data)
3948{
3949 PyObject **buf = data;
3950
3951 if (received < PyBytes_GET_SIZE(*buf))
3952 _PyBytes_Resize(buf, received);
3953 Py_XINCREF(*buf);
3954 return *buf;
3955}
3956
3957/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3958
3959static PyObject *
3960sock_recvmsg(PySocketSockObject *s, PyObject *args)
3961{
3962 Py_ssize_t bufsize, ancbufsize = 0;
3963 int flags = 0;
3964 struct iovec iov;
3965 PyObject *buf = NULL, *retval = NULL;
3966
3967 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3968 return NULL;
3969
3970 if (bufsize < 0) {
3971 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3972 return NULL;
3973 }
3974 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3975 return NULL;
3976 iov.iov_base = PyBytes_AS_STRING(buf);
3977 iov.iov_len = bufsize;
3978
3979 /* Note that we're passing a pointer to *our pointer* to the bytes
3980 object here (&buf); makeval_recvmsg() may incref the object, or
3981 deallocate it and set our pointer to NULL. */
3982 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3983 &makeval_recvmsg, &buf);
3984 Py_XDECREF(buf);
3985 return retval;
3986}
3987
3988PyDoc_STRVAR(recvmsg_doc,
3989"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3990\n\
3991Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3992socket. The ancbufsize argument sets the size in bytes of the\n\
3993internal buffer used to receive the ancillary data; it defaults to 0,\n\
3994meaning that no ancillary data will be received. Appropriate buffer\n\
3995sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3996CMSG_LEN(), and items which do not fit into the buffer might be\n\
3997truncated or discarded. The flags argument defaults to 0 and has the\n\
3998same meaning as for recv().\n\
3999\n\
4000The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4001The data item is a bytes object holding the non-ancillary data\n\
4002received. The ancdata item is a list of zero or more tuples\n\
4003(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4004(control messages) received: cmsg_level and cmsg_type are integers\n\
4005specifying the protocol level and protocol-specific type respectively,\n\
4006and cmsg_data is a bytes object holding the associated data. The\n\
4007msg_flags item is the bitwise OR of various flags indicating\n\
4008conditions on the received message; see your system documentation for\n\
4009details. If the receiving socket is unconnected, address is the\n\
4010address of the sending socket, if available; otherwise, its value is\n\
4011unspecified.\n\
4012\n\
4013If recvmsg() raises an exception after the system call returns, it\n\
4014will first attempt to close any file descriptors received via the\n\
4015SCM_RIGHTS mechanism.");
4016
4017
4018static PyObject *
4019makeval_recvmsg_into(ssize_t received, void *data)
4020{
4021 return PyLong_FromSsize_t(received);
4022}
4023
4024/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4025
4026static PyObject *
4027sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4028{
4029 Py_ssize_t ancbufsize = 0;
4030 int flags = 0;
4031 struct iovec *iovs = NULL;
4032 Py_ssize_t i, nitems, nbufs = 0;
4033 Py_buffer *bufs = NULL;
4034 PyObject *buffers_arg, *fast, *retval = NULL;
4035
4036 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4037 &buffers_arg, &ancbufsize, &flags))
4038 return NULL;
4039
4040 if ((fast = PySequence_Fast(buffers_arg,
4041 "recvmsg_into() argument 1 must be an "
4042 "iterable")) == NULL)
4043 return NULL;
4044 nitems = PySequence_Fast_GET_SIZE(fast);
4045 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004046 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004047 goto finally;
4048 }
4049
4050 /* Fill in an iovec for each item, and save the Py_buffer
4051 structs to release afterwards. */
4052 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4053 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4054 PyErr_NoMemory();
4055 goto finally;
4056 }
4057 for (; nbufs < nitems; nbufs++) {
4058 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4059 "w*;recvmsg_into() argument 1 must be an iterable "
4060 "of single-segment read-write buffers",
4061 &bufs[nbufs]))
4062 goto finally;
4063 iovs[nbufs].iov_base = bufs[nbufs].buf;
4064 iovs[nbufs].iov_len = bufs[nbufs].len;
4065 }
4066
4067 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4068 &makeval_recvmsg_into, NULL);
4069finally:
4070 for (i = 0; i < nbufs; i++)
4071 PyBuffer_Release(&bufs[i]);
4072 PyMem_Free(bufs);
4073 PyMem_Free(iovs);
4074 Py_DECREF(fast);
4075 return retval;
4076}
4077
4078PyDoc_STRVAR(recvmsg_into_doc,
4079"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4080\n\
4081Receive normal data and ancillary data from the socket, scattering the\n\
4082non-ancillary data into a series of buffers. The buffers argument\n\
4083must be an iterable of objects that export writable buffers\n\
4084(e.g. bytearray objects); these will be filled with successive chunks\n\
4085of the non-ancillary data until it has all been written or there are\n\
4086no more buffers. The ancbufsize argument sets the size in bytes of\n\
4087the internal buffer used to receive the ancillary data; it defaults to\n\
40880, meaning that no ancillary data will be received. Appropriate\n\
4089buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4090or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4091truncated or discarded. The flags argument defaults to 0 and has the\n\
4092same meaning as for recv().\n\
4093\n\
4094The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4095The nbytes item is the total number of bytes of non-ancillary data\n\
4096written into the buffers. The ancdata item is a list of zero or more\n\
4097tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4098data (control messages) received: cmsg_level and cmsg_type are\n\
4099integers specifying the protocol level and protocol-specific type\n\
4100respectively, and cmsg_data is a bytes object holding the associated\n\
4101data. The msg_flags item is the bitwise OR of various flags\n\
4102indicating conditions on the received message; see your system\n\
4103documentation for details. If the receiving socket is unconnected,\n\
4104address is the address of the sending socket, if available; otherwise,\n\
4105its value is unspecified.\n\
4106\n\
4107If recvmsg_into() raises an exception after the system call returns,\n\
4108it will first attempt to close any file descriptors received via the\n\
4109SCM_RIGHTS mechanism.");
4110#endif /* CMSG_LEN */
4111
4112
Victor Stinner31bf2d52015-04-01 21:57:09 +02004113struct sock_send {
4114 char *buf;
4115 Py_ssize_t len;
4116 int flags;
4117 Py_ssize_t result;
4118};
4119
4120static int
4121sock_send_impl(PySocketSockObject *s, void *data)
4122{
4123 struct sock_send *ctx = data;
4124
4125#ifdef MS_WINDOWS
4126 if (ctx->len > INT_MAX)
4127 ctx->len = INT_MAX;
4128 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4129#else
4130 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4131#endif
4132 return (ctx->result >= 0);
4133}
4134
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004135/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004136
Guido van Rossum73624e91994-10-10 17:59:00 +00004137static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004138sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004139{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004140 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004142 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4145 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 if (!IS_SELECTABLE(s)) {
4148 PyBuffer_Release(&pbuf);
4149 return select_error();
4150 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004151 ctx.buf = pbuf.buf;
4152 ctx.len = pbuf.len;
4153 ctx.flags = flags;
4154 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004155 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 return NULL;
4157 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004158 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004159
4160 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004161}
4162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004163PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004164"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004165\n\
4166Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004167argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004168sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004169
4170
4171/* s.sendall(data [,flags]) method */
4172
4173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004174sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004177 Py_ssize_t len, n;
4178 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004180 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004181 int has_timeout = (s->sock_timeout > 0);
4182 _PyTime_t interval = s->sock_timeout;
4183 _PyTime_t deadline = 0;
4184 int deadline_initialized = 0;
4185 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4188 return NULL;
4189 buf = pbuf.buf;
4190 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004192 if (!IS_SELECTABLE(s)) {
4193 PyBuffer_Release(&pbuf);
4194 return select_error();
4195 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004198 if (has_timeout) {
4199 if (deadline_initialized) {
4200 /* recompute the timeout */
4201 interval = deadline - _PyTime_GetMonotonicClock();
4202 }
4203 else {
4204 deadline_initialized = 1;
4205 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4206 }
4207
4208 if (interval <= 0) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004209 PyErr_SetString(PyExc_TimeoutError, "timed out");
Victor Stinner8912d142015-04-06 23:16:34 +02004210 goto done;
4211 }
4212 }
4213
Victor Stinner02f32ab2015-04-01 22:53:26 +02004214 ctx.buf = buf;
4215 ctx.len = len;
4216 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004217 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4218 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004219 n = ctx.result;
4220 assert(n >= 0);
4221
4222 buf += n;
4223 len -= n;
4224
4225 /* We must run our signal handlers before looping again.
4226 send() can return a successful partial write when it is
4227 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004228 if (PyErr_CheckSignals())
4229 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004230 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Victor Stinner8912d142015-04-06 23:16:34 +02004233 Py_INCREF(Py_None);
4234 res = Py_None;
4235
4236done:
4237 PyBuffer_Release(&pbuf);
4238 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004239}
4240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004241PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004242"sendall(data[, flags])\n\
4243\n\
4244Send a data string to the socket. For the optional flags\n\
4245argument, see the Unix manual. This calls send() repeatedly\n\
4246until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004247to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004248
Guido van Rossum30a685f1991-06-27 15:51:29 +00004249
Victor Stinner31bf2d52015-04-01 21:57:09 +02004250struct sock_sendto {
4251 char *buf;
4252 Py_ssize_t len;
4253 int flags;
4254 int addrlen;
4255 sock_addr_t *addrbuf;
4256 Py_ssize_t result;
4257};
4258
4259static int
4260sock_sendto_impl(PySocketSockObject *s, void *data)
4261{
4262 struct sock_sendto *ctx = data;
4263
4264#ifdef MS_WINDOWS
4265 if (ctx->len > INT_MAX)
4266 ctx->len = INT_MAX;
4267 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4268 SAS2SA(ctx->addrbuf), ctx->addrlen);
4269#else
4270 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4271 SAS2SA(ctx->addrbuf), ctx->addrlen);
4272#endif
4273 return (ctx->result >= 0);
4274}
4275
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004276/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004277
Guido van Rossum73624e91994-10-10 17:59:00 +00004278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004279sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 Py_buffer pbuf;
4282 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004283 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004285 int addrlen, flags;
4286 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004289 arglen = PyTuple_Size(args);
4290 switch (arglen) {
4291 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004292 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4293 return NULL;
4294 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004295 break;
4296 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004297 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4298 &pbuf, &flags, &addro)) {
4299 return NULL;
4300 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004301 break;
4302 default:
4303 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004304 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004305 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004306 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 if (!IS_SELECTABLE(s)) {
4310 PyBuffer_Release(&pbuf);
4311 return select_error();
4312 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004313
Victor Stinnerd565fb92019-10-10 21:30:20 +02004314 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 PyBuffer_Release(&pbuf);
4316 return NULL;
4317 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004318
Steve Dowerb82e17e2019-05-23 08:45:22 -07004319 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4320 return NULL;
4321 }
4322
Victor Stinner31bf2d52015-04-01 21:57:09 +02004323 ctx.buf = pbuf.buf;
4324 ctx.len = pbuf.len;
4325 ctx.flags = flags;
4326 ctx.addrlen = addrlen;
4327 ctx.addrbuf = &addrbuf;
4328 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004329 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 return NULL;
4331 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004332 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004333
4334 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004335}
4336
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004337PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004338"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004339\n\
4340Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004341For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004342
Guido van Rossum30a685f1991-06-27 15:51:29 +00004343
Victor Stinner35bee932015-04-02 12:28:07 +02004344/* The sendmsg() and recvmsg[_into]() methods require a working
4345 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4346#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004347struct sock_sendmsg {
4348 struct msghdr *msg;
4349 int flags;
4350 ssize_t result;
4351};
4352
4353static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004354sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4355 struct msghdr *msg,
4356 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4357 Py_ssize_t ndataparts, ndatabufs = 0;
4358 int result = -1;
4359 struct iovec *iovs = NULL;
4360 PyObject *data_fast = NULL;
4361 Py_buffer *databufs = NULL;
4362
4363 /* Fill in an iovec for each message part, and save the Py_buffer
4364 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004365 data_fast = PySequence_Fast(data_arg,
4366 "sendmsg() argument 1 must be an "
4367 "iterable");
4368 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004369 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004370 }
4371
Christian Heimesdffa3942016-09-05 23:54:41 +02004372 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4373 if (ndataparts > INT_MAX) {
4374 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4375 goto finally;
4376 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004377
Christian Heimesdffa3942016-09-05 23:54:41 +02004378 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004379 if (ndataparts > 0) {
4380 iovs = PyMem_New(struct iovec, ndataparts);
4381 if (iovs == NULL) {
4382 PyErr_NoMemory();
4383 goto finally;
4384 }
4385 msg->msg_iov = iovs;
4386
4387 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004388 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004389 PyErr_NoMemory();
4390 goto finally;
4391 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004392 }
4393 for (; ndatabufs < ndataparts; ndatabufs++) {
4394 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4395 "y*;sendmsg() argument 1 must be an iterable of "
4396 "bytes-like objects",
4397 &databufs[ndatabufs]))
4398 goto finally;
4399 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4400 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4401 }
4402 result = 0;
4403 finally:
4404 *databufsout = databufs;
4405 *ndatabufsout = ndatabufs;
4406 Py_XDECREF(data_fast);
4407 return result;
4408}
4409
4410static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004411sock_sendmsg_impl(PySocketSockObject *s, void *data)
4412{
4413 struct sock_sendmsg *ctx = data;
4414
4415 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4416 return (ctx->result >= 0);
4417}
4418
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004419/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4420
4421static PyObject *
4422sock_sendmsg(PySocketSockObject *s, PyObject *args)
4423{
Christian Heimesdffa3942016-09-05 23:54:41 +02004424 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004427 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004428 struct cmsginfo {
4429 int level;
4430 int type;
4431 Py_buffer data;
4432 } *cmsgs = NULL;
4433 void *controlbuf = NULL;
4434 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004435 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004436 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004437 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004438 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439
4440 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004441 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004442 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004443 }
4444
4445 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004446
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004447 /* Parse destination address. */
4448 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004449 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004450 "sendmsg"))
4451 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004452 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004453 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004454 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4455 return NULL;
4456 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004457 msg.msg_name = &addrbuf;
4458 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004459 } else {
4460 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4461 return NULL;
4462 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004463 }
4464
4465 /* Fill in an iovec for each message part, and save the Py_buffer
4466 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004467 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004469 }
4470
4471 if (cmsg_arg == NULL)
4472 ncmsgs = 0;
4473 else {
4474 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4475 "sendmsg() argument 2 must be an "
4476 "iterable")) == NULL)
4477 goto finally;
4478 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4479 }
4480
4481#ifndef CMSG_SPACE
4482 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004483 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004484 "sending multiple control messages is not supported "
4485 "on this system");
4486 goto finally;
4487 }
4488#endif
4489 /* Save level, type and Py_buffer for each control message,
4490 and calculate total size. */
4491 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4492 PyErr_NoMemory();
4493 goto finally;
4494 }
4495 controllen = controllen_last = 0;
4496 while (ncmsgbufs < ncmsgs) {
4497 size_t bufsize, space;
4498
4499 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4500 "(iiy*):[sendmsg() ancillary data items]",
4501 &cmsgs[ncmsgbufs].level,
4502 &cmsgs[ncmsgbufs].type,
4503 &cmsgs[ncmsgbufs].data))
4504 goto finally;
4505 bufsize = cmsgs[ncmsgbufs++].data.len;
4506
4507#ifdef CMSG_SPACE
4508 if (!get_CMSG_SPACE(bufsize, &space)) {
4509#else
4510 if (!get_CMSG_LEN(bufsize, &space)) {
4511#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004512 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004513 goto finally;
4514 }
4515 controllen += space;
4516 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004517 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004518 goto finally;
4519 }
4520 controllen_last = controllen;
4521 }
4522
4523 /* Construct ancillary data block from control message info. */
4524 if (ncmsgbufs > 0) {
4525 struct cmsghdr *cmsgh = NULL;
4526
Victor Stinner52d61e42016-09-12 11:41:58 +02004527 controlbuf = PyMem_Malloc(controllen);
4528 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004529 PyErr_NoMemory();
4530 goto finally;
4531 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004532 msg.msg_control = controlbuf;
4533
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004534 msg.msg_controllen = controllen;
4535
4536 /* Need to zero out the buffer as a workaround for glibc's
4537 CMSG_NXTHDR() implementation. After getting the pointer to
4538 the next header, it checks its (uninitialized) cmsg_len
4539 member to see if the "message" fits in the buffer, and
4540 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004541 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004542 memset(controlbuf, 0, controllen);
4543
4544 for (i = 0; i < ncmsgbufs; i++) {
4545 size_t msg_len, data_len = cmsgs[i].data.len;
4546 int enough_space = 0;
4547
4548 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4549 if (cmsgh == NULL) {
4550 PyErr_Format(PyExc_RuntimeError,
4551 "unexpected NULL result from %s()",
4552 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4553 goto finally;
4554 }
4555 if (!get_CMSG_LEN(data_len, &msg_len)) {
4556 PyErr_SetString(PyExc_RuntimeError,
4557 "item size out of range for CMSG_LEN()");
4558 goto finally;
4559 }
4560 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4561 size_t space;
4562
4563 cmsgh->cmsg_len = msg_len;
4564 if (get_cmsg_data_space(&msg, cmsgh, &space))
4565 enough_space = (space >= data_len);
4566 }
4567 if (!enough_space) {
4568 PyErr_SetString(PyExc_RuntimeError,
4569 "ancillary data does not fit in calculated "
4570 "space");
4571 goto finally;
4572 }
4573 cmsgh->cmsg_level = cmsgs[i].level;
4574 cmsgh->cmsg_type = cmsgs[i].type;
4575 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4576 }
4577 }
4578
4579 /* Make the system call. */
4580 if (!IS_SELECTABLE(s)) {
4581 select_error();
4582 goto finally;
4583 }
4584
Victor Stinner31bf2d52015-04-01 21:57:09 +02004585 ctx.msg = &msg;
4586 ctx.flags = flags;
4587 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004588 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004589
4590 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004591
4592finally:
4593 PyMem_Free(controlbuf);
4594 for (i = 0; i < ncmsgbufs; i++)
4595 PyBuffer_Release(&cmsgs[i].data);
4596 PyMem_Free(cmsgs);
4597 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004598 PyMem_Free(msg.msg_iov);
4599 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004600 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004601 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004602 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004603 return retval;
4604}
4605
4606PyDoc_STRVAR(sendmsg_doc,
4607"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4608\n\
4609Send normal and ancillary data to the socket, gathering the\n\
4610non-ancillary data from a series of buffers and concatenating it into\n\
4611a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004612data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004613The ancdata argument specifies the ancillary data (control messages)\n\
4614as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4615cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4616protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004617is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004618argument defaults to 0 and has the same meaning as for send(). If\n\
4619address is supplied and not None, it sets a destination address for\n\
4620the message. The return value is the number of bytes of non-ancillary\n\
4621data sent.");
4622#endif /* CMSG_LEN */
4623
Christian Heimesdffa3942016-09-05 23:54:41 +02004624#ifdef HAVE_SOCKADDR_ALG
4625static PyObject*
4626sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4627{
4628 PyObject *retval = NULL;
4629
4630 Py_ssize_t i, ndatabufs = 0;
4631 Py_buffer *databufs = NULL;
4632 PyObject *data_arg = NULL;
4633
4634 Py_buffer iv = {NULL, NULL};
4635
4636 PyObject *opobj = NULL;
4637 int op = -1;
4638
4639 PyObject *assoclenobj = NULL;
4640 int assoclen = -1;
4641
4642 unsigned int *uiptr;
4643 int flags = 0;
4644
4645 struct msghdr msg;
4646 struct cmsghdr *header = NULL;
4647 struct af_alg_iv *alg_iv = NULL;
4648 struct sock_sendmsg ctx;
4649 Py_ssize_t controllen;
4650 void *controlbuf = NULL;
4651 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4652
4653 if (self->sock_family != AF_ALG) {
4654 PyErr_SetString(PyExc_OSError,
4655 "algset is only supported for AF_ALG");
4656 return NULL;
4657 }
4658
4659 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4660 "|O$O!y*O!i:sendmsg_afalg", keywords,
4661 &data_arg,
4662 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004663 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004664 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004665 }
4666
4667 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004668
4669 /* op is a required, keyword-only argument >= 0 */
4670 if (opobj != NULL) {
4671 op = _PyLong_AsInt(opobj);
4672 }
4673 if (op < 0) {
4674 /* override exception from _PyLong_AsInt() */
4675 PyErr_SetString(PyExc_TypeError,
4676 "Invalid or missing argument 'op'");
4677 goto finally;
4678 }
4679 /* assoclen is optional but must be >= 0 */
4680 if (assoclenobj != NULL) {
4681 assoclen = _PyLong_AsInt(assoclenobj);
4682 if (assoclen == -1 && PyErr_Occurred()) {
4683 goto finally;
4684 }
4685 if (assoclen < 0) {
4686 PyErr_SetString(PyExc_TypeError,
4687 "assoclen must be positive");
4688 goto finally;
4689 }
4690 }
4691
4692 controllen = CMSG_SPACE(4);
4693 if (iv.buf != NULL) {
4694 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4695 }
4696 if (assoclen >= 0) {
4697 controllen += CMSG_SPACE(4);
4698 }
4699
4700 controlbuf = PyMem_Malloc(controllen);
4701 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004702 PyErr_NoMemory();
4703 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004704 }
4705 memset(controlbuf, 0, controllen);
4706
Christian Heimesdffa3942016-09-05 23:54:41 +02004707 msg.msg_controllen = controllen;
4708 msg.msg_control = controlbuf;
4709
4710 /* Fill in an iovec for each message part, and save the Py_buffer
4711 structs to release afterwards. */
4712 if (data_arg != NULL) {
4713 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4714 goto finally;
4715 }
4716 }
4717
4718 /* set operation to encrypt or decrypt */
4719 header = CMSG_FIRSTHDR(&msg);
4720 if (header == NULL) {
4721 PyErr_SetString(PyExc_RuntimeError,
4722 "unexpected NULL result from CMSG_FIRSTHDR");
4723 goto finally;
4724 }
4725 header->cmsg_level = SOL_ALG;
4726 header->cmsg_type = ALG_SET_OP;
4727 header->cmsg_len = CMSG_LEN(4);
4728 uiptr = (void*)CMSG_DATA(header);
4729 *uiptr = (unsigned int)op;
4730
4731 /* set initialization vector */
4732 if (iv.buf != NULL) {
4733 header = CMSG_NXTHDR(&msg, header);
4734 if (header == NULL) {
4735 PyErr_SetString(PyExc_RuntimeError,
4736 "unexpected NULL result from CMSG_NXTHDR(iv)");
4737 goto finally;
4738 }
4739 header->cmsg_level = SOL_ALG;
4740 header->cmsg_type = ALG_SET_IV;
4741 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4742 alg_iv = (void*)CMSG_DATA(header);
4743 alg_iv->ivlen = iv.len;
4744 memcpy(alg_iv->iv, iv.buf, iv.len);
4745 }
4746
4747 /* set length of associated data for AEAD */
4748 if (assoclen >= 0) {
4749 header = CMSG_NXTHDR(&msg, header);
4750 if (header == NULL) {
4751 PyErr_SetString(PyExc_RuntimeError,
4752 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4753 goto finally;
4754 }
4755 header->cmsg_level = SOL_ALG;
4756 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4757 header->cmsg_len = CMSG_LEN(4);
4758 uiptr = (void*)CMSG_DATA(header);
4759 *uiptr = (unsigned int)assoclen;
4760 }
4761
4762 ctx.msg = &msg;
4763 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004764 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004765 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004766 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004767
4768 retval = PyLong_FromSsize_t(ctx.result);
4769
4770 finally:
4771 PyMem_Free(controlbuf);
4772 if (iv.buf != NULL) {
4773 PyBuffer_Release(&iv);
4774 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004775 PyMem_Free(msg.msg_iov);
4776 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004777 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004778 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004779 PyMem_Free(databufs);
4780 return retval;
4781}
4782
4783PyDoc_STRVAR(sendmsg_afalg_doc,
4784"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4785\n\
4786Set operation mode, IV and length of associated data for an AF_ALG\n\
4787operation socket.");
4788#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004789
Guido van Rossum30a685f1991-06-27 15:51:29 +00004790/* s.shutdown(how) method */
4791
Guido van Rossum73624e91994-10-10 17:59:00 +00004792static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004793sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 int how;
4796 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004797
Serhiy Storchaka78980432013-01-15 01:12:17 +02004798 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 if (how == -1 && PyErr_Occurred())
4800 return NULL;
4801 Py_BEGIN_ALLOW_THREADS
4802 res = shutdown(s->sock_fd, how);
4803 Py_END_ALLOW_THREADS
4804 if (res < 0)
4805 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004806 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004807}
4808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004809PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004810"shutdown(flag)\n\
4811\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004812Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4813of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004814
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004815#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004816static PyObject*
4817sock_ioctl(PySocketSockObject *s, PyObject *arg)
4818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 unsigned long cmd = SIO_RCVALL;
4820 PyObject *argO;
4821 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4824 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 switch (cmd) {
4827 case SIO_RCVALL: {
4828 unsigned int option = RCVALL_ON;
4829 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4830 return NULL;
4831 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4832 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4833 return set_error();
4834 }
4835 return PyLong_FromUnsignedLong(recv); }
4836 case SIO_KEEPALIVE_VALS: {
4837 struct tcp_keepalive ka;
4838 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4839 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4840 return NULL;
4841 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4842 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4843 return set_error();
4844 }
4845 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004846#if defined(SIO_LOOPBACK_FAST_PATH)
4847 case SIO_LOOPBACK_FAST_PATH: {
4848 unsigned int option;
4849 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4850 return NULL;
4851 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4852 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4853 return set_error();
4854 }
4855 return PyLong_FromUnsignedLong(recv); }
4856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004858 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 return NULL;
4860 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004861}
4862PyDoc_STRVAR(sock_ioctl_doc,
4863"ioctl(cmd, option) -> long\n\
4864\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004865Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4866SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004867SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4868SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004869#endif
4870
4871#if defined(MS_WINDOWS)
4872static PyObject*
4873sock_share(PySocketSockObject *s, PyObject *arg)
4874{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004875 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004876 DWORD processId;
4877 int result;
4878
4879 if (!PyArg_ParseTuple(arg, "I", &processId))
4880 return NULL;
4881
4882 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004883 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004884 Py_END_ALLOW_THREADS
4885 if (result == SOCKET_ERROR)
4886 return set_error();
4887 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4888}
4889PyDoc_STRVAR(sock_share_doc,
4890"share(process_id) -> bytes\n\
4891\n\
4892Share the socket with another process. The target process id\n\
4893must be provided and the resulting bytes object passed to the target\n\
4894process. There the shared socket can be instantiated by calling\n\
4895socket.fromshare().");
4896
Christian Heimesfaf2f632008-01-06 16:59:19 +00004897
4898#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004899
4900/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004901
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004902static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4904 accept_doc},
4905 {"bind", (PyCFunction)sock_bind, METH_O,
4906 bind_doc},
4907 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004908 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 {"connect", (PyCFunction)sock_connect, METH_O,
4910 connect_doc},
4911 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4912 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004913 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4914 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4916 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004917#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 {"getpeername", (PyCFunction)sock_getpeername,
4919 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 {"getsockname", (PyCFunction)sock_getsockname,
4922 METH_NOARGS, getsockname_doc},
4923 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4924 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004925#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4927 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004928#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004929#if defined(MS_WINDOWS)
4930 {"share", (PyCFunction)sock_share, METH_VARARGS,
4931 sock_share_doc},
4932#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004933 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 listen_doc},
4935 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4936 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004937 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 recv_into_doc},
4939 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4940 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004941 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 recvfrom_into_doc},
4943 {"send", (PyCFunction)sock_send, METH_VARARGS,
4944 send_doc},
4945 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4946 sendall_doc},
4947 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4948 sendto_doc},
4949 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4950 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004951 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4952 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4954 settimeout_doc},
4955 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4956 gettimeout_doc},
4957 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4958 setsockopt_doc},
4959 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4960 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004961#ifdef CMSG_LEN
4962 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4963 recvmsg_doc},
4964 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4965 recvmsg_into_doc,},
4966 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4967 sendmsg_doc},
4968#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004969#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004970 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004971 sendmsg_afalg_doc},
4972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004974};
4975
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004976/* SockObject members */
4977static PyMemberDef sock_memberlist[] = {
4978 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4979 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4980 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004981 {0},
4982};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004983
Victor Stinner71694d52015-03-28 01:18:54 +01004984static PyGetSetDef sock_getsetlist[] = {
4985 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4986 {NULL} /* sentinel */
4987};
4988
Guido van Rossum73624e91994-10-10 17:59:00 +00004989/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004990 First close the file description. */
4991
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004992static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004993sock_finalize(PySocketSockObject *s)
4994{
4995 SOCKET_T fd;
4996 PyObject *error_type, *error_value, *error_traceback;
4997
4998 /* Save the current exception, if any. */
4999 PyErr_Fetch(&error_type, &error_value, &error_traceback);
5000
Victor Stinnerd3afb622016-07-22 17:47:09 +02005001 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005002 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5003 /* Spurious errors can appear at shutdown */
5004 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5005 PyErr_WriteUnraisable((PyObject *)s);
5006 }
5007 }
5008
5009 /* Only close the socket *after* logging the ResourceWarning warning
5010 to allow the logger to call socket methods like
5011 socket.getsockname(). If the socket is closed before, socket
5012 methods fails with the EBADF error. */
5013 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005014 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005015
5016 /* We do not want to retry upon EINTR: see sock_close() */
5017 Py_BEGIN_ALLOW_THREADS
5018 (void) SOCKETCLOSE(fd);
5019 Py_END_ALLOW_THREADS
5020 }
5021
5022 /* Restore the saved exception. */
5023 PyErr_Restore(error_type, error_value, error_traceback);
5024}
5025
5026static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005027sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005028{
Victor Stinner19a8e842016-03-21 16:36:48 +01005029 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5030 return;
5031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005033}
5034
Guido van Rossum30a685f1991-06-27 15:51:29 +00005035
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005036static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005037sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005038{
Victor Stinnere254e532014-07-26 14:36:55 +02005039 long sock_fd;
5040 /* On Windows, this test is needed because SOCKET_T is unsigned */
5041 if (s->sock_fd == INVALID_SOCKET) {
5042 sock_fd = -1;
5043 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005044#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005045 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 /* this can occur on Win64, and actually there is a special
5047 ugly printf formatter for decimal pointer length integer
5048 printing, only bother if necessary*/
5049 PyErr_SetString(PyExc_OverflowError,
5050 "no printf formatter to display "
5051 "the socket descriptor in decimal");
5052 return NULL;
5053 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005054#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005055 else
5056 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 return PyUnicode_FromFormat(
5058 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005059 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 s->sock_type,
5061 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005062}
5063
5064
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005065/* Create a new, uninitialized socket object. */
5066
5067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005068sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 new = type->tp_alloc(type, 0);
5073 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005074 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005075 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 ((PySocketSockObject *)new)->errorhandler = &set_error;
5077 }
5078 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005079}
5080
5081
5082/* Initialize a new socket object. */
5083
Victor Stinnerdaf45552013-08-28 00:53:59 +02005084#ifdef SOCK_CLOEXEC
5085/* socket() and socketpair() fail with EINVAL on Linux kernel older
5086 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5087static int sock_cloexec_works = -1;
5088#endif
5089
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005090/*ARGSUSED*/
5091static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005092sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 PySocketSockObject *s = (PySocketSockObject *)self;
5095 PyObject *fdobj = NULL;
5096 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005097 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005099#ifndef MS_WINDOWS
5100#ifdef SOCK_CLOEXEC
5101 int *atomic_flag_works = &sock_cloexec_works;
5102#else
5103 int *atomic_flag_works = NULL;
5104#endif
5105#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5108 "|iiiO:socket", keywords,
5109 &family, &type, &proto, &fdobj))
5110 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005111
Steve Dowerb82e17e2019-05-23 08:45:22 -07005112#ifdef MS_WINDOWS
5113 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005114 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005115#endif
5116 {
5117 if (PySys_Audit("socket.__new__", "Oiii",
5118 s, family, type, proto) < 0) {
5119 return -1;
5120 }
5121 }
5122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005124#ifdef MS_WINDOWS
5125 /* recreate a socket that was duplicated */
5126 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005127 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005128 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5129 PyErr_Format(PyExc_ValueError,
5130 "socket descriptor string has wrong size, "
5131 "should be %zu bytes.", sizeof(info));
5132 return -1;
5133 }
5134 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005135
Steve Dower63ba5cc2020-03-31 12:38:53 +01005136 if (PySys_Audit("socket.__new__", "Oiii", s,
5137 info.iAddressFamily, info.iSocketType,
5138 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005139 return -1;
5140 }
5141
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005142 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005143 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005144 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5145 Py_END_ALLOW_THREADS
5146 if (fd == INVALID_SOCKET) {
5147 set_error();
5148 return -1;
5149 }
5150 family = info.iAddressFamily;
5151 type = info.iSocketType;
5152 proto = info.iProtocol;
5153 }
5154 else
5155#endif
5156 {
Dima Tisneke9912702018-12-17 22:07:55 +09005157 fd = PyLong_AsSocket_t(fdobj);
5158 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5159 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005160#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005161 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005162#else
Dima Tisneke9912702018-12-17 22:07:55 +09005163 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005164#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005165 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5166 return -1;
5167 }
5168
5169 /* validate that passed file descriptor is valid and a socket. */
5170 sock_addr_t addrbuf;
5171 socklen_t addrlen = sizeof(sock_addr_t);
5172
5173 memset(&addrbuf, 0, addrlen);
5174 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5175 if (family == -1) {
5176 family = SAS2SA(&addrbuf)->sa_family;
5177 }
5178 } else {
5179#ifdef MS_WINDOWS
5180 /* getsockname() on an unbound socket is an error on Windows.
5181 Invalid descriptor and not a socket is same error code.
5182 Error out if family must be resolved, or bad descriptor. */
5183 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5184#else
5185 /* getsockname() is not supported for SOL_ALG on Linux. */
5186 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5187#endif
5188 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005189 return -1;
5190 }
5191 }
5192#ifdef SO_TYPE
5193 if (type == -1) {
5194 int tmp;
5195 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005196 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5197 (void *)&tmp, &slen) == 0)
5198 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005199 type = tmp;
5200 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005201 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005202 return -1;
5203 }
5204 }
5205#else
5206 type = SOCK_STREAM;
5207#endif
5208#ifdef SO_PROTOCOL
5209 if (proto == -1) {
5210 int tmp;
5211 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005212 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5213 (void *)&tmp, &slen) == 0)
5214 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005215 proto = tmp;
5216 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005217 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005218 return -1;
5219 }
5220 }
5221#else
5222 proto = 0;
5223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 }
5225 }
5226 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005227 /* No fd, default to AF_INET and SOCK_STREAM */
5228 if (family == -1) {
5229 family = AF_INET;
5230 }
5231 if (type == -1) {
5232 type = SOCK_STREAM;
5233 }
5234 if (proto == -1) {
5235 proto = 0;
5236 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005237#ifdef MS_WINDOWS
5238 /* Windows implementation */
5239#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5240#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5241#endif
5242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005244 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005245 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005246 NULL, 0,
5247 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5248 if (fd == INVALID_SOCKET) {
5249 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5250 support_wsa_no_inherit = 0;
5251 fd = socket(family, type, proto);
5252 }
5253 }
5254 else {
5255 fd = socket(family, type, proto);
5256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 if (fd == INVALID_SOCKET) {
5260 set_error();
5261 return -1;
5262 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005263
5264 if (!support_wsa_no_inherit) {
5265 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5266 closesocket(fd);
5267 PyErr_SetFromWindowsErr(0);
5268 return -1;
5269 }
5270 }
5271#else
5272 /* UNIX */
5273 Py_BEGIN_ALLOW_THREADS
5274#ifdef SOCK_CLOEXEC
5275 if (sock_cloexec_works != 0) {
5276 fd = socket(family, type | SOCK_CLOEXEC, proto);
5277 if (sock_cloexec_works == -1) {
5278 if (fd >= 0) {
5279 sock_cloexec_works = 1;
5280 }
5281 else if (errno == EINVAL) {
5282 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5283 sock_cloexec_works = 0;
5284 fd = socket(family, type, proto);
5285 }
5286 }
5287 }
5288 else
5289#endif
5290 {
5291 fd = socket(family, type, proto);
5292 }
5293 Py_END_ALLOW_THREADS
5294
5295 if (fd == INVALID_SOCKET) {
5296 set_error();
5297 return -1;
5298 }
5299
5300 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5301 SOCKETCLOSE(fd);
5302 return -1;
5303 }
5304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005306 if (init_sockobject(s, fd, family, type, proto) == -1) {
5307 SOCKETCLOSE(fd);
5308 return -1;
5309 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005312
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005313}
5314
5315
Guido van Rossumb6775db1994-08-01 11:34:53 +00005316/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005317
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005318static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5320 "_socket.socket", /* tp_name */
5321 sizeof(PySocketSockObject), /* tp_basicsize */
5322 0, /* tp_itemsize */
5323 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005324 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 0, /* tp_getattr */
5326 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005327 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 (reprfunc)sock_repr, /* tp_repr */
5329 0, /* tp_as_number */
5330 0, /* tp_as_sequence */
5331 0, /* tp_as_mapping */
5332 0, /* tp_hash */
5333 0, /* tp_call */
5334 0, /* tp_str */
5335 PyObject_GenericGetAttr, /* tp_getattro */
5336 0, /* tp_setattro */
5337 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005338 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 sock_doc, /* tp_doc */
5340 0, /* tp_traverse */
5341 0, /* tp_clear */
5342 0, /* tp_richcompare */
5343 0, /* tp_weaklistoffset */
5344 0, /* tp_iter */
5345 0, /* tp_iternext */
5346 sock_methods, /* tp_methods */
5347 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005348 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 0, /* tp_base */
5350 0, /* tp_dict */
5351 0, /* tp_descr_get */
5352 0, /* tp_descr_set */
5353 0, /* tp_dictoffset */
5354 sock_initobj, /* tp_init */
5355 PyType_GenericAlloc, /* tp_alloc */
5356 sock_new, /* tp_new */
5357 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005358 0, /* tp_is_gc */
5359 0, /* tp_bases */
5360 0, /* tp_mro */
5361 0, /* tp_cache */
5362 0, /* tp_subclasses */
5363 0, /* tp_weaklist */
5364 0, /* tp_del */
5365 0, /* tp_version_tag */
5366 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005367};
5368
Guido van Rossum30a685f1991-06-27 15:51:29 +00005369
Guido van Rossum81194471991-07-27 21:42:02 +00005370/* Python interface to gethostname(). */
5371
5372/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005373static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005374socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005375{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005376 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5377 return NULL;
5378 }
5379
Martin v. Löwis72f48422010-10-29 18:20:08 +00005380#ifdef MS_WINDOWS
5381 /* Don't use winsock's gethostname, as this returns the ANSI
5382 version of the hostname, whereas we need a Unicode string.
5383 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005384 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005385 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005386 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005387 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005388
5389 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005390 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005391
5392 if (GetLastError() != ERROR_MORE_DATA)
5393 return PyErr_SetFromWindowsErr(0);
5394
5395 if (size == 0)
5396 return PyUnicode_New(0, 0);
5397
5398 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5399 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005400 name = PyMem_New(wchar_t, size);
5401 if (!name) {
5402 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005403 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005404 }
Victor Stinner74168972011-11-17 01:11:36 +01005405 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5406 name,
5407 &size))
5408 {
5409 PyMem_Free(name);
5410 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005411 }
Victor Stinner74168972011-11-17 01:11:36 +01005412
5413 result = PyUnicode_FromWideChar(name, size);
5414 PyMem_Free(name);
5415 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005416#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 char buf[1024];
5418 int res;
5419 Py_BEGIN_ALLOW_THREADS
5420 res = gethostname(buf, (int) sizeof buf - 1);
5421 Py_END_ALLOW_THREADS
5422 if (res < 0)
5423 return set_error();
5424 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005425 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005426#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005427}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005429PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005430"gethostname() -> string\n\
5431\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005432Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005433
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005434#ifdef HAVE_SETHOSTNAME
5435PyDoc_STRVAR(sethostname_doc,
5436"sethostname(name)\n\n\
5437Sets the hostname to name.");
5438
5439static PyObject *
5440socket_sethostname(PyObject *self, PyObject *args)
5441{
5442 PyObject *hnobj;
5443 Py_buffer buf;
5444 int res, flag = 0;
5445
Christian Heimesd2774c72013-06-19 02:06:29 +02005446#ifdef _AIX
5447/* issue #18259, not declared in any useful header file */
5448extern int sethostname(const char *, size_t);
5449#endif
5450
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005451 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5452 PyErr_Clear();
5453 if (!PyArg_ParseTuple(args, "O&:sethostname",
5454 PyUnicode_FSConverter, &hnobj))
5455 return NULL;
5456 flag = 1;
5457 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005458
5459 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5460 return NULL;
5461 }
5462
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005463 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5464 if (!res) {
5465 res = sethostname(buf.buf, buf.len);
5466 PyBuffer_Release(&buf);
5467 }
5468 if (flag)
5469 Py_DECREF(hnobj);
5470 if (res)
5471 return set_error();
5472 Py_RETURN_NONE;
5473}
5474#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005475
Guido van Rossum30a685f1991-06-27 15:51:29 +00005476/* Python interface to gethostbyname(name). */
5477
5478/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005479static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005480socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005483 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005484 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005485
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005486 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005488 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5489 goto finally;
5490 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005491 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005492 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005493 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005494finally:
5495 PyMem_Free(name);
5496 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005497}
5498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005499PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005500"gethostbyname(host) -> address\n\
5501\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005502Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005503
5504
Victor Stinner72400302016-01-28 15:41:01 +01005505static PyObject*
5506sock_decode_hostname(const char *name)
5507{
5508#ifdef MS_WINDOWS
5509 /* Issue #26227: gethostbyaddr() returns a string encoded
5510 * to the ANSI code page */
5511 return PyUnicode_DecodeFSDefault(name);
5512#else
5513 /* Decode from UTF-8 */
5514 return PyUnicode_FromString(name);
5515#endif
5516}
5517
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005518/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5519
5520static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005521gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 char **pch;
5524 PyObject *rtn_tuple = (PyObject *)NULL;
5525 PyObject *name_list = (PyObject *)NULL;
5526 PyObject *addr_list = (PyObject *)NULL;
5527 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005528 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 if (h == NULL) {
5531 /* Let's get real error message to return */
5532 set_herror(h_errno);
5533 return NULL;
5534 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 if (h->h_addrtype != af) {
5537 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005538 errno = EAFNOSUPPORT;
5539 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 return NULL;
5541 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 case AF_INET:
5546 if (alen < sizeof(struct sockaddr_in))
5547 return NULL;
5548 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005549
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005550#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 case AF_INET6:
5552 if (alen < sizeof(struct sockaddr_in6))
5553 return NULL;
5554 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005555#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 if ((name_list = PyList_New(0)) == NULL)
5560 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if ((addr_list = PyList_New(0)) == NULL)
5563 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 /* SF #1511317: h_aliases can be NULL */
5566 if (h->h_aliases) {
5567 for (pch = h->h_aliases; *pch != NULL; pch++) {
5568 int status;
5569 tmp = PyUnicode_FromString(*pch);
5570 if (tmp == NULL)
5571 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 status = PyList_Append(name_list, tmp);
5574 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 if (status)
5577 goto err;
5578 }
5579 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5582 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 case AF_INET:
5587 {
5588 struct sockaddr_in sin;
5589 memset(&sin, 0, sizeof(sin));
5590 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005591#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005595 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 if (pch == h->h_addr_list && alen >= sizeof(sin))
5598 memcpy((char *) addr, &sin, sizeof(sin));
5599 break;
5600 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005601
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005602#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 case AF_INET6:
5604 {
5605 struct sockaddr_in6 sin6;
5606 memset(&sin6, 0, sizeof(sin6));
5607 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005608#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005612 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5615 memcpy((char *) addr, &sin6, sizeof(sin6));
5616 break;
5617 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005618#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005621 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 "unsupported address family");
5623 return NULL;
5624 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 if (tmp == NULL)
5627 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 status = PyList_Append(addr_list, tmp);
5630 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 if (status)
5633 goto err;
5634 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005635
Victor Stinner72400302016-01-28 15:41:01 +01005636 name = sock_decode_hostname(h->h_name);
5637 if (name == NULL)
5638 goto err;
5639 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005640
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005641 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 Py_XDECREF(name_list);
5643 Py_XDECREF(addr_list);
5644 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005645}
5646
5647
5648/* Python interface to gethostbyname_ex(name). */
5649
5650/*ARGSUSED*/
5651static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005652socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 char *name;
5655 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005656 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005658 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005659#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005661#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005663#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 char buf[16384];
5665 int buf_len = (sizeof buf) - 1;
5666 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005667#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005668#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005670#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005671#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005672
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005673 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005675 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5676 goto finally;
5677 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005678 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005679 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005681#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005682#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005683 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005685#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005687#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 memset((void *) &data, '\0', sizeof(data));
5689 result = gethostbyname_r(name, &hp_allocated, &data);
5690 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005691#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005692#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005693#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005695#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005696 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005698#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 Py_END_ALLOW_THREADS
5700 /* Some C libraries would require addr.__ss_family instead of
5701 addr.ss_family.
5702 Therefore, we cast the sockaddr_storage into sockaddr to
5703 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005704 sa = SAS2SA(&addr);
5705 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005707#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005709#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005710finally:
5711 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005713}
5714
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005715PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005716"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5717\n\
5718Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005719for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005720
5721
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005722/* Python interface to gethostbyaddr(IP). */
5723
5724/*ARGSUSED*/
5725static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005726socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005727{
Charles-François Natali8b759652011-12-23 16:44:51 +01005728 sock_addr_t addr;
5729 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 char *ip_num;
5731 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005732 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005733#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005735#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005737#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 /* glibcs up to 2.10 assume that the buf argument to
5739 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5740 does not ensure. The attribute below instructs the compiler
5741 to maintain this alignment. */
5742 char buf[16384] Py_ALIGNED(8);
5743 int buf_len = (sizeof buf) - 1;
5744 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005745#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005746#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005748#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005749#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005750 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 int al;
5752 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005753
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005754 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005756 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5757 goto finally;
5758 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 af = AF_UNSPEC;
5760 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005761 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 af = sa->sa_family;
5763 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005764 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 switch (af) {
5766 case AF_INET:
5767 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5768 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5769 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005770#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 case AF_INET6:
5772 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5773 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5774 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005777 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005778 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 }
5780 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005781#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005782#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005783 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 &hp_allocated, buf, buf_len,
5785 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005786#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 h = gethostbyaddr_r(ap, al, af,
5788 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005789#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 memset((void *) &data, '\0', sizeof(data));
5791 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5792 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005793#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005794#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005795#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005797#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005798 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005800#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005802 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005803#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005805#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005806finally:
5807 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005809}
5810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005811PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005812"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5813\n\
5814Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005815for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005816
Guido van Rossum30a685f1991-06-27 15:51:29 +00005817
5818/* Python interface to getservbyname(name).
5819 This only returns the port number, since the other info is already
5820 known or not useful (like the list of aliases). */
5821
5822/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005823static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005824socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005825{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005826 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 struct servent *sp;
5828 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5829 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005830
5831 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5832 return NULL;
5833 }
5834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 Py_BEGIN_ALLOW_THREADS
5836 sp = getservbyname(name, proto);
5837 Py_END_ALLOW_THREADS
5838 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005839 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 return NULL;
5841 }
5842 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005843}
5844
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005845PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005846"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005847\n\
5848Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005849The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5850otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005851
Guido van Rossum30a685f1991-06-27 15:51:29 +00005852
Barry Warsaw11b91a02004-06-28 00:50:43 +00005853/* Python interface to getservbyport(port).
5854 This only returns the service name, since the other info is already
5855 known or not useful (like the list of aliases). */
5856
5857/*ARGSUSED*/
5858static PyObject *
5859socket_getservbyport(PyObject *self, PyObject *args)
5860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005862 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 struct servent *sp;
5864 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5865 return NULL;
5866 if (port < 0 || port > 0xffff) {
5867 PyErr_SetString(
5868 PyExc_OverflowError,
5869 "getservbyport: port must be 0-65535.");
5870 return NULL;
5871 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005872
5873 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5874 return NULL;
5875 }
5876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 Py_BEGIN_ALLOW_THREADS
5878 sp = getservbyport(htons((short)port), proto);
5879 Py_END_ALLOW_THREADS
5880 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005881 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 return NULL;
5883 }
5884 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005885}
5886
5887PyDoc_STRVAR(getservbyport_doc,
5888"getservbyport(port[, protocolname]) -> string\n\
5889\n\
5890Return the service name from a port number and protocol name.\n\
5891The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5892otherwise any protocol will match.");
5893
Guido van Rossum3901d851996-12-19 16:35:04 +00005894/* Python interface to getprotobyname(name).
5895 This only returns the protocol number, since the other info is
5896 already known or not useful (like the list of aliases). */
5897
5898/*ARGSUSED*/
5899static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005900socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005901{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005902 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 struct protoent *sp;
5904 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5905 return NULL;
5906 Py_BEGIN_ALLOW_THREADS
5907 sp = getprotobyname(name);
5908 Py_END_ALLOW_THREADS
5909 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005910 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 return NULL;
5912 }
5913 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005914}
5915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005916PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005917"getprotobyname(name) -> integer\n\
5918\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005919Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005920
Christian Heimesd0e31b92018-01-27 09:54:13 +01005921static PyObject *
5922socket_close(PyObject *self, PyObject *fdobj)
5923{
5924 SOCKET_T fd;
5925 int res;
5926
5927 fd = PyLong_AsSocket_t(fdobj);
5928 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5929 return NULL;
5930 Py_BEGIN_ALLOW_THREADS
5931 res = SOCKETCLOSE(fd);
5932 Py_END_ALLOW_THREADS
5933 /* bpo-30319: The peer can already have closed the connection.
5934 Python ignores ECONNRESET on close(). */
5935 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5936 return set_error();
5937 }
5938 Py_RETURN_NONE;
5939}
5940
5941PyDoc_STRVAR(close_doc,
5942"close(integer) -> None\n\
5943\n\
5944Close an integer socket file descriptor. This is like os.close(), but for\n\
5945sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005946
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005947#ifndef NO_DUP
5948/* dup() function for socket fds */
5949
5950static PyObject *
5951socket_dup(PyObject *self, PyObject *fdobj)
5952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 SOCKET_T fd, newfd;
5954 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005955#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005956 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005957#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 fd = PyLong_AsSocket_t(fdobj);
5960 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5961 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005962
Victor Stinnerdaf45552013-08-28 00:53:59 +02005963#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005964 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005965 return set_error();
5966
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005967 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005968 FROM_PROTOCOL_INFO,
5969 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 if (newfd == INVALID_SOCKET)
5971 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005972
Victor Stinnerdaf45552013-08-28 00:53:59 +02005973 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5974 closesocket(newfd);
5975 PyErr_SetFromWindowsErr(0);
5976 return NULL;
5977 }
5978#else
5979 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5980 newfd = _Py_dup(fd);
5981 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005982 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005983#endif
5984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 newfdobj = PyLong_FromSocket_t(newfd);
5986 if (newfdobj == NULL)
5987 SOCKETCLOSE(newfd);
5988 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005989}
5990
5991PyDoc_STRVAR(dup_doc,
5992"dup(integer) -> integer\n\
5993\n\
5994Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5995sockets; on some platforms os.dup() won't work for socket file descriptors.");
5996#endif
5997
5998
Dave Cole331708b2004-08-09 04:51:41 +00005999#ifdef HAVE_SOCKETPAIR
6000/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006001 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006002 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006003
6004/*ARGSUSED*/
6005static PyObject *
6006socket_socketpair(PyObject *self, PyObject *args)
6007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 PySocketSockObject *s0 = NULL, *s1 = NULL;
6009 SOCKET_T sv[2];
6010 int family, type = SOCK_STREAM, proto = 0;
6011 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006012#ifdef SOCK_CLOEXEC
6013 int *atomic_flag_works = &sock_cloexec_works;
6014#else
6015 int *atomic_flag_works = NULL;
6016#endif
6017 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006018
6019#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006021#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6025 &family, &type, &proto))
6026 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006029 Py_BEGIN_ALLOW_THREADS
6030#ifdef SOCK_CLOEXEC
6031 if (sock_cloexec_works != 0) {
6032 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6033 if (sock_cloexec_works == -1) {
6034 if (ret >= 0) {
6035 sock_cloexec_works = 1;
6036 }
6037 else if (errno == EINVAL) {
6038 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6039 sock_cloexec_works = 0;
6040 ret = socketpair(family, type, proto, sv);
6041 }
6042 }
6043 }
6044 else
6045#endif
6046 {
6047 ret = socketpair(family, type, proto, sv);
6048 }
6049 Py_END_ALLOW_THREADS
6050
6051 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006053
6054 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6055 goto finally;
6056 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6057 goto finally;
6058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 s0 = new_sockobject(sv[0], family, type, proto);
6060 if (s0 == NULL)
6061 goto finally;
6062 s1 = new_sockobject(sv[1], family, type, proto);
6063 if (s1 == NULL)
6064 goto finally;
6065 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006066
6067finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 if (res == NULL) {
6069 if (s0 == NULL)
6070 SOCKETCLOSE(sv[0]);
6071 if (s1 == NULL)
6072 SOCKETCLOSE(sv[1]);
6073 }
6074 Py_XDECREF(s0);
6075 Py_XDECREF(s1);
6076 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006077}
6078
6079PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006080"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006081\n\
6082Create a pair of socket objects from the sockets returned by the platform\n\
6083socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006084The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006085AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006086
6087#endif /* HAVE_SOCKETPAIR */
6088
6089
Guido van Rossum006bf911996-06-12 04:04:55 +00006090static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006091socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006092{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006093 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006094
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006095 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 return NULL;
6097 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006098 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006100 "ntohs: can't convert negative Python int to C "
6101 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 return NULL;
6103 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006104 if (x > 0xffff) {
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006105 PyErr_SetString(PyExc_OverflowError,
6106 "ntohs: Python int too large to convert to C "
6107 "16-bit unsigned integer");
6108 return NULL;
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006109 }
6110 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006111}
6112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006113PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006114"ntohs(integer) -> integer\n\
6115\n\
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006116Convert a 16-bit unsigned integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006117
6118
Guido van Rossum006bf911996-06-12 04:04:55 +00006119static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006120socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 if (PyLong_Check(arg)) {
6125 x = PyLong_AsUnsignedLong(arg);
6126 if (x == (unsigned long) -1 && PyErr_Occurred())
6127 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006128#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 {
6130 unsigned long y;
6131 /* only want the trailing 32 bits */
6132 y = x & 0xFFFFFFFFUL;
6133 if (y ^ x)
6134 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006135 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 x = y;
6137 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 }
6140 else
6141 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006142 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006145}
6146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006147PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006148"ntohl(integer) -> integer\n\
6149\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006150Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006151
6152
Guido van Rossum006bf911996-06-12 04:04:55 +00006153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006154socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006155{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006156 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006157
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006158 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 return NULL;
6160 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006161 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006163 "htons: can't convert negative Python int to C "
6164 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 return NULL;
6166 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006167 if (x > 0xffff) {
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006168 PyErr_SetString(PyExc_OverflowError,
6169 "htons: Python int too large to convert to C "
6170 "16-bit unsigned integer");
6171 return NULL;
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006172 }
6173 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006174}
6175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006176PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006177"htons(integer) -> integer\n\
6178\n\
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006179Convert a 16-bit unsigned integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006180
6181
Guido van Rossum006bf911996-06-12 04:04:55 +00006182static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006183socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 if (PyLong_Check(arg)) {
6188 x = PyLong_AsUnsignedLong(arg);
6189 if (x == (unsigned long) -1 && PyErr_Occurred())
6190 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006191#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 {
6193 unsigned long y;
6194 /* only want the trailing 32 bits */
6195 y = x & 0xFFFFFFFFUL;
6196 if (y ^ x)
6197 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006198 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 x = y;
6200 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 }
6203 else
6204 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006205 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 Py_TYPE(arg)->tp_name);
6207 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006208}
6209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006210PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006211"htonl(integer) -> integer\n\
6212\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006213Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006214
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006215/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006217PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006218"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006219\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006220Convert 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 +00006221binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006222
6223static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006224socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006225{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006226#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006228#endif
6229
6230#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006231#if (SIZEOF_INT != 4)
6232#error "Not sure if in_addr_t exists and int is not 32-bits."
6233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 /* Have to use inet_addr() instead */
6235 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006236#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006237 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6240 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006241
Tim Peters1df9fdd2003-02-13 03:13:40 +00006242
6243#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006244
6245#ifdef USE_INET_ATON_WEAKLINK
6246 if (inet_aton != NULL) {
6247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 if (inet_aton(ip_addr, &buf))
6249 return PyBytes_FromStringAndSize((char *)(&buf),
6250 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006251
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006252 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 "illegal IP address string passed to inet_aton");
6254 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006255
Thomas Wouters477c8d52006-05-27 19:21:47 +00006256#ifdef USE_INET_ATON_WEAKLINK
6257 } else {
6258#endif
6259
6260#endif
6261
6262#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 /* special-case this address as inet_addr might return INADDR_NONE
6265 * for this */
6266 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006267 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006269
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006270 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006274 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 "illegal IP address string passed to inet_aton");
6276 return NULL;
6277 }
6278 }
6279 return PyBytes_FromStringAndSize((char *) &packed_addr,
6280 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006281
6282#ifdef USE_INET_ATON_WEAKLINK
6283 }
6284#endif
6285
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006286#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006287}
6288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006289PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006290"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006291\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006292Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006293
6294static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006295socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006296{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006297 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006299
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006300 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 return NULL;
6302 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006303
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006304 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006305 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006307 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308 return NULL;
6309 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006310
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006311 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6312 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006313
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006314 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006316}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006317
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006318#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006319
6320PyDoc_STRVAR(inet_pton_doc,
6321"inet_pton(af, ip) -> packed IP address string\n\
6322\n\
6323Convert an IP address from string format to a packed string suitable\n\
6324for use with low-level network functions.");
6325
6326static PyObject *
6327socket_inet_pton(PyObject *self, PyObject *args)
6328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006330 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006332#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006333 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6338 return NULL;
6339 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006340
Martin v. Löwis04697e82004-06-02 12:35:29 +00006341#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006343 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 "can't use AF_INET6, IPv6 is disabled");
6345 return NULL;
6346 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006347#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 retval = inet_pton(af, ip, packed);
6350 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006351 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 return NULL;
6353 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006354 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 "illegal IP address string passed to inet_pton");
6356 return NULL;
6357 } else if (af == AF_INET) {
6358 return PyBytes_FromStringAndSize(packed,
6359 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006360#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 } else if (af == AF_INET6) {
6362 return PyBytes_FromStringAndSize(packed,
6363 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006366 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 return NULL;
6368 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006369}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006370
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006371PyDoc_STRVAR(inet_ntop_doc,
6372"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6373\n\
6374Convert a packed IP address of the given family to string format.");
6375
6376static PyObject *
6377socket_inet_ntop(PyObject *self, PyObject *args)
6378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006380 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006382#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006383 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006384#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006385 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006386#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006387
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006388 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 return NULL;
6390 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006393 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 PyErr_SetString(PyExc_ValueError,
6395 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006396 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 return NULL;
6398 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006399#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006401 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 PyErr_SetString(PyExc_ValueError,
6403 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006404 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 return NULL;
6406 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 } else {
6409 PyErr_Format(PyExc_ValueError,
6410 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006411 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 return NULL;
6413 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006414
Коренберг Марк7766b962018-02-13 00:47:42 +05006415 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006416 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6417 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006419 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 return NULL;
6421 } else {
6422 return PyUnicode_FromString(retval);
6423 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006424}
6425
6426#endif /* HAVE_INET_PTON */
6427
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006428/* Python interface to getaddrinfo(host, port). */
6429
6430/*ARGSUSED*/
6431static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006432socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006433{
Victor Stinner77af1722011-05-26 14:05:59 +02006434 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006435 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 struct addrinfo hints, *res;
6437 struct addrinfo *res0 = NULL;
6438 PyObject *hobj = NULL;
6439 PyObject *pobj = (PyObject *)NULL;
6440 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006441 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 int family, socktype, protocol, flags;
6443 int error;
6444 PyObject *all = (PyObject *)NULL;
6445 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006446
Georg Brandl6083a4b2013-10-14 06:51:46 +02006447 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006449 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006450 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 &protocol, &flags)) {
6452 return NULL;
6453 }
6454 if (hobj == Py_None) {
6455 hptr = NULL;
6456 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006457 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 if (!idna)
6459 return NULL;
6460 assert(PyBytes_Check(idna));
6461 hptr = PyBytes_AS_STRING(idna);
6462 } else if (PyBytes_Check(hobj)) {
6463 hptr = PyBytes_AsString(hobj);
6464 } else {
6465 PyErr_SetString(PyExc_TypeError,
6466 "getaddrinfo() argument 1 must be string or None");
6467 return NULL;
6468 }
6469 if (PyLong_CheckExact(pobj)) {
6470 long value = PyLong_AsLong(pobj);
6471 if (value == -1 && PyErr_Occurred())
6472 goto err;
6473 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6474 pptr = pbuf;
6475 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006476 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006477 if (pptr == NULL)
6478 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006480 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 } else if (pobj == Py_None) {
6482 pptr = (char *)NULL;
6483 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006484 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 goto err;
6486 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006487#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006488 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006489 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006490 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6491 * This workaround avoids a segfault in libsystem.
6492 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006493 pptr = "00";
6494 }
6495#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006496
6497 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6498 hobj, pobj, family, socktype, protocol) < 0) {
6499 return NULL;
6500 }
6501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 memset(&hints, 0, sizeof(hints));
6503 hints.ai_family = family;
6504 hints.ai_socktype = socktype;
6505 hints.ai_protocol = protocol;
6506 hints.ai_flags = flags;
6507 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 error = getaddrinfo(hptr, pptr, &hints, &res0);
6509 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510 if (error) {
6511 set_gaierror(error);
6512 goto err;
6513 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006514
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006515 all = PyList_New(0);
6516 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 goto err;
6518 for (res = res0; res; res = res->ai_next) {
6519 PyObject *single;
6520 PyObject *addr =
6521 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6522 if (addr == NULL)
6523 goto err;
6524 single = Py_BuildValue("iiisO", res->ai_family,
6525 res->ai_socktype, res->ai_protocol,
6526 res->ai_canonname ? res->ai_canonname : "",
6527 addr);
6528 Py_DECREF(addr);
6529 if (single == NULL)
6530 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006531
Zackery Spytz4c596d52018-11-14 15:39:01 -07006532 if (PyList_Append(all, single)) {
6533 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006535 }
6536 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 }
6538 Py_XDECREF(idna);
6539 if (res0)
6540 freeaddrinfo(res0);
6541 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006542 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 Py_XDECREF(all);
6544 Py_XDECREF(idna);
6545 if (res0)
6546 freeaddrinfo(res0);
6547 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006548}
6549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006550PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006551"getaddrinfo(host, port [, family, type, proto, flags])\n\
6552 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006554Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006555
6556/* Python interface to getnameinfo(sa, flags). */
6557
6558/*ARGSUSED*/
6559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006560socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyObject *sa = (PyObject *)NULL;
6563 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006564 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006565 int port;
6566 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6568 struct addrinfo hints, *res = NULL;
6569 int error;
6570 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006571 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 flags = flowinfo = scope_id = 0;
6574 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6575 return NULL;
6576 if (!PyTuple_Check(sa)) {
6577 PyErr_SetString(PyExc_TypeError,
6578 "getnameinfo() argument 1 must be a tuple");
6579 return NULL;
6580 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006581 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006583 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006585 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006586 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006587 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006588 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006589 return NULL;
6590 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006591
6592 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6593 return NULL;
6594 }
6595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6597 memset(&hints, 0, sizeof(hints));
6598 hints.ai_family = AF_UNSPEC;
6599 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006600 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 error = getaddrinfo(hostp, pbuf, &hints, &res);
6603 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 if (error) {
6605 set_gaierror(error);
6606 goto fail;
6607 }
6608 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006609 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 "sockaddr resolved to multiple addresses");
6611 goto fail;
6612 }
6613 switch (res->ai_family) {
6614 case AF_INET:
6615 {
6616 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006617 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 "IPv4 sockaddr must be 2 tuple");
6619 goto fail;
6620 }
6621 break;
6622 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006623#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 case AF_INET6:
6625 {
6626 struct sockaddr_in6 *sin6;
6627 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006628 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 sin6->sin6_scope_id = scope_id;
6630 break;
6631 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006634 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6636 if (error) {
6637 set_gaierror(error);
6638 goto fail;
6639 }
Victor Stinner72400302016-01-28 15:41:01 +01006640
6641 name = sock_decode_hostname(hbuf);
6642 if (name == NULL)
6643 goto fail;
6644 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006645
6646fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 if (res)
6648 freeaddrinfo(res);
6649 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006650}
6651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006652PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006653"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006654\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006655Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006656
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006657
6658/* Python API to getting and setting the default timeout value. */
6659
6660static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306661socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006662{
Victor Stinner71694d52015-03-28 01:18:54 +01006663 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006664 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665 }
Victor Stinner71694d52015-03-28 01:18:54 +01006666 else {
6667 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6668 return PyFloat_FromDouble(seconds);
6669 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006670}
6671
6672PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006673"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006674\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006675Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006676A value of None indicates that new socket objects have no timeout.\n\
6677When the socket module is first imported, the default is None.");
6678
6679static PyObject *
6680socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6681{
Victor Stinner71694d52015-03-28 01:18:54 +01006682 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006683
Victor Stinner71694d52015-03-28 01:18:54 +01006684 if (socket_parse_timeout(&timeout, arg) < 0)
6685 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006688
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006689 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006690}
6691
6692PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006693"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006694\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006695Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006696A value of None indicates that new socket objects have no timeout.\n\
6697When the socket module is first imported, the default is None.");
6698
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006699#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006700/* Python API for getting interface indices and names */
6701
6702static PyObject *
6703socket_if_nameindex(PyObject *self, PyObject *arg)
6704{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006705 PyObject *list = PyList_New(0);
6706 if (list == NULL) {
6707 return NULL;
6708 }
6709#ifdef MS_WINDOWS
6710 PMIB_IF_TABLE2 tbl;
6711 int ret;
6712 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6713 Py_DECREF(list);
6714 // ret is used instead of GetLastError()
6715 return PyErr_SetFromWindowsErr(ret);
6716 }
6717 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6718 MIB_IF_ROW2 r = tbl->Table[i];
6719 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6720 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6721 Py_ARRAY_LENGTH(buf)))) {
6722 Py_DECREF(list);
6723 FreeMibTable(tbl);
6724 // ret is used instead of GetLastError()
6725 return PyErr_SetFromWindowsErr(ret);
6726 }
6727 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6728 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6729 Py_XDECREF(tuple);
6730 Py_DECREF(list);
6731 FreeMibTable(tbl);
6732 return NULL;
6733 }
6734 Py_DECREF(tuple);
6735 }
6736 FreeMibTable(tbl);
6737 return list;
6738#else
Charles-François Natali60713592011-05-20 16:55:06 +02006739 int i;
6740 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006741
Charles-François Natali60713592011-05-20 16:55:06 +02006742 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006743 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006744 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006745 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006746 return NULL;
6747 }
6748
Gregory P. Smithb474e672018-12-30 17:05:36 -08006749#ifdef _Py_MEMORY_SANITIZER
6750 __msan_unpoison(ni, sizeof(ni));
6751 __msan_unpoison(&ni[0], sizeof(ni[0]));
6752#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006753 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006754#ifdef _Py_MEMORY_SANITIZER
6755 /* This one isn't the end sentinel, the next one must exist. */
6756 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6757 /* Otherwise Py_BuildValue internals are flagged by MSan when
6758 they access the not-msan-tracked if_name string data. */
6759 {
6760 char *to_sanitize = ni[i].if_name;
6761 do {
6762 __msan_unpoison(to_sanitize, 1);
6763 } while (*to_sanitize++ != '\0');
6764 }
6765#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006766 PyObject *ni_tuple = Py_BuildValue("IO&",
6767 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006768
6769 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6770 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006771 Py_DECREF(list);
6772 if_freenameindex(ni);
6773 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006774 }
6775 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006776 }
6777
6778 if_freenameindex(ni);
6779 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006780#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006781}
6782
6783PyDoc_STRVAR(if_nameindex_doc,
6784"if_nameindex()\n\
6785\n\
6786Returns a list of network interface information (index, name) tuples.");
6787
Charles-François Natali60713592011-05-20 16:55:06 +02006788static PyObject *
6789socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006790{
Charles-François Natali60713592011-05-20 16:55:06 +02006791 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006792#ifdef MS_WINDOWS
6793 NET_IFINDEX index;
6794#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006795 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006796#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006797 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6798 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006799 return NULL;
6800
Charles-François Natali60713592011-05-20 16:55:06 +02006801 index = if_nametoindex(PyBytes_AS_STRING(oname));
6802 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006803 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006804 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006805 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006806 return NULL;
6807 }
6808
6809 return PyLong_FromUnsignedLong(index);
6810}
6811
6812PyDoc_STRVAR(if_nametoindex_doc,
6813"if_nametoindex(if_name)\n\
6814\n\
6815Returns the interface index corresponding to the interface name if_name.");
6816
Charles-François Natali60713592011-05-20 16:55:06 +02006817static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006818socket_if_indextoname(PyObject *self, PyObject *arg)
6819{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006820#ifdef MS_WINDOWS
6821 NET_IFINDEX index;
6822#else
Charles-François Natali60713592011-05-20 16:55:06 +02006823 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006824#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006825 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006826
Charles-François Natali60713592011-05-20 16:55:06 +02006827 index = PyLong_AsUnsignedLong(arg);
6828 if (index == (unsigned long) -1)
6829 return NULL;
6830
6831 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006832 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006833 return NULL;
6834 }
6835
Charles-François Natali60713592011-05-20 16:55:06 +02006836 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006837}
6838
6839PyDoc_STRVAR(if_indextoname_doc,
6840"if_indextoname(if_index)\n\
6841\n\
6842Returns the interface name corresponding to the interface index if_index.");
6843
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006844#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006845
6846
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006847#ifdef CMSG_LEN
6848/* Python interface to CMSG_LEN(length). */
6849
6850static PyObject *
6851socket_CMSG_LEN(PyObject *self, PyObject *args)
6852{
6853 Py_ssize_t length;
6854 size_t result;
6855
6856 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6857 return NULL;
6858 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6859 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6860 return NULL;
6861 }
6862 return PyLong_FromSize_t(result);
6863}
6864
6865PyDoc_STRVAR(CMSG_LEN_doc,
6866"CMSG_LEN(length) -> control message length\n\
6867\n\
6868Return the total length, without trailing padding, of an ancillary\n\
6869data item with associated data of the given length. This value can\n\
6870often be used as the buffer size for recvmsg() to receive a single\n\
6871item of ancillary data, but RFC 3542 requires portable applications to\n\
6872use CMSG_SPACE() and thus include space for padding, even when the\n\
6873item will be the last in the buffer. Raises OverflowError if length\n\
6874is outside the permissible range of values.");
6875
6876
6877#ifdef CMSG_SPACE
6878/* Python interface to CMSG_SPACE(length). */
6879
6880static PyObject *
6881socket_CMSG_SPACE(PyObject *self, PyObject *args)
6882{
6883 Py_ssize_t length;
6884 size_t result;
6885
6886 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6887 return NULL;
6888 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6889 PyErr_SetString(PyExc_OverflowError,
6890 "CMSG_SPACE() argument out of range");
6891 return NULL;
6892 }
6893 return PyLong_FromSize_t(result);
6894}
6895
6896PyDoc_STRVAR(CMSG_SPACE_doc,
6897"CMSG_SPACE(length) -> buffer size\n\
6898\n\
6899Return the buffer size needed for recvmsg() to receive an ancillary\n\
6900data item with associated data of the given length, along with any\n\
6901trailing padding. The buffer space needed to receive multiple items\n\
6902is the sum of the CMSG_SPACE() values for their associated data\n\
6903lengths. Raises OverflowError if length is outside the permissible\n\
6904range of values.");
6905#endif /* CMSG_SPACE */
6906#endif /* CMSG_LEN */
6907
6908
Guido van Rossum30a685f1991-06-27 15:51:29 +00006909/* List of functions exported by this module. */
6910
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006911static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912 {"gethostbyname", socket_gethostbyname,
6913 METH_VARARGS, gethostbyname_doc},
6914 {"gethostbyname_ex", socket_gethostbyname_ex,
6915 METH_VARARGS, ghbn_ex_doc},
6916 {"gethostbyaddr", socket_gethostbyaddr,
6917 METH_VARARGS, gethostbyaddr_doc},
6918 {"gethostname", socket_gethostname,
6919 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006920#ifdef HAVE_SETHOSTNAME
6921 {"sethostname", socket_sethostname,
6922 METH_VARARGS, sethostname_doc},
6923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924 {"getservbyname", socket_getservbyname,
6925 METH_VARARGS, getservbyname_doc},
6926 {"getservbyport", socket_getservbyport,
6927 METH_VARARGS, getservbyport_doc},
6928 {"getprotobyname", socket_getprotobyname,
6929 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006930 {"close", socket_close,
6931 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006932#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 {"dup", socket_dup,
6934 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006935#endif
Dave Cole331708b2004-08-09 04:51:41 +00006936#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937 {"socketpair", socket_socketpair,
6938 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 {"ntohs", socket_ntohs,
6941 METH_VARARGS, ntohs_doc},
6942 {"ntohl", socket_ntohl,
6943 METH_O, ntohl_doc},
6944 {"htons", socket_htons,
6945 METH_VARARGS, htons_doc},
6946 {"htonl", socket_htonl,
6947 METH_O, htonl_doc},
6948 {"inet_aton", socket_inet_aton,
6949 METH_VARARGS, inet_aton_doc},
6950 {"inet_ntoa", socket_inet_ntoa,
6951 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006952#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953 {"inet_pton", socket_inet_pton,
6954 METH_VARARGS, inet_pton_doc},
6955 {"inet_ntop", socket_inet_ntop,
6956 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006957#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006958 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006959 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960 {"getnameinfo", socket_getnameinfo,
6961 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306962 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963 METH_NOARGS, getdefaulttimeout_doc},
6964 {"setdefaulttimeout", socket_setdefaulttimeout,
6965 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006966#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006967 {"if_nameindex", socket_if_nameindex,
6968 METH_NOARGS, if_nameindex_doc},
6969 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006970 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006971 {"if_indextoname", socket_if_indextoname,
6972 METH_O, if_indextoname_doc},
6973#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006974#ifdef CMSG_LEN
6975 {"CMSG_LEN", socket_CMSG_LEN,
6976 METH_VARARGS, CMSG_LEN_doc},
6977#ifdef CMSG_SPACE
6978 {"CMSG_SPACE", socket_CMSG_SPACE,
6979 METH_VARARGS, CMSG_SPACE_doc},
6980#endif
6981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006982 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006983};
6984
Guido van Rossum30a685f1991-06-27 15:51:29 +00006985
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006986#ifdef MS_WINDOWS
6987#define OS_INIT_DEFINED
6988
6989/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006990
6991static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006992os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006994 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006995}
6996
6997static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006998os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007000 WSADATA WSAData;
7001 int ret;
7002 ret = WSAStartup(0x0101, &WSAData);
7003 switch (ret) {
7004 case 0: /* No error */
7005 Py_AtExit(os_cleanup);
7006 return 1; /* Success */
7007 case WSASYSNOTREADY:
7008 PyErr_SetString(PyExc_ImportError,
7009 "WSAStartup failed: network not ready");
7010 break;
7011 case WSAVERNOTSUPPORTED:
7012 case WSAEINVAL:
7013 PyErr_SetString(
7014 PyExc_ImportError,
7015 "WSAStartup failed: requested version not supported");
7016 break;
7017 default:
7018 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7019 break;
7020 }
7021 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007022}
7023
Guido van Rossum8d665e61996-06-26 18:22:49 +00007024#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007025
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007026
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007027
7028#ifndef OS_INIT_DEFINED
7029static int
7030os_init(void)
7031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007033}
7034#endif
7035
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007036static void
7037sock_free_api(PySocketModule_APIObject *capi)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007038{
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007039 Py_DECREF(capi->Sock_Type);
7040 Py_DECREF(capi->error);
7041 Py_DECREF(capi->timeout_error);
7042 PyMem_Free(capi);
7043}
7044
7045static void
7046sock_destroy_api(PyObject *capsule)
7047{
7048 void *capi = PyCapsule_GetPointer(capsule, PySocket_CAPSULE_NAME);
7049 sock_free_api(capi);
7050}
7051
7052static PySocketModule_APIObject *
7053sock_get_api(void)
7054{
7055 PySocketModule_APIObject *capi = PyMem_Malloc(sizeof(PySocketModule_APIObject));
7056 if (capi == NULL) {
7057 PyErr_NoMemory();
7058 return NULL;
7059 }
7060
7061 capi->Sock_Type = (PyTypeObject *)Py_NewRef(&sock_type);
7062 capi->error = Py_NewRef(PyExc_OSError);
7063 capi->timeout_error = Py_NewRef(PyExc_TimeoutError);
7064 return capi;
7065}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007066
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007067
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007068/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007069
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007070 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007071 "socket.py" which implements some additional functionality.
7072 The import of "_socket" may fail with an ImportError exception if
7073 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007074 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007075 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007076*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007078PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007079"Implementation module for socket operations.\n\
7080\n\
7081See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007082
Martin v. Löwis1a214512008-06-11 05:26:20 +00007083static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007084 PyModuleDef_HEAD_INIT,
7085 PySocket_MODULE_NAME,
7086 socket_doc,
7087 -1,
7088 socket_methods,
7089 NULL,
7090 NULL,
7091 NULL,
7092 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007093};
7094
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007095PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007096PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 if (!os_init())
7101 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007102
Victor Stinnerdaf45552013-08-28 00:53:59 +02007103#ifdef MS_WINDOWS
7104 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007105 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007106 }
7107#endif
7108
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007109 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 m = PyModule_Create(&socketmodule);
7111 if (m == NULL)
7112 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007113
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007114 Py_INCREF(PyExc_OSError);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007115 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007117 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 if (socket_herror == NULL)
7119 return NULL;
7120 Py_INCREF(socket_herror);
7121 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007122 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123 NULL);
7124 if (socket_gaierror == NULL)
7125 return NULL;
7126 Py_INCREF(socket_gaierror);
7127 PyModule_AddObject(m, "gaierror", socket_gaierror);
Christian Heimes03c8ddd2020-11-20 09:26:07 +01007128 PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError);
7129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130 Py_INCREF((PyObject *)&sock_type);
7131 if (PyModule_AddObject(m, "SocketType",
7132 (PyObject *)&sock_type) != 0)
7133 return NULL;
7134 Py_INCREF((PyObject *)&sock_type);
7135 if (PyModule_AddObject(m, "socket",
7136 (PyObject *)&sock_type) != 0)
7137 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007138
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007139#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007140 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007141#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 Py_INCREF(has_ipv6);
7145 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147 /* Export C API */
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007148 PySocketModule_APIObject *capi = sock_get_api();
7149 if (capi == NULL) {
7150 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151 return NULL;
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007152 }
7153 PyObject *capsule = PyCapsule_New(capi,
7154 PySocket_CAPSULE_NAME,
7155 sock_destroy_api);
7156 if (capsule == NULL) {
7157 sock_free_api(capi);
7158 Py_DECREF(m);
7159 return NULL;
7160 }
7161 if (PyModule_AddObject(m, PySocket_CAPI_NAME, capsule) < 0) {
7162 Py_DECREF(capsule);
7163 Py_DECREF(m);
7164 return NULL;
7165 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007167 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007168#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007170#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007172#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007174#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007175#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007176 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007178#endif
7179#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007181#endif
7182#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007185#endif
7186#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007189#endif
7190#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007193#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007194#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007197#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007198#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007201#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007202#ifdef HAVE_SOCKADDR_ALG
7203 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7204#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007205#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007208#endif
7209#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007211#endif
7212#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007215#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007216#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007219#endif
7220#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007223#endif
7224#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007227#endif
7228#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007231#endif
7232#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, AF_NETLINK);
7235 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007236#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007238#endif
7239#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007241#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7243 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007244#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007246#endif
7247#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007249#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007250#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007252#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007253#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007255#endif
7256#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007258#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007260#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007262#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007263#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007265#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007266#ifdef NETLINK_CRYPTO
7267 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7268#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007269#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007270
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007271#ifdef AF_QIPCRTR
7272 /* Qualcomm IPCROUTER */
7273 PyModule_AddIntMacro(m, AF_QIPCRTR);
7274#endif
7275
caaveryeffc12f2017-09-06 18:18:10 -04007276#ifdef AF_VSOCK
7277 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7278 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7279 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7280 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7281 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7282 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7283 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7284 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7285 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7286#endif
7287
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007288#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007291#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007292#ifdef AF_LINK
7293 PyModule_AddIntMacro(m, AF_LINK);
7294#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007295#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007298#endif
7299#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007302#endif
7303#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007306#endif
7307#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007308 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007310#endif
7311#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007312 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007314#endif
7315#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007318#endif
7319#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007322#endif
7323#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007326#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007327
Hye-Shik Chang81268602004-02-02 06:05:24 +00007328#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007330#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007332#endif /* BTPROTO_L2CAP */
7333#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, BTPROTO_HCI);
7335 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007336#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007338#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007341#endif /* !__FreeBSD__ */
7342#endif /* !__NetBSD__ && !__DragonFly__ */
7343#endif /* BTPROTO_HCI */
7344#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007346#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7348 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007349#ifdef BTPROTO_SCO
7350 PyModule_AddIntMacro(m, BTPROTO_SCO);
7351#endif /* BTPROTO_SCO */
7352#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007353
Charles-François Natali47413c12011-10-06 19:47:44 +02007354#ifdef AF_CAN
7355 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007356 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007357#endif
7358#ifdef PF_CAN
7359 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007361#endif
7362
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007363/* Reliable Datagram Sockets */
7364#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007366#endif
7367#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007369#endif
7370
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007371/* Kernel event messages */
7372#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007374#endif
7375#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007377#endif
7378
Antoine Pitroub156a462010-10-27 20:13:57 +00007379#ifdef AF_PACKET
7380 PyModule_AddIntMacro(m, AF_PACKET);
7381#endif
7382#ifdef PF_PACKET
7383 PyModule_AddIntMacro(m, PF_PACKET);
7384#endif
7385#ifdef PACKET_HOST
7386 PyModule_AddIntMacro(m, PACKET_HOST);
7387#endif
7388#ifdef PACKET_BROADCAST
7389 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7390#endif
7391#ifdef PACKET_MULTICAST
7392 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7393#endif
7394#ifdef PACKET_OTHERHOST
7395 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7396#endif
7397#ifdef PACKET_OUTGOING
7398 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7399#endif
7400#ifdef PACKET_LOOPBACK
7401 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7402#endif
7403#ifdef PACKET_FASTROUTE
7404 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007405#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007406
Christian Heimes043d6f62008-01-07 17:19:16 +00007407#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007410 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007411 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7412 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7413 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007414
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7416 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7417 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007419 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, SOL_TIPC);
7421 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7422 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7423 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7424 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007425
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7427 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7428 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7429 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007431 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007432 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7433 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007434#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007437#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7439 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7440 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7441 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7442 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7443 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007444#endif
7445
Christian Heimesdffa3942016-09-05 23:54:41 +02007446#ifdef HAVE_SOCKADDR_ALG
7447 /* Socket options */
7448 PyModule_AddIntMacro(m, ALG_SET_KEY);
7449 PyModule_AddIntMacro(m, ALG_SET_IV);
7450 PyModule_AddIntMacro(m, ALG_SET_OP);
7451 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7452 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7453 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7454
7455 /* Operations */
7456 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7457 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7458 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7459 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7460#endif
7461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007462 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007463 PyModule_AddIntMacro(m, SOCK_STREAM);
7464 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007465/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007466#ifdef SOCK_RAW
7467 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007469#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007471#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007473#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007474#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007476#endif
7477#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007479#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007490#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007492#endif
7493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007512#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007515#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007541#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007543#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007544#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007546#endif
7547#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007549#endif
7550#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007552#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007553#ifdef SO_PASSSEC
7554 PyModule_AddIntMacro(m, SO_PASSSEC);
7555#endif
7556#ifdef SO_PEERSEC
7557 PyModule_AddIntMacro(m, SO_PEERSEC);
7558#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007559#ifdef SO_BINDTODEVICE
7560 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7561#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007562#ifdef SO_PRIORITY
7563 PyModule_AddIntMacro(m, SO_PRIORITY);
7564#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007565#ifdef SO_MARK
7566 PyModule_AddIntMacro(m, SO_MARK);
7567#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007568#ifdef SO_DOMAIN
7569 PyModule_AddIntMacro(m, SO_DOMAIN);
7570#endif
7571#ifdef SO_PROTOCOL
7572 PyModule_AddIntMacro(m, SO_PROTOCOL);
7573#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007575 /* Maximum number of connections for "listen" */
7576#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007578#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007580#endif
7581
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007582 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007583#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007585#endif
7586#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007588#endif
7589#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007591#endif
7592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007593 /* Flags for send, recv */
7594#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007623#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007624#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007626#endif
7627#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007629#endif
7630#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007632#endif
7633#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007635#endif
7636#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007638#endif
7639#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007641#endif
7642#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007644#endif
7645#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007647#endif
7648#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007650#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007651#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007653#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007655 /* Protocol level and numbers, usable for [gs]etsockopt */
7656#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007661#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007664#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007670#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007673#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007676#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007679#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007682 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007686#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007687 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007688#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007689#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007691#endif
7692#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7694 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007695#endif
7696#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7698 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7699 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007700
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7702 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7703 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007704#ifdef CAN_ISOTP
7705 PyModule_AddIntMacro(m, CAN_ISOTP);
7706#endif
karl ding360371f2020-04-29 15:31:19 -07007707#ifdef CAN_J1939
7708 PyModule_AddIntMacro(m, CAN_J1939);
7709#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007710#endif
7711#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7713 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7714 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7715 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007716#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007717#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7718 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7719#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007720#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7721 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7722#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007723#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007725
7726 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007727 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7728 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7729 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7730 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7731 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7732 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7733 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7734 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7735 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7736 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7737 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7738 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007739
7740 /* BCM flags */
7741 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7742 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7743 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7744 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7745 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7746 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7747 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7748 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7749 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7750 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7751 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7752#ifdef CAN_FD_FRAME
7753 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7754 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7755#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007756#endif
karl ding360371f2020-04-29 15:31:19 -07007757#ifdef HAVE_LINUX_CAN_J1939_H
7758 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7759 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7760 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7761 PyModule_AddIntMacro(m, J1939_NO_NAME);
7762 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7763 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7764 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7765 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7766 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7767 PyModule_AddIntMacro(m, J1939_NO_PGN);
7768
7769 /* J1939 socket options */
7770 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7771 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7772 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7773 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7774
7775 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7776 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7777 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7778 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7779
7780 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7781 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7782
7783 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7784 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7785
7786 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7787#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007788#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007790#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007791#ifdef HAVE_SOCKADDR_ALG
7792 PyModule_AddIntMacro(m, SOL_ALG);
7793#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007794#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007796#endif
7797#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007799#endif
7800#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007802#endif
7803#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007805#endif
7806#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007808#endif
7809#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007811#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007812#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007813 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007814#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007815 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007820#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007822#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007823 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007842#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007845#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007846 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007848#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007849 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007851#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007852 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007853#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007854 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007855#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007856#ifdef IPPROTO_UDPLITE
7857 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7858 #ifndef UDPLITE_SEND_CSCOV
7859 #define UDPLITE_SEND_CSCOV 10
7860 #endif
7861 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7862 #ifndef UDPLITE_RECV_CSCOV
7863 #define UDPLITE_RECV_CSCOV 11
7864 #endif
7865 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007873#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007879#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007888#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007891#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007894#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007897#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007900#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007906#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007912#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007915#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007918#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007923#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007924#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007927#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007929#endif
7930/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007932 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007934 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007936#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007938#endif
7939
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007940#ifdef MS_WINDOWS
7941 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7942 PyModule_AddIntMacro(m, IPPROTO_ST);
7943 PyModule_AddIntMacro(m, IPPROTO_CBT);
7944 PyModule_AddIntMacro(m, IPPROTO_IGP);
7945 PyModule_AddIntMacro(m, IPPROTO_RDP);
7946 PyModule_AddIntMacro(m, IPPROTO_PGM);
7947 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7948 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7949#endif
7950
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007951#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007953#endif
7954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955 /* Some port configuration */
7956#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007959 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007963#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007965#endif
7966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007967 /* Some reserved IP v.4 addresses */
7968#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007980#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007981 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007983#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007985#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988#ifdef INADDR_ALLHOSTS_GROUP
7989 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7990 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007991#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007992 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007995 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007996#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007999#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008000 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008001#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008002 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008003#endif
8004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008005 /* IPv4 [gs]etsockopt options */
8006#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008007 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008013 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008019 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008021#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008022 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008024#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008025 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008028 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008030#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008031 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008033#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008034 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008036#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008037 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008039#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008040 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008042#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008043 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008045#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008046 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008048#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008049 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008051#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008052 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008053#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008054#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008055 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008056#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008058 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8059#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008062#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008063 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008065#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008066 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008068#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008071#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008072 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008074#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008075 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008077 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008078#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008079 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008081 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008082#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008083 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008084#endif
8085#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008087#endif
8088#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008090#endif
8091#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008093#endif
8094#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008096#endif
8097#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008099#endif
8100#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008102#endif
8103#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008105#endif
8106#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008108#endif
8109#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008111#endif
8112#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008114#endif
8115#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008117#endif
8118#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008120#endif
8121#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008123#endif
8124#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008126#endif
8127#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008129#endif
8130#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008132#endif
8133#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008135#endif
8136#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008138#endif
8139#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008141#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008143 /* TCP options */
8144#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008147#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008150#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008151 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008153#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008154 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008156#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008157 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008159#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008160 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008162#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008163 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008165#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008166 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008168#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008169 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008171#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008172 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008174#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008175 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008177#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008178 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008179#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008180#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008181 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008182#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008183#ifdef TCP_CONGESTION
8184 PyModule_AddIntMacro(m, TCP_CONGESTION);
8185#endif
8186#ifdef TCP_USER_TIMEOUT
8187 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8188#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008189#ifdef TCP_NOTSENT_LOWAT
8190 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8191#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008193 /* IPX options */
8194#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008195 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008196#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008197
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008198/* Reliable Datagram Sockets */
8199#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008200 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008201#endif
8202#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008203 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008204#endif
8205#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008206 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008207#endif
8208#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008209 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008210#endif
8211#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008212 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008213#endif
8214#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008215 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008216#endif
8217#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008218 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008219#endif
8220#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008221 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008222#endif
8223#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008224 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008225#endif
8226#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008227 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008228#endif
8229#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008230 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008231#endif
8232#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008233 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008234#endif
8235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008236 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008237#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008238 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008239#endif
8240#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008241 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008242#endif
8243#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008244 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008245#endif
8246#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008248#endif
8249#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008250 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008251#endif
8252#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008253 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008254#endif
8255#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008256 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008257#endif
8258#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008259 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008260#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008261#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008263#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008264#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008265 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008266#endif
8267#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008268 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008269#endif
8270#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008271 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008272#endif
8273#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008274 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008275#endif
8276#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008277 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008278#endif
8279#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008280 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008281#endif
8282#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008283 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008284#endif
8285#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008287#endif
8288#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008289 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008290#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008291#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008292 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008293#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008294#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008295 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008296#endif
8297#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008298 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008299#endif
8300#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008301 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008302#endif
8303#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008304 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008305#endif
8306#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008307 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008308#endif
8309#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008310 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008311#endif
8312#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008313 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008314#endif
8315#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008316 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008317#endif
8318#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008319 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008320#endif
8321#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008322 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008323#endif
8324#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008325 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008326#endif
8327#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008328 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008329#endif
8330#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008331 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008332#endif
8333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008334 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008335#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008336 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008337#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008338 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008339#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008340 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008341#endif
8342#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008343 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008344#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008345 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008346#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008347 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008348#endif
8349#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008350 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008351#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008352 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008354 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008355#endif
8356
Christian Heimesfaf2f632008-01-06 16:59:19 +00008357#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008358 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008359 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8360#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008361 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008362#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008363 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008364 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8365#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008366 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008367#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008368 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008369 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008370 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008371 PyObject *tmp;
8372 tmp = PyLong_FromUnsignedLong(codes[i]);
8373 if (tmp == NULL)
8374 return NULL;
8375 PyModule_AddObject(m, names[i], tmp);
8376 }
8377 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008378 PyModule_AddIntMacro(m, RCVALL_OFF);
8379 PyModule_AddIntMacro(m, RCVALL_ON);
8380 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008381#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008382 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008383#endif
8384#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008385 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008386#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008387#endif /* _MSTCPIP_ */
8388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008389 /* Initialize gethostbyname lock */
Victor Stinner0de437d2020-05-28 17:23:39 +02008390#if defined(USE_GETHOSTBYNAME_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008391 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008392#endif
animalize19e7d482018-02-27 02:10:36 +08008393
8394#ifdef MS_WINDOWS
8395 /* remove some flags on older version Windows during run-time */
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02008396 if (remove_unusable_flags(m) < 0) {
8397 Py_DECREF(m);
8398 return NULL;
8399 }
animalize19e7d482018-02-27 02:10:36 +08008400#endif
8401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008402 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008403}