blob: db0eeaafeec27c143ce9b6182339663533c61882 [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
327static void
328remove_unusable_flags(PyObject *m)
329{
330 PyObject *dict;
331 OSVERSIONINFOEX info;
332 DWORDLONG dwlConditionMask;
333
334 dict = PyModule_GetDict(m);
335 if (dict == NULL) {
336 return;
337 }
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 {
362 if (PyDict_GetItemString(
363 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200364 win_runtime_flags[i].flag_name) != NULL)
365 {
366 if (PyDict_DelItemString(
367 dict,
368 win_runtime_flags[i].flag_name))
369 {
370 PyErr_Clear();
371 }
animalize19e7d482018-02-27 02:10:36 +0800372 }
373 }
374 }
375}
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;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000517static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518
Tim Peters643a7fc2002-02-17 04:13:21 +0000519/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000520 The sock_type variable contains pointers to various functions,
521 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000522 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000523static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000524
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000525#if defined(HAVE_POLL_H)
526#include <poll.h>
527#elif defined(HAVE_SYS_POLL_H)
528#include <sys/poll.h>
529#endif
530
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000531/* Largest value to try to store in a socklen_t (used when handling
532 ancillary data). POSIX requires socklen_t to hold at least
533 (2**31)-1 and recommends against storing larger values, but
534 socklen_t was originally int in the BSD interface, so to be on the
535 safe side we use the smaller of (2**31)-1 and INT_MAX. */
536#if INT_MAX > 0x7fffffff
537#define SOCKLEN_T_LIMIT 0x7fffffff
538#else
539#define SOCKLEN_T_LIMIT INT_MAX
540#endif
541
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200542#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000543/* Instead of select(), we'll use poll() since poll() works on any fd. */
544#define IS_SELECTABLE(s) 1
545/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000546#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200547/* If there's no timeout left, we don't have to call select, so it's a safe,
548 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100549#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000550#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000551
552static PyObject*
553select_error(void)
554{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200555 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000557}
558
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000559#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000560#ifndef WSAEAGAIN
561#define WSAEAGAIN WSAEWOULDBLOCK
562#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000563#define CHECK_ERRNO(expected) \
564 (WSAGetLastError() == WSA ## expected)
565#else
566#define CHECK_ERRNO(expected) \
567 (errno == expected)
568#endif
569
Victor Stinnerdaf45552013-08-28 00:53:59 +0200570#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200571# define GET_SOCK_ERROR WSAGetLastError()
572# define SET_SOCK_ERROR(err) WSASetLastError(err)
573# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
574# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
575#else
576# define GET_SOCK_ERROR errno
577# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
578# define SOCK_TIMEOUT_ERR EWOULDBLOCK
579# define SOCK_INPROGRESS_ERR EINPROGRESS
580#endif
581
Erik Janssens874809e2018-09-05 08:29:42 +0200582#ifdef _MSC_VER
583# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
584#else
585# define SUPPRESS_DEPRECATED_CALL
586#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200587
588#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200589/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
590static int support_wsa_no_inherit = -1;
591#endif
592
Guido van Rossum30a685f1991-06-27 15:51:29 +0000593/* Convenience function to raise an error according to errno
594 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595
Guido van Rossum73624e91994-10-10 17:59:00 +0000596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000599#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 int err_no = WSAGetLastError();
601 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
602 recognizes the error codes used by both GetLastError() and
603 WSAGetLastError */
604 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200605 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000606#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000607
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200608 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609}
610
Guido van Rossum30a685f1991-06-27 15:51:29 +0000611
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000613set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000616
617#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600618 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (v != NULL) {
623 PyErr_SetObject(socket_herror, v);
624 Py_DECREF(v);
625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628}
629
630
631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000632set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635
Martin v. Löwis272cb402002-03-01 08:31:07 +0000636#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 /* EAI_SYSTEM is not available on Windows XP. */
638 if (error == EAI_SYSTEM)
639 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000640#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000641
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000642#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000644#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 if (v != NULL) {
648 PyErr_SetObject(socket_gaierror, v);
649 Py_DECREF(v);
650 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653}
654
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000655/* Function to perform the setting of socket blocking mode
656 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657static int
658internal_setblocking(PySocketSockObject *s, int block)
659{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400660 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200661#ifdef MS_WINDOWS
662 u_long arg;
663#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100664#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100665 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100666 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000670#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100671#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200673 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400674 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100675#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200677 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400678 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100680 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 else
Victor Stinner9a954832013-12-04 00:41:24 +0100682 new_delay_flag = delay_flag | O_NONBLOCK;
683 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200684 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400685 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100686#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200688 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200689 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400690 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400692
693 result = 0;
694
695 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000697
Yury Selivanovfa22b292016-10-18 16:03:52 -0400698 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200699#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400700 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200701#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400702 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200703#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400704 }
705
706 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707}
708
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000709static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200710internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
711 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100714#ifdef HAVE_POLL
715 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200716 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100717#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200718 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200719 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100720#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000721
Victor Stinnerb7df3142015-03-27 22:59:32 +0100722 /* must be called with the GIL held */
723 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100724
Victor Stinner416f2e62015-03-31 13:56:29 +0200725 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200726 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200729 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 /* Prefer poll, if available, since you can poll() any fd
733 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000734#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100735 pollfd.fd = s->sock_fd;
736 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200737 if (connect) {
738 /* On Windows, the socket becomes writable on connection success,
739 but a connection failure is notified as an error. On POSIX, the
740 socket becomes writable on connection success or on connection
741 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200742 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200743 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000744
Victor Stinner71694d52015-03-28 01:18:54 +0100745 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200746 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200747 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000748
Artem Khramov28146202019-08-15 03:21:48 +0600749 /* On some OSes, typically BSD-based ones, the timeout parameter of the
750 poll() syscall, when negative, must be exactly INFTIM, where defined,
751 or -1. See issue 37811. */
752 if (ms < 0) {
753#ifdef INFTIM
754 ms = INFTIM;
755#else
756 ms = -1;
757#endif
758 }
759
Victor Stinner71694d52015-03-28 01:18:54 +0100760 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200761 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100762 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000763#else
Victor Stinnerced11742015-04-09 10:27:25 +0200764 if (interval >= 0) {
765 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
766 tvp = &tv;
767 }
768 else
769 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000770
Victor Stinner71694d52015-03-28 01:18:54 +0100771 FD_ZERO(&fds);
772 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200773 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (connect) {
775 /* On Windows, the socket becomes writable on connection success,
776 but a connection failure is notified as an error. On POSIX, the
777 socket becomes writable on connection success or on connection
778 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200779 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 }
Victor Stinner71694d52015-03-28 01:18:54 +0100781
782 /* See if the socket is ready */
783 Py_BEGIN_ALLOW_THREADS;
784 if (writing)
785 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200786 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100787 else
788 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200789 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100790 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000791#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 if (n < 0)
794 return -1;
795 if (n == 0)
796 return 1;
797 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000798}
799
Victor Stinner31bf2d52015-04-01 21:57:09 +0200800/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000801
Victor Stinner81c41db2015-04-02 11:50:57 +0200802 On error, raise an exception and return -1 if err is set, or fill err and
803 return -1 otherwise. If a signal was received and the signal handler raised
804 an exception, return -1, and set err to -1 if err is set.
805
806 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100807
Victor Stinner31bf2d52015-04-01 21:57:09 +0200808 If the socket has a timeout, wait until the socket is ready before calling
809 the function: wait until the socket is writable if writing is nonzero, wait
810 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100811
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 the function, except if the signal handler raised an exception (PEP 475).
814
815 When the function is retried, recompute the timeout using a monotonic clock.
816
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 sock_call_ex() must be called with the GIL held. The socket function is
818 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200819static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200820sock_call_ex(PySocketSockObject *s,
821 int writing,
822 int (*sock_func) (PySocketSockObject *s, void *data),
823 void *data,
824 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200825 int *err,
826 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827{
Victor Stinner8912d142015-04-06 23:16:34 +0200828 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200829 _PyTime_t deadline = 0;
830 int deadline_initialized = 0;
831 int res;
832
833 /* sock_call() must be called with the GIL held. */
834 assert(PyGILState_Check());
835
836 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200837 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200838 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200839 /* For connect(), poll even for blocking socket. The connection
840 runs asynchronously. */
841 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200842 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200843 _PyTime_t interval;
844
Victor Stinner81c41db2015-04-02 11:50:57 +0200845 if (deadline_initialized) {
846 /* recompute the timeout */
847 interval = deadline - _PyTime_GetMonotonicClock();
848 }
849 else {
850 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200851 deadline = _PyTime_GetMonotonicClock() + timeout;
852 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200854
Victor Stinner10550cd2015-04-03 13:22:27 +0200855 if (interval >= 0)
856 res = internal_select(s, writing, interval, connect);
857 else
858 res = 1;
859 }
860 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200861 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200862 }
863
Victor Stinner31bf2d52015-04-01 21:57:09 +0200864 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200865 if (err)
866 *err = GET_SOCK_ERROR;
867
Victor Stinner31bf2d52015-04-01 21:57:09 +0200868 if (CHECK_ERRNO(EINTR)) {
869 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 if (PyErr_CheckSignals()) {
871 if (err)
872 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200873 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200875
876 /* retry select() */
877 continue;
878 }
879
880 /* select() failed */
881 s->errorhandler();
882 return -1;
883 }
884
885 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 if (err)
887 *err = SOCK_TIMEOUT_ERR;
888 else
889 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200890 return -1;
891 }
892
893 /* the socket is ready */
894 }
895
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 /* inner loop to retry sock_func() when sock_func() is interrupted
897 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898 while (1) {
899 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200900 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200901 Py_END_ALLOW_THREADS
902
903 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200904 /* sock_func() succeeded */
905 if (err)
906 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200907 return 0;
908 }
909
Victor Stinner81c41db2015-04-02 11:50:57 +0200910 if (err)
911 *err = GET_SOCK_ERROR;
912
Victor Stinner31bf2d52015-04-01 21:57:09 +0200913 if (!CHECK_ERRNO(EINTR))
914 break;
915
Victor Stinner81c41db2015-04-02 11:50:57 +0200916 /* sock_func() was interrupted by a signal */
917 if (PyErr_CheckSignals()) {
918 if (err)
919 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200920 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200921 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200922
Victor Stinner81c41db2015-04-02 11:50:57 +0200923 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200924 }
925
926 if (s->sock_timeout > 0
927 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200928 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200929
930 For example, select() could indicate a socket is ready for
931 reading, but the data then discarded by the OS because of a
932 wrong checksum.
933
934 Loop on select() to recheck for socket readyness. */
935 continue;
936 }
937
Victor Stinner81c41db2015-04-02 11:50:57 +0200938 /* sock_func() failed */
939 if (!err)
940 s->errorhandler();
941 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000942 return -1;
943 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200944}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000945
Victor Stinner81c41db2015-04-02 11:50:57 +0200946static int
947sock_call(PySocketSockObject *s,
948 int writing,
949 int (*func) (PySocketSockObject *s, void *data),
950 void *data)
951{
Victor Stinner8912d142015-04-06 23:16:34 +0200952 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200953}
954
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000955
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000956/* Initialize a new socket object. */
957
Victor Stinner88ed6402015-04-09 10:23:12 +0200958/* Default timeout for new sockets */
959static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000960
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200961static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000962init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 s->sock_fd = fd;
966 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500969
970 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
971 on some OSes as part of socket.type. We want to reset them here,
972 to make socket.type be set to the same value on all platforms.
973 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
974 not portable.
975 */
976#ifdef SOCK_NONBLOCK
977 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
978#endif
979#ifdef SOCK_CLOEXEC
980 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
981#endif
982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000986#ifdef SOCK_NONBLOCK
987 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100988 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000989 else
990#endif
991 {
992 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200993 if (defaulttimeout >= 0) {
994 if (internal_setblocking(s, 0) == -1) {
995 return -1;
996 }
997 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000998 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200999 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001000}
1001
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003/* Create a new socket object.
1004 This just creates the object and initializes it.
1005 If the creation fails, return NULL and set an exception (implicit
1006 in NEWOBJ()). */
1007
Guido van Rossum73624e91994-10-10 17:59:00 +00001008static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001009new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 PySocketSockObject *s;
1012 s = (PySocketSockObject *)
1013 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001014 if (s == NULL)
1015 return NULL;
1016 if (init_sockobject(s, fd, family, type, proto) == -1) {
1017 Py_DECREF(s);
1018 return NULL;
1019 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021}
1022
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023
Guido van Rossum48a680c2001-03-02 06:34:14 +00001024/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001025 thread to be in gethostbyname or getaddrinfo */
Victor Stinner0de437d2020-05-28 17:23:39 +02001026#if defined(USE_GETHOSTBYNAME_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001027static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001028#endif
1029
1030
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031/* Convert a string specifying a host name or one of a few symbolic
1032 names to a numeric IP address. This usually calls gethostbyname()
1033 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001034 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035 an error occurred; then an exception is raised. */
1036
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001037static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001038setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 struct addrinfo hints, *res;
1041 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1044 if (name[0] == '\0') {
1045 int siz;
1046 memset(&hints, 0, sizeof(hints));
1047 hints.ai_family = af;
1048 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1049 hints.ai_flags = AI_PASSIVE;
1050 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 error = getaddrinfo(NULL, "0", &hints, &res);
1052 Py_END_ALLOW_THREADS
1053 /* We assume that those thread-unsafe getaddrinfo() versions
1054 *are* safe regarding their return value, ie. that a
1055 subsequent call to getaddrinfo() does not destroy the
1056 outcome of the first call. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 if (error) {
1058 set_gaierror(error);
1059 return -1;
1060 }
1061 switch (res->ai_family) {
1062 case AF_INET:
1063 siz = 4;
1064 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001065#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 case AF_INET6:
1067 siz = 16;
1068 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 default:
1071 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001072 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 "unsupported address family");
1074 return -1;
1075 }
1076 if (res->ai_next) {
1077 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 "wildcard resolved to multiple address");
1080 return -1;
1081 }
1082 if (res->ai_addrlen < addr_ret_size)
1083 addr_ret_size = res->ai_addrlen;
1084 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1085 freeaddrinfo(res);
1086 return siz;
1087 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001088 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001089 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001090 if (strcmp(name, "255.255.255.255") == 0 ||
1091 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 struct sockaddr_in *sin;
1093 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001094 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 "address family mismatched");
1096 return -1;
1097 }
1098 sin = (struct sockaddr_in *)addr_ret;
1099 memset((void *) sin, '\0', sizeof(*sin));
1100 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001101#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 sin->sin_addr.s_addr = INADDR_BROADCAST;
1105 return sizeof(sin->sin_addr);
1106 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001107
1108 /* avoid a name resolution in case of numeric address */
1109#ifdef HAVE_INET_PTON
1110 /* check for an IPv4 address */
1111 if (af == AF_UNSPEC || af == AF_INET) {
1112 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1113 memset(sin, 0, sizeof(*sin));
1114 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1115 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001116#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001117 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001118#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001119 return 4;
1120 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001122#ifdef ENABLE_IPV6
1123 /* check for an IPv6 address - if the address contains a scope ID, we
1124 * fallback to getaddrinfo(), which can handle translation from interface
1125 * name to interface index */
1126 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1127 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1128 memset(sin, 0, sizeof(*sin));
1129 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1130 sin->sin6_family = AF_INET6;
1131#ifdef HAVE_SOCKADDR_SA_LEN
1132 sin->sin6_len = sizeof(*sin);
1133#endif
1134 return 16;
1135 }
1136 }
1137#endif /* ENABLE_IPV6 */
1138#else /* HAVE_INET_PTON */
1139 /* check for an IPv4 address */
1140 if (af == AF_INET || af == AF_UNSPEC) {
1141 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1142 memset(sin, 0, sizeof(*sin));
1143 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1144 sin->sin_family = AF_INET;
1145#ifdef HAVE_SOCKADDR_SA_LEN
1146 sin->sin_len = sizeof(*sin);
1147#endif
1148 return 4;
1149 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001150 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001151#endif /* HAVE_INET_PTON */
1152
1153 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 memset(&hints, 0, sizeof(hints));
1155 hints.ai_family = af;
1156 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001158#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 if (error == EAI_NONAME && af == AF_UNSPEC) {
1160 /* On Tru64 V5.1, numeric-to-addr conversion fails
1161 if no address family is given. Assume IPv4 for now.*/
1162 hints.ai_family = AF_INET;
1163 error = getaddrinfo(name, NULL, &hints, &res);
1164 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 if (error) {
1168 set_gaierror(error);
1169 return -1;
1170 }
1171 if (res->ai_addrlen < addr_ret_size)
1172 addr_ret_size = res->ai_addrlen;
1173 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1174 freeaddrinfo(res);
1175 switch (addr_ret->sa_family) {
1176 case AF_INET:
1177 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001178#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case AF_INET6:
1180 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001183 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 return -1;
1185 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186}
1187
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188
Коренберг Марк7766b962018-02-13 00:47:42 +05001189/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001190
Guido van Rossum73624e91994-10-10 17:59:00 +00001191static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001192make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001193{
Коренберг Марк7766b962018-02-13 00:47:42 +05001194 char buf[INET_ADDRSTRLEN];
1195 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1196 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 return NULL;
1198 }
1199 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001200}
1201
Коренберг Марк7766b962018-02-13 00:47:42 +05001202#ifdef ENABLE_IPV6
1203/* Convert IPv6 sockaddr to a Python str. */
1204
1205static PyObject *
1206make_ipv6_addr(const struct sockaddr_in6 *addr)
1207{
1208 char buf[INET6_ADDRSTRLEN];
1209 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1210 PyErr_SetFromErrno(PyExc_OSError);
1211 return NULL;
1212 }
1213 return PyUnicode_FromString(buf);
1214}
1215#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001217#ifdef USE_BLUETOOTH
1218/* Convert a string representation of a Bluetooth address into a numeric
1219 address. Returns the length (6), or raises an exception and returns -1 if
1220 an error occurred. */
1221
1222static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001223setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 unsigned int b0, b1, b2, b3, b4, b5;
1226 char ch;
1227 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1230 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1231 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001232
1233#ifdef MS_WINDOWS
1234 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1235 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1236 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1237 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1238 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1239 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1240#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 bdaddr->b[0] = b0;
1242 bdaddr->b[1] = b1;
1243 bdaddr->b[2] = b2;
1244 bdaddr->b[3] = b3;
1245 bdaddr->b[4] = b4;
1246 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001247#endif
1248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 return 6;
1250 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001251 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 return -1;
1253 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001254}
1255
1256/* Create a string representation of the Bluetooth address. This is always a
1257 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1258 value (zero padded if necessary). */
1259
1260static PyObject *
1261makebdaddr(bdaddr_t *bdaddr)
1262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001264
Greg Bowser8fbece12019-08-02 16:29:52 -04001265#ifdef MS_WINDOWS
1266 int i;
1267 unsigned int octets[6];
1268
1269 for (i = 0; i < 6; ++i) {
1270 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1271 }
1272
1273 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1274 octets[5], octets[4], octets[3],
1275 octets[2], octets[1], octets[0]);
1276#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1278 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1279 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001280#endif
1281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001283}
1284#endif
1285
1286
Guido van Rossum30a685f1991-06-27 15:51:29 +00001287/* Create an object representing the given socket address,
1288 suitable for passing it back to bind(), connect() etc.
1289 The family field of the sockaddr structure is inspected
1290 to determine what kind of address it really is. */
1291
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001293static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001294makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 if (addrlen == 0) {
1297 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001298 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 case AF_INET:
1304 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001305 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1306 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 PyObject *ret = NULL;
1308 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1310 Py_DECREF(addrobj);
1311 }
1312 return ret;
1313 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001315#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 case AF_UNIX:
1317 {
1318 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001319#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001320 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1321 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1322 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 }
1324 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001325#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 {
1327 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001328 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 }
1330 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001331#endif /* AF_UNIX */
1332
Martin v. Löwis11017b12006-01-14 18:12:57 +00001333#if defined(AF_NETLINK)
1334 case AF_NETLINK:
1335 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1337 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001338 }
1339#endif /* AF_NETLINK */
1340
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001341#if defined(AF_QIPCRTR)
1342 case AF_QIPCRTR:
1343 {
1344 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1345 return Py_BuildValue("II", a->sq_node, a->sq_port);
1346 }
1347#endif /* AF_QIPCRTR */
1348
caaveryeffc12f2017-09-06 18:18:10 -04001349#if defined(AF_VSOCK)
1350 case AF_VSOCK:
1351 {
1352 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1353 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1354 }
1355#endif /* AF_VSOCK */
1356
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001357#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case AF_INET6:
1359 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001360 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1361 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 PyObject *ret = NULL;
1363 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001364 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 addrobj,
1366 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001367 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 a->sin6_scope_id);
1369 Py_DECREF(addrobj);
1370 }
1371 return ret;
1372 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001373#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001374
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001375#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 case AF_BLUETOOTH:
1377 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001378
Greg Bowser8fbece12019-08-02 16:29:52 -04001379#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 case BTPROTO_L2CAP:
1381 {
1382 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1383 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1384 PyObject *ret = NULL;
1385 if (addrobj) {
1386 ret = Py_BuildValue("Oi",
1387 addrobj,
1388 _BT_L2_MEMB(a, psm));
1389 Py_DECREF(addrobj);
1390 }
1391 return ret;
1392 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001393
Greg Bowser8fbece12019-08-02 16:29:52 -04001394#endif /* BTPROTO_L2CAP */
1395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 case BTPROTO_RFCOMM:
1397 {
1398 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1399 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1400 PyObject *ret = NULL;
1401 if (addrobj) {
1402 ret = Py_BuildValue("Oi",
1403 addrobj,
1404 _BT_RC_MEMB(a, channel));
1405 Py_DECREF(addrobj);
1406 }
1407 return ret;
1408 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001409
Greg Bowser8fbece12019-08-02 16:29:52 -04001410#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 case BTPROTO_HCI:
1412 {
1413 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001414#if defined(__NetBSD__) || defined(__DragonFly__)
1415 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001416#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 PyObject *ret = NULL;
1418 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1419 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001420#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001422
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001423#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 case BTPROTO_SCO:
1425 {
1426 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1427 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1428 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001429#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001430#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 default:
1433 PyErr_SetString(PyExc_ValueError,
1434 "Unknown Bluetooth protocol");
1435 return NULL;
1436 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001437#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001438
Antoine Pitroub156a462010-10-27 20:13:57 +00001439#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 case AF_PACKET:
1441 {
1442 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001443 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 struct ifreq ifr;
1445 /* need to look up interface name give index */
1446 if (a->sll_ifindex) {
1447 ifr.ifr_ifindex = a->sll_ifindex;
1448 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1449 ifname = ifr.ifr_name;
1450 }
1451 return Py_BuildValue("shbhy#",
1452 ifname,
1453 ntohs(a->sll_protocol),
1454 a->sll_pkttype,
1455 a->sll_hatype,
1456 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001457 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001459#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001460
Christian Heimes043d6f62008-01-07 17:19:16 +00001461#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 case AF_TIPC:
1463 {
1464 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1465 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1466 return Py_BuildValue("IIIII",
1467 a->addrtype,
1468 a->addr.nameseq.type,
1469 a->addr.nameseq.lower,
1470 a->addr.nameseq.upper,
1471 a->scope);
1472 } else if (a->addrtype == TIPC_ADDR_NAME) {
1473 return Py_BuildValue("IIIII",
1474 a->addrtype,
1475 a->addr.name.name.type,
1476 a->addr.name.name.instance,
1477 a->addr.name.name.instance,
1478 a->scope);
1479 } else if (a->addrtype == TIPC_ADDR_ID) {
1480 return Py_BuildValue("IIIII",
1481 a->addrtype,
1482 a->addr.id.node,
1483 a->addr.id.ref,
1484 0,
1485 a->scope);
1486 } else {
1487 PyErr_SetString(PyExc_ValueError,
1488 "Invalid address type");
1489 return NULL;
1490 }
1491 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001492#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001493
Serhiy Storchakad3187152017-11-09 18:00:38 +02001494#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001495 case AF_CAN:
1496 {
1497 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001498 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001499 struct ifreq ifr;
1500 /* need to look up interface name given index */
1501 if (a->can_ifindex) {
1502 ifr.ifr_ifindex = a->can_ifindex;
1503 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1504 ifname = ifr.ifr_name;
1505 }
1506
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001507 switch (proto) {
1508#ifdef CAN_ISOTP
1509 case CAN_ISOTP:
1510 {
1511 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1512 ifname,
1513 a->can_addr.tp.rx_id,
1514 a->can_addr.tp.tx_id);
1515 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001516#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07001517#ifdef CAN_J1939
1518 case CAN_J1939:
1519 {
1520 return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1521 ifname,
1522 a->can_addr.j1939.name,
1523 a->can_addr.j1939.pgn,
1524 a->can_addr.j1939.addr);
1525 }
1526#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001527 default:
1528 {
bggardner954900a2019-09-12 06:02:48 -04001529 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001530 ifname);
1531 }
1532 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001533 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001534#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001535
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001536#ifdef PF_SYSTEM
1537 case PF_SYSTEM:
1538 switch(proto) {
1539#ifdef SYSPROTO_CONTROL
1540 case SYSPROTO_CONTROL:
1541 {
1542 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1543 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1544 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001545#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001546 default:
1547 PyErr_SetString(PyExc_ValueError,
1548 "Invalid address type");
1549 return 0;
1550 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001551#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001552
Christian Heimesdffa3942016-09-05 23:54:41 +02001553#ifdef HAVE_SOCKADDR_ALG
1554 case AF_ALG:
1555 {
1556 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1557 return Py_BuildValue("s#s#HH",
1558 a->salg_type,
1559 strnlen((const char*)a->salg_type,
1560 sizeof(a->salg_type)),
1561 a->salg_name,
1562 strnlen((const char*)a->salg_name,
1563 sizeof(a->salg_name)),
1564 a->salg_feat,
1565 a->salg_mask);
1566 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001567#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 default:
1572 /* If we don't know the address family, don't raise an
1573 exception -- return it as an (int, bytes) tuple. */
1574 return Py_BuildValue("iy#",
1575 addr->sa_family,
1576 addr->sa_data,
1577 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580}
1581
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001582/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1583 (in particular, numeric IP addresses). */
1584struct maybe_idna {
1585 PyObject *obj;
1586 char *buf;
1587};
1588
1589static void
1590idna_cleanup(struct maybe_idna *data)
1591{
1592 Py_CLEAR(data->obj);
1593}
1594
1595static int
1596idna_converter(PyObject *obj, struct maybe_idna *data)
1597{
1598 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001599 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001600 if (obj == NULL) {
1601 idna_cleanup(data);
1602 return 1;
1603 }
1604 data->obj = NULL;
1605 len = -1;
1606 if (PyBytes_Check(obj)) {
1607 data->buf = PyBytes_AsString(obj);
1608 len = PyBytes_Size(obj);
1609 }
1610 else if (PyByteArray_Check(obj)) {
1611 data->buf = PyByteArray_AsString(obj);
1612 len = PyByteArray_Size(obj);
1613 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001614 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001615 if (PyUnicode_READY(obj) == -1) {
1616 return 0;
1617 }
1618 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001619 data->buf = PyUnicode_DATA(obj);
1620 len = PyUnicode_GET_LENGTH(obj);
1621 }
1622 else {
1623 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1624 if (!obj2) {
1625 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1626 return 0;
1627 }
1628 assert(PyBytes_Check(obj2));
1629 data->obj = obj2;
1630 data->buf = PyBytes_AS_STRING(obj2);
1631 len = PyBytes_GET_SIZE(obj2);
1632 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001633 }
1634 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001635 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001636 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001637 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 }
1639 if (strlen(data->buf) != len) {
1640 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001641 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001642 return 0;
1643 }
1644 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001645}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646
1647/* Parse a socket address argument according to the socket object's
1648 address family. Return 1 if the address was in the proper format,
1649 0 of not. The address is returned through addr_ret, its length
1650 through len_ret. */
1651
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001652static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001653getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001654 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001658#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 case AF_UNIX:
1660 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001661 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001662 int retval = 0;
1663
1664 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1665 allow embedded nulls on Linux. */
1666 if (PyUnicode_Check(args)) {
1667 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1668 return 0;
1669 }
1670 else
1671 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001672 if (!PyArg_Parse(args, "y*", &path)) {
1673 Py_DECREF(args);
1674 return retval;
1675 }
1676 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001677
Victor Stinnerd565fb92019-10-10 21:30:20 +02001678 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001679#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001680 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001682 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001683 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001685 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 }
1687 }
1688 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001689#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 {
1691 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001692 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001693 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001695 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001697 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 }
1699 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001700 memcpy(addr->sun_path, path.buf, path.len);
1701 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001702 retval = 1;
1703 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001704 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001705 Py_DECREF(args);
1706 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001708#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001709
Martin v. Löwis11017b12006-01-14 18:12:57 +00001710#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 case AF_NETLINK:
1712 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001714 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 if (!PyTuple_Check(args)) {
1716 PyErr_Format(
1717 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001718 "%s(): AF_NETLINK address must be tuple, not %.500s",
1719 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 return 0;
1721 }
Oren Milman735171e2018-09-11 19:51:29 +03001722 if (!PyArg_ParseTuple(args,
1723 "II;AF_NETLINK address must be a pair "
1724 "(pid, groups)",
1725 &pid, &groups))
1726 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 addr->nl_family = AF_NETLINK;
1730 addr->nl_pid = pid;
1731 addr->nl_groups = groups;
1732 *len_ret = sizeof(*addr);
1733 return 1;
1734 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001735#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001736
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001737#if defined(AF_QIPCRTR)
1738 case AF_QIPCRTR:
1739 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001740 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001741 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001742 if (!PyTuple_Check(args)) {
1743 PyErr_Format(
1744 PyExc_TypeError,
1745 "getsockaddrarg: "
1746 "AF_QIPCRTR address must be tuple, not %.500s",
1747 Py_TYPE(args)->tp_name);
1748 return 0;
1749 }
1750 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1751 return 0;
1752 addr->sq_family = AF_QIPCRTR;
1753 addr->sq_node = node;
1754 addr->sq_port = port;
1755 *len_ret = sizeof(*addr);
1756 return 1;
1757 }
1758#endif /* AF_QIPCRTR */
1759
caaveryeffc12f2017-09-06 18:18:10 -04001760#if defined(AF_VSOCK)
1761 case AF_VSOCK:
1762 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001763 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001764 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001765 memset(addr, 0, sizeof(struct sockaddr_vm));
1766 if (!PyTuple_Check(args)) {
1767 PyErr_Format(
1768 PyExc_TypeError,
1769 "getsockaddrarg: "
1770 "AF_VSOCK address must be tuple, not %.500s",
1771 Py_TYPE(args)->tp_name);
1772 return 0;
1773 }
1774 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1775 return 0;
1776 addr->svm_family = s->sock_family;
1777 addr->svm_port = port;
1778 addr->svm_cid = cid;
1779 *len_ret = sizeof(*addr);
1780 return 1;
1781 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001782#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001783
1784
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001785#ifdef AF_RDS
1786 case AF_RDS:
1787 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001788#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 case AF_INET:
1791 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001792 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 int port, result;
1794 if (!PyTuple_Check(args)) {
1795 PyErr_Format(
1796 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001797 "%s(): AF_INET address must be tuple, not %.500s",
1798 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 return 0;
1800 }
Oren Milman735171e2018-09-11 19:51:29 +03001801 if (!PyArg_ParseTuple(args,
1802 "O&i;AF_INET address must be a pair "
1803 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001804 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001805 {
1806 assert(PyErr_Occurred());
1807 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1808 PyErr_Format(PyExc_OverflowError,
1809 "%s(): port must be 0-65535.", caller);
1810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001812 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001813 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001814 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001816 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 if (result < 0)
1818 return 0;
1819 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001820 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001822 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 return 0;
1824 }
1825 addr->sin_family = AF_INET;
1826 addr->sin_port = htons((short)port);
1827 *len_ret = sizeof *addr;
1828 return 1;
1829 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001830
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001831#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 case AF_INET6:
1833 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001834 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001835 int port, result;
1836 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 flowinfo = scope_id = 0;
1838 if (!PyTuple_Check(args)) {
1839 PyErr_Format(
1840 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001841 "%s(): AF_INET6 address must be tuple, not %.500s",
1842 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 return 0;
1844 }
Oren Milman735171e2018-09-11 19:51:29 +03001845 if (!PyArg_ParseTuple(args,
1846 "O&i|II;AF_INET6 address must be a tuple "
1847 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001848 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001849 &scope_id))
1850 {
1851 assert(PyErr_Occurred());
1852 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1853 PyErr_Format(PyExc_OverflowError,
1854 "%s(): port must be 0-65535.", caller);
1855 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 return 0;
1857 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001858 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001859 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001861 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 if (result < 0)
1863 return 0;
1864 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001865 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001867 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return 0;
1869 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001870 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001871 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001872 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001873 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001874 return 0;
1875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 addr->sin6_family = s->sock_family;
1877 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001878 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 addr->sin6_scope_id = scope_id;
1880 *len_ret = sizeof *addr;
1881 return 1;
1882 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001883#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001884
Hye-Shik Chang81268602004-02-02 06:05:24 +00001885#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 case AF_BLUETOOTH:
1887 {
1888 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001889#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 case BTPROTO_L2CAP:
1891 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001892 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001893
Victor Stinnerd565fb92019-10-10 21:30:20 +02001894 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 memset(addr, 0, sizeof(struct sockaddr_l2));
1896 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1897 if (!PyArg_ParseTuple(args, "si", &straddr,
1898 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001899 PyErr_Format(PyExc_OSError,
1900 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 return 0;
1902 }
1903 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1904 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 *len_ret = sizeof *addr;
1907 return 1;
1908 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001909#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 case BTPROTO_RFCOMM:
1911 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001912 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001913 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1915 if (!PyArg_ParseTuple(args, "si", &straddr,
1916 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001917 PyErr_Format(PyExc_OSError,
1918 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 return 0;
1920 }
1921 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1922 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 *len_ret = sizeof *addr;
1925 return 1;
1926 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001927#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 case BTPROTO_HCI:
1929 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001930 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001931#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001932 const char *straddr;
1933 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1934 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001935 PyErr_Format(PyExc_OSError, "%s: "
1936 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001937 return 0;
1938 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001939 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001940 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1941 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001942#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1944 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001945 PyErr_Format(PyExc_OSError,
1946 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 return 0;
1948 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001949#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 *len_ret = sizeof *addr;
1951 return 1;
1952 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001953#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 case BTPROTO_SCO:
1955 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001956 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001957
Victor Stinnerd565fb92019-10-10 21:30:20 +02001958 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1960 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001961 PyErr_Format(PyExc_OSError,
1962 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 return 0;
1964 }
1965 straddr = PyBytes_AS_STRING(args);
1966 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1967 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 *len_ret = sizeof *addr;
1970 return 1;
1971 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001972#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001973#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 default:
Oren Milman735171e2018-09-11 19:51:29 +03001975 PyErr_Format(PyExc_OSError,
1976 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 return 0;
1978 }
1979 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001980#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001981
Antoine Pitroub156a462010-10-27 20:13:57 +00001982#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 case AF_PACKET:
1984 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001986 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 int protoNumber;
1988 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001989 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001990 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 if (!PyTuple_Check(args)) {
1993 PyErr_Format(
1994 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001995 "%s(): AF_PACKET address must be tuple, not %.500s",
1996 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 return 0;
1998 }
Oren Milman735171e2018-09-11 19:51:29 +03001999 /* XXX: improve the default error message according to the
2000 documentation of AF_PACKET, which would be added as part
2001 of bpo-25041. */
2002 if (!PyArg_ParseTuple(args,
2003 "si|iiy*;AF_PACKET address must be a tuple of "
2004 "two to five elements",
2005 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002006 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002007 {
2008 assert(PyErr_Occurred());
2009 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2010 PyErr_Format(PyExc_OverflowError,
2011 "%s(): address argument out of range", caller);
2012 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002014 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2016 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2017 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2018 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002019 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 return 0;
2021 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002022 if (haddr.buf && haddr.len > 8) {
2023 PyErr_SetString(PyExc_ValueError,
2024 "Hardware address must be 8 bytes or less");
2025 PyBuffer_Release(&haddr);
2026 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 }
2028 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002029 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002031 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002032 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 return 0;
2034 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002035 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 addr->sll_family = AF_PACKET;
2037 addr->sll_protocol = htons((short)protoNumber);
2038 addr->sll_ifindex = ifr.ifr_ifindex;
2039 addr->sll_pkttype = pkttype;
2040 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002041 if (haddr.buf) {
2042 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2043 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002045 else
2046 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002048 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 return 1;
2050 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002051#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002052
Christian Heimes043d6f62008-01-07 17:19:16 +00002053#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 case AF_TIPC:
2055 {
2056 unsigned int atype, v1, v2, v3;
2057 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 if (!PyTuple_Check(args)) {
2060 PyErr_Format(
2061 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002062 "%s(): AF_TIPC address must be tuple, not %.500s",
2063 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 return 0;
2065 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002068 "IIII|I;AF_TIPC address must be a tuple "
2069 "(addr_type, v1, v2, v3[, scope])",
2070 &atype, &v1, &v2, &v3, &scope))
2071 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002073 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002074
Victor Stinnerd565fb92019-10-10 21:30:20 +02002075 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 addr->family = AF_TIPC;
2079 addr->scope = scope;
2080 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 if (atype == TIPC_ADDR_NAMESEQ) {
2083 addr->addr.nameseq.type = v1;
2084 addr->addr.nameseq.lower = v2;
2085 addr->addr.nameseq.upper = v3;
2086 } else if (atype == TIPC_ADDR_NAME) {
2087 addr->addr.name.name.type = v1;
2088 addr->addr.name.name.instance = v2;
2089 } else if (atype == TIPC_ADDR_ID) {
2090 addr->addr.id.node = v1;
2091 addr->addr.id.ref = v2;
2092 } else {
2093 /* Shouldn't happen */
2094 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2095 return 0;
2096 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 return 1;
2101 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002102#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002103
Serhiy Storchakad3187152017-11-09 18:00:38 +02002104#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002105 case AF_CAN:
2106 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002107#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002108 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002109 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002110#endif
2111#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002112 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002113#endif
2114#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002115 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002116 PyObject *interfaceName;
2117 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002118 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002119 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002120
Oren Milman735171e2018-09-11 19:51:29 +03002121 if (!PyTuple_Check(args)) {
2122 PyErr_Format(PyExc_TypeError,
2123 "%s(): AF_CAN address must be tuple, not %.500s",
2124 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002125 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002126 }
2127 if (!PyArg_ParseTuple(args,
2128 "O&;AF_CAN address must be a tuple "
2129 "(interface, )",
2130 PyUnicode_FSConverter, &interfaceName))
2131 {
2132 return 0;
2133 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002134
2135 len = PyBytes_GET_SIZE(interfaceName);
2136
2137 if (len == 0) {
2138 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002139 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002140 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2141 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002142 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2143 s->errorhandler();
2144 Py_DECREF(interfaceName);
2145 return 0;
2146 }
2147 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002148 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002149 "AF_CAN interface name too long");
2150 Py_DECREF(interfaceName);
2151 return 0;
2152 }
2153
2154 addr->can_family = AF_CAN;
2155 addr->can_ifindex = ifr.ifr_ifindex;
2156
2157 *len_ret = sizeof(*addr);
2158 Py_DECREF(interfaceName);
2159 return 1;
2160 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002161#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002162
2163#ifdef CAN_ISOTP
2164 case CAN_ISOTP:
2165 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002166 PyObject *interfaceName;
2167 struct ifreq ifr;
2168 Py_ssize_t len;
2169 unsigned long int rx_id, tx_id;
2170
Victor Stinnerd565fb92019-10-10 21:30:20 +02002171 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002172
2173 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2174 &interfaceName,
2175 &rx_id,
2176 &tx_id))
2177 return 0;
2178
2179 len = PyBytes_GET_SIZE(interfaceName);
2180
2181 if (len == 0) {
2182 ifr.ifr_ifindex = 0;
2183 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2184 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2185 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2186 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2187 s->errorhandler();
2188 Py_DECREF(interfaceName);
2189 return 0;
2190 }
2191 } else {
2192 PyErr_SetString(PyExc_OSError,
2193 "AF_CAN interface name too long");
2194 Py_DECREF(interfaceName);
2195 return 0;
2196 }
2197
2198 addr->can_family = AF_CAN;
2199 addr->can_ifindex = ifr.ifr_ifindex;
2200 addr->can_addr.tp.rx_id = rx_id;
2201 addr->can_addr.tp.tx_id = tx_id;
2202
2203 *len_ret = sizeof(*addr);
2204 Py_DECREF(interfaceName);
2205 return 1;
2206 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002207#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002208#ifdef CAN_J1939
2209 case CAN_J1939:
2210 {
2211 PyObject *interfaceName;
2212 struct ifreq ifr;
2213 Py_ssize_t len;
2214 uint64_t j1939_name;
2215 uint32_t j1939_pgn;
2216 uint8_t j1939_addr;
2217
2218 struct sockaddr_can *addr = &addrbuf->can;
2219
2220 if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2221 &interfaceName,
2222 &j1939_name,
2223 &j1939_pgn,
2224 &j1939_addr))
2225 return 0;
2226
2227 len = PyBytes_GET_SIZE(interfaceName);
2228
2229 if (len == 0) {
2230 ifr.ifr_ifindex = 0;
2231 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2232 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2233 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2234 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2235 s->errorhandler();
2236 Py_DECREF(interfaceName);
2237 return 0;
2238 }
2239 } else {
2240 PyErr_SetString(PyExc_OSError,
2241 "AF_CAN interface name too long");
2242 Py_DECREF(interfaceName);
2243 return 0;
2244 }
2245
2246 addr->can_family = AF_CAN;
2247 addr->can_ifindex = ifr.ifr_ifindex;
2248 addr->can_addr.j1939.name = j1939_name;
2249 addr->can_addr.j1939.pgn = j1939_pgn;
2250 addr->can_addr.j1939.addr = j1939_addr;
2251
2252 *len_ret = sizeof(*addr);
2253 Py_DECREF(interfaceName);
2254 return 1;
2255 }
2256#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002257 default:
Oren Milman735171e2018-09-11 19:51:29 +03002258 PyErr_Format(PyExc_OSError,
2259 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002260 return 0;
2261 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002262#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002263
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002264#ifdef PF_SYSTEM
2265 case PF_SYSTEM:
2266 switch (s->sock_proto) {
2267#ifdef SYSPROTO_CONTROL
2268 case SYSPROTO_CONTROL:
2269 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002270 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002271 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002272 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002273
2274 if (PyUnicode_Check(args)) {
2275 struct ctl_info info;
2276 PyObject *ctl_name;
2277
2278 if (!PyArg_Parse(args, "O&",
2279 PyUnicode_FSConverter, &ctl_name)) {
2280 return 0;
2281 }
2282
Victor Stinnerf50e1872015-03-20 11:32:24 +01002283 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002284 PyErr_SetString(PyExc_ValueError,
2285 "provided string is too long");
2286 Py_DECREF(ctl_name);
2287 return 0;
2288 }
2289 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2290 sizeof(info.ctl_name));
2291 Py_DECREF(ctl_name);
2292
2293 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2294 PyErr_SetString(PyExc_OSError,
2295 "cannot find kernel control with provided name");
2296 return 0;
2297 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002298
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002299 addr->sc_id = info.ctl_id;
2300 addr->sc_unit = 0;
2301 } else if (!PyArg_ParseTuple(args, "II",
2302 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002303 PyErr_Format(PyExc_TypeError,
2304 "%s(): PF_SYSTEM address must be a str or "
2305 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002306 return 0;
2307 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002308
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002309 *len_ret = sizeof(*addr);
2310 return 1;
2311 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002312#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002313 default:
Oren Milman735171e2018-09-11 19:51:29 +03002314 PyErr_Format(PyExc_OSError,
2315 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002316 return 0;
2317 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002318#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002319#ifdef HAVE_SOCKADDR_ALG
2320 case AF_ALG:
2321 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002322 const char *type;
2323 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002324 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002325
2326 memset(sa, 0, sizeof(*sa));
2327 sa->salg_family = AF_ALG;
2328
Oren Milman735171e2018-09-11 19:51:29 +03002329 if (!PyTuple_Check(args)) {
2330 PyErr_Format(PyExc_TypeError,
2331 "%s(): AF_ALG address must be tuple, not %.500s",
2332 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002333 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002334 }
2335 if (!PyArg_ParseTuple(args,
2336 "ss|HH;AF_ALG address must be a tuple "
2337 "(type, name[, feat[, mask]])",
2338 &type, &name, &sa->salg_feat, &sa->salg_mask))
2339 {
2340 return 0;
2341 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002342 /* sockaddr_alg has fixed-sized char arrays for type, and name
2343 * both must be NULL terminated.
2344 */
2345 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002346 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2347 return 0;
2348 }
2349 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002350 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002351 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2352 return 0;
2353 }
2354 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2355
2356 *len_ret = sizeof(*sa);
2357 return 1;
2358 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002359#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 default:
Oren Milman735171e2018-09-11 19:51:29 +03002364 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002368}
2369
Guido van Rossum30a685f1991-06-27 15:51:29 +00002370
Guido van Rossum48a680c2001-03-02 06:34:14 +00002371/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002372 Return 1 if the family is known, 0 otherwise. The length is returned
2373 through len_ret. */
2374
2375static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002376getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002379
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002380#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 case AF_UNIX:
2382 {
2383 *len_ret = sizeof (struct sockaddr_un);
2384 return 1;
2385 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002386#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002387
Martin v. Löwis11017b12006-01-14 18:12:57 +00002388#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002389 case AF_NETLINK:
2390 {
2391 *len_ret = sizeof (struct sockaddr_nl);
2392 return 1;
2393 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002394#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002395
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002396#if defined(AF_QIPCRTR)
2397 case AF_QIPCRTR:
2398 {
2399 *len_ret = sizeof (struct sockaddr_qrtr);
2400 return 1;
2401 }
2402#endif /* AF_QIPCRTR */
2403
caaveryeffc12f2017-09-06 18:18:10 -04002404#if defined(AF_VSOCK)
2405 case AF_VSOCK:
2406 {
2407 *len_ret = sizeof (struct sockaddr_vm);
2408 return 1;
2409 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002410#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002411
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002412#ifdef AF_RDS
2413 case AF_RDS:
2414 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002415#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 case AF_INET:
2418 {
2419 *len_ret = sizeof (struct sockaddr_in);
2420 return 1;
2421 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002422
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002423#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 case AF_INET6:
2425 {
2426 *len_ret = sizeof (struct sockaddr_in6);
2427 return 1;
2428 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002429#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430
Hye-Shik Chang81268602004-02-02 06:05:24 +00002431#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 case AF_BLUETOOTH:
2433 {
2434 switch(s->sock_proto)
2435 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002436
Greg Bowser8fbece12019-08-02 16:29:52 -04002437#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 case BTPROTO_L2CAP:
2439 *len_ret = sizeof (struct sockaddr_l2);
2440 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002441#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 case BTPROTO_RFCOMM:
2443 *len_ret = sizeof (struct sockaddr_rc);
2444 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002445#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 case BTPROTO_HCI:
2447 *len_ret = sizeof (struct sockaddr_hci);
2448 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002449#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 case BTPROTO_SCO:
2451 *len_ret = sizeof (struct sockaddr_sco);
2452 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002453#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002454#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002456 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 "unknown BT protocol");
2458 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 }
2461 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002462#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002463
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002464#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 case AF_PACKET:
2466 {
2467 *len_ret = sizeof (struct sockaddr_ll);
2468 return 1;
2469 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002470#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002471
Christian Heimes043d6f62008-01-07 17:19:16 +00002472#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 case AF_TIPC:
2474 {
2475 *len_ret = sizeof (struct sockaddr_tipc);
2476 return 1;
2477 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002478#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002479
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002480#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002481 case AF_CAN:
2482 {
2483 *len_ret = sizeof (struct sockaddr_can);
2484 return 1;
2485 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002486#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002487
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002488#ifdef PF_SYSTEM
2489 case PF_SYSTEM:
2490 switch(s->sock_proto) {
2491#ifdef SYSPROTO_CONTROL
2492 case SYSPROTO_CONTROL:
2493 *len_ret = sizeof (struct sockaddr_ctl);
2494 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002495#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002496 default:
2497 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2498 "unknown PF_SYSTEM protocol");
2499 return 0;
2500 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002501#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002502#ifdef HAVE_SOCKADDR_ALG
2503 case AF_ALG:
2504 {
2505 *len_ret = sizeof (struct sockaddr_alg);
2506 return 1;
2507 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002508#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002513 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002517}
2518
2519
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002520/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2521 Currently, these methods are only compiled if the RFC 2292/3542
2522 CMSG_LEN() macro is available. Older systems seem to have used
2523 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2524 it may be possible to define CMSG_LEN() that way if it's not
2525 provided. Some architectures might need extra padding after the
2526 cmsghdr, however, and CMSG_LEN() would have to take account of
2527 this. */
2528#ifdef CMSG_LEN
2529/* If length is in range, set *result to CMSG_LEN(length) and return
2530 true; otherwise, return false. */
2531static int
2532get_CMSG_LEN(size_t length, size_t *result)
2533{
2534 size_t tmp;
2535
2536 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2537 return 0;
2538 tmp = CMSG_LEN(length);
2539 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2540 return 0;
2541 *result = tmp;
2542 return 1;
2543}
2544
2545#ifdef CMSG_SPACE
2546/* If length is in range, set *result to CMSG_SPACE(length) and return
2547 true; otherwise, return false. */
2548static int
2549get_CMSG_SPACE(size_t length, size_t *result)
2550{
2551 size_t tmp;
2552
2553 /* Use CMSG_SPACE(1) here in order to take account of the padding
2554 necessary before *and* after the data. */
2555 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2556 return 0;
2557 tmp = CMSG_SPACE(length);
2558 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2559 return 0;
2560 *result = tmp;
2561 return 1;
2562}
2563#endif
2564
2565/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2566 pointer in msg->msg_control with at least "space" bytes after it,
2567 and its cmsg_len member inside the buffer. */
2568static int
2569cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2570{
2571 size_t cmsg_offset;
2572 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2573 sizeof(cmsgh->cmsg_len));
2574
Charles-François Natali466517d2011-08-28 18:23:43 +02002575 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002576 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002577 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002578 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2579 annoying under OS X as it's unsigned there and so it triggers a
2580 tautological comparison warning under Clang when compared against 0.
2581 Since the check is valid on other platforms, silence the warning under
2582 Clang. */
2583 #ifdef __clang__
2584 #pragma clang diagnostic push
2585 #pragma clang diagnostic ignored "-Wtautological-compare"
2586 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002587 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002588 #pragma GCC diagnostic push
2589 #pragma GCC diagnostic ignored "-Wtype-limits"
2590 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002591 if (msg->msg_controllen < 0)
2592 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002593 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002594 #pragma GCC diagnostic pop
2595 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002596 #ifdef __clang__
2597 #pragma clang diagnostic pop
2598 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002599 if (space < cmsg_len_end)
2600 space = cmsg_len_end;
2601 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2602 return (cmsg_offset <= (size_t)-1 - space &&
2603 cmsg_offset + space <= msg->msg_controllen);
2604}
2605
2606/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2607 *space to number of bytes following it in the buffer and return
2608 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2609 msg->msg_controllen are valid. */
2610static int
2611get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2612{
2613 size_t data_offset;
2614 char *data_ptr;
2615
2616 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2617 return 0;
2618 data_offset = data_ptr - (char *)msg->msg_control;
2619 if (data_offset > msg->msg_controllen)
2620 return 0;
2621 *space = msg->msg_controllen - data_offset;
2622 return 1;
2623}
2624
2625/* If cmsgh is invalid or not contained in the buffer pointed to by
2626 msg->msg_control, return -1. If cmsgh is valid and its associated
2627 data is entirely contained in the buffer, set *data_len to the
2628 length of the associated data and return 0. If only part of the
2629 associated data is contained in the buffer but cmsgh is otherwise
2630 valid, set *data_len to the length contained in the buffer and
2631 return 1. */
2632static int
2633get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2634{
2635 size_t space, cmsg_data_len;
2636
2637 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2638 cmsgh->cmsg_len < CMSG_LEN(0))
2639 return -1;
2640 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2641 if (!get_cmsg_data_space(msg, cmsgh, &space))
2642 return -1;
2643 if (space >= cmsg_data_len) {
2644 *data_len = cmsg_data_len;
2645 return 0;
2646 }
2647 *data_len = space;
2648 return 1;
2649}
2650#endif /* CMSG_LEN */
2651
2652
Victor Stinner31bf2d52015-04-01 21:57:09 +02002653struct sock_accept {
2654 socklen_t *addrlen;
2655 sock_addr_t *addrbuf;
2656 SOCKET_T result;
2657};
2658
2659#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2660/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2661static int accept4_works = -1;
2662#endif
2663
2664static int
2665sock_accept_impl(PySocketSockObject *s, void *data)
2666{
2667 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002668 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2669 socklen_t *paddrlen = ctx->addrlen;
2670#ifdef HAVE_SOCKADDR_ALG
2671 /* AF_ALG does not support accept() with addr and raises
2672 * ECONNABORTED instead. */
2673 if (s->sock_family == AF_ALG) {
2674 addr = NULL;
2675 paddrlen = NULL;
2676 *ctx->addrlen = 0;
2677 }
2678#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002679
2680#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2681 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002682 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002683 SOCK_CLOEXEC);
2684 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2685 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2686 accept4_works = (errno != ENOSYS);
2687 }
2688 }
2689 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002690 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002691#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002692 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002693#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002694
2695#ifdef MS_WINDOWS
2696 return (ctx->result != INVALID_SOCKET);
2697#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002698 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002699#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002700}
2701
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002702/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002703
Guido van Rossum73624e91994-10-10 17:59:00 +00002704static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302705sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002708 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 socklen_t addrlen;
2710 PyObject *sock = NULL;
2711 PyObject *addr = NULL;
2712 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002713 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if (!getsockaddrlen(s, &addrlen))
2716 return NULL;
2717 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 if (!IS_SELECTABLE(s))
2720 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002721
Victor Stinner31bf2d52015-04-01 21:57:09 +02002722 ctx.addrlen = &addrlen;
2723 ctx.addrbuf = &addrbuf;
2724 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002726 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002727
Victor Stinnerdaf45552013-08-28 00:53:59 +02002728#ifdef MS_WINDOWS
2729 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2730 PyErr_SetFromWindowsErr(0);
2731 SOCKETCLOSE(newfd);
2732 goto finally;
2733 }
2734#else
2735
2736#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2737 if (!accept4_works)
2738#endif
2739 {
2740 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2741 SOCKETCLOSE(newfd);
2742 goto finally;
2743 }
2744 }
2745#endif
2746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 sock = PyLong_FromSocket_t(newfd);
2748 if (sock == NULL) {
2749 SOCKETCLOSE(newfd);
2750 goto finally;
2751 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2754 addrlen, s->sock_proto);
2755 if (addr == NULL)
2756 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002759
Guido van Rossum67f7a382002-06-06 21:08:16 +00002760finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 Py_XDECREF(sock);
2762 Py_XDECREF(addr);
2763 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002764}
2765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002766PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002767"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002769Wait for an incoming connection. Return a new socket file descriptor\n\
2770representing the connection, and the address of the client.\n\
2771For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002772
Guido van Rossum11ba0942002-06-13 15:07:44 +00002773/* s.setblocking(flag) method. Argument:
2774 False -- non-blocking mode; same as settimeout(0)
2775 True -- blocking mode; same as settimeout(None)
2776*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002777
Guido van Rossum73624e91994-10-10 17:59:00 +00002778static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002779sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002780{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002781 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 block = PyLong_AsLong(arg);
2784 if (block == -1 && PyErr_Occurred())
2785 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002786
Victor Stinner9001d802015-04-06 23:06:01 +02002787 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002788 if (internal_setblocking(s, block) == -1) {
2789 return NULL;
2790 }
2791 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002792}
Guido van Rossume4485b01994-09-07 14:32:49 +00002793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002795"setblocking(flag)\n\
2796\n\
2797Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002798setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002800
Yury Selivanovf11b4602018-01-28 17:27:38 -05002801/* s.getblocking() method.
2802 Returns True if socket is in blocking mode,
2803 False if it is in non-blocking mode.
2804*/
2805static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302806sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002807{
2808 if (s->sock_timeout) {
2809 Py_RETURN_TRUE;
2810 }
2811 else {
2812 Py_RETURN_FALSE;
2813 }
2814}
2815
2816PyDoc_STRVAR(getblocking_doc,
2817"getblocking()\n\
2818\n\
2819Returns True if socket is in blocking mode, or False if it\n\
2820is in non-blocking mode.");
2821
Victor Stinner71694d52015-03-28 01:18:54 +01002822static int
2823socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2824{
2825#ifdef MS_WINDOWS
2826 struct timeval tv;
2827#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002828#ifndef HAVE_POLL
2829 _PyTime_t ms;
2830#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002831 int overflow = 0;
2832
2833 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002834 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002835 return 0;
2836 }
2837
Victor Stinner869e1772015-03-30 03:49:14 +02002838 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002839 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002840 return -1;
2841
2842 if (*timeout < 0) {
2843 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2844 return -1;
2845 }
2846
2847#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002848 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002849#endif
2850#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002851 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002852 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002853#endif
2854 if (overflow) {
2855 PyErr_SetString(PyExc_OverflowError,
2856 "timeout doesn't fit into C timeval");
2857 return -1;
2858 }
2859
2860 return 0;
2861}
2862
Guido van Rossum11ba0942002-06-13 15:07:44 +00002863/* s.settimeout(timeout) method. Argument:
2864 None -- no timeout, blocking mode; same as setblocking(True)
2865 0.0 -- non-blocking mode; same as setblocking(False)
2866 > 0 -- timeout mode; operations time out after timeout seconds
2867 < 0 -- illegal; raises an exception
2868*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002870sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002871{
Victor Stinner71694d52015-03-28 01:18:54 +01002872 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002873
Victor Stinner71694d52015-03-28 01:18:54 +01002874 if (socket_parse_timeout(&timeout, arg) < 0)
2875 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002878
2879 int block = timeout < 0;
2880 /* Blocking mode for a Python socket object means that operations
2881 like :meth:`recv` or :meth:`sendall` will block the execution of
2882 the current thread until they are complete or aborted with a
2883 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2884 the underlying FD is in a blocking mode. When timeout is a positive
2885 number, the FD is in a non-blocking mode, and socket ops are
2886 implemented with a `select()` call.
2887
2888 When timeout is 0.0, the FD is in a non-blocking mode.
2889
2890 This table summarizes all states in which the socket object and
2891 its underlying FD can be:
2892
2893 ==================== ===================== ==============
2894 `gettimeout()` `getblocking()` FD
2895 ==================== ===================== ==============
2896 ``None`` ``True`` blocking
2897 ``0.0`` ``False`` non-blocking
2898 ``> 0`` ``True`` non-blocking
2899 */
2900
2901 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002902 return NULL;
2903 }
2904 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002905}
2906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002907PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002908"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002909\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002910Set a timeout on socket operations. 'timeout' can be a float,\n\
2911giving in seconds, or None. Setting a timeout of None disables\n\
2912the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002913Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002915/* s.gettimeout() method.
2916 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002917static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302918sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002919{
Victor Stinner71694d52015-03-28 01:18:54 +01002920 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002921 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 }
Victor Stinner71694d52015-03-28 01:18:54 +01002923 else {
2924 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2925 return PyFloat_FromDouble(seconds);
2926 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002927}
2928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002929PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002930"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002931\n\
oldkaa0735f2018-02-02 16:52:55 +08002932Returns the timeout in seconds (float) associated with socket\n\
2933operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002935
Guido van Rossumaee08791992-09-08 09:05:33 +00002936/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002937 With an integer third argument, sets an integer optval with optlen=4.
2938 With None as third argument and an integer fourth argument, set
2939 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002940 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002941 use optional built-in module 'struct' to encode the string.
2942*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002943
Guido van Rossum73624e91994-10-10 17:59:00 +00002944static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002945sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 int level;
2948 int optname;
2949 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002950 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002952 unsigned int optlen;
2953 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002954
caaveryeffc12f2017-09-06 18:18:10 -04002955#ifdef AF_VSOCK
2956 if (s->sock_family == AF_VSOCK) {
2957 uint64_t vflag; // Must be set width of 64 bits
2958 /* setsockopt(level, opt, flag) */
2959 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2960 &level, &optname, &vflag)) {
2961 // level should always be set to AF_VSOCK
2962 res = setsockopt(s->sock_fd, level, optname,
2963 (void*)&vflag, sizeof vflag);
2964 goto done;
2965 }
2966 return NULL;
2967 }
2968#endif
2969
Christian Heimesdffa3942016-09-05 23:54:41 +02002970 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 if (PyArg_ParseTuple(args, "iii:setsockopt",
2972 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002973 res = setsockopt(s->sock_fd, level, optname,
2974 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002975 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002977
2978 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002979 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002980 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2981 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2982 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002983 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002984 NULL, (socklen_t)optlen);
2985 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002987
2988 PyErr_Clear();
2989 /* setsockopt(level, opt, buffer) */
2990 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2991 &level, &optname, &optval))
2992 return NULL;
2993
2994#ifdef MS_WINDOWS
2995 if (optval.len > INT_MAX) {
2996 PyBuffer_Release(&optval);
2997 PyErr_Format(PyExc_OverflowError,
2998 "socket option is larger than %i bytes",
2999 INT_MAX);
3000 return NULL;
3001 }
3002 res = setsockopt(s->sock_fd, level, optname,
3003 optval.buf, (int)optval.len);
3004#else
3005 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3006#endif
3007 PyBuffer_Release(&optval);
3008
3009done:
Victor Stinnercc739322016-03-23 21:35:29 +01003010 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003012 }
3013
3014 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003015}
3016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003017PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003018"setsockopt(level, option, value: int)\n\
3019setsockopt(level, option, value: buffer)\n\
3020setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003021\n\
3022Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003023The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003024None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003025
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003026
Guido van Rossumaee08791992-09-08 09:05:33 +00003027/* s.getsockopt() method.
3028 With two arguments, retrieves an integer option.
3029 With a third integer argument, retrieves a string buffer of that size;
3030 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003031
Guido van Rossum73624e91994-10-10 17:59:00 +00003032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003033sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 int level;
3036 int optname;
3037 int res;
3038 PyObject *buf;
3039 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003040 int flag = 0;
3041 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3044 &level, &optname, &buflen))
3045 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003048#ifdef AF_VSOCK
3049 if (s->sock_family == AF_VSOCK) {
3050 uint64_t vflag = 0; // Must be set width of 64 bits
3051 flagsize = sizeof vflag;
3052 res = getsockopt(s->sock_fd, level, optname,
3053 (void *)&vflag, &flagsize);
3054 if (res < 0)
3055 return s->errorhandler();
3056 return PyLong_FromUnsignedLong(vflag);
3057 }
3058#endif
3059 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 res = getsockopt(s->sock_fd, level, optname,
3061 (void *)&flag, &flagsize);
3062 if (res < 0)
3063 return s->errorhandler();
3064 return PyLong_FromLong(flag);
3065 }
caaveryeffc12f2017-09-06 18:18:10 -04003066#ifdef AF_VSOCK
3067 if (s->sock_family == AF_VSOCK) {
3068 PyErr_SetString(PyExc_OSError,
3069 "getsockopt string buffer not allowed");
3070 return NULL;
3071 }
3072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003074 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 "getsockopt buflen out of range");
3076 return NULL;
3077 }
3078 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3079 if (buf == NULL)
3080 return NULL;
3081 res = getsockopt(s->sock_fd, level, optname,
3082 (void *)PyBytes_AS_STRING(buf), &buflen);
3083 if (res < 0) {
3084 Py_DECREF(buf);
3085 return s->errorhandler();
3086 }
3087 _PyBytes_Resize(&buf, buflen);
3088 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003089}
3090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003091PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003092"getsockopt(level, option[, buffersize]) -> value\n\
3093\n\
3094Get a socket option. See the Unix manual for level and option.\n\
3095If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003096string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003097
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003098
Fred Drake728819a2000-07-01 03:40:12 +00003099/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003100
Guido van Rossum73624e91994-10-10 17:59:00 +00003101static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003102sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 sock_addr_t addrbuf;
3105 int addrlen;
3106 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003107
Victor Stinnerd565fb92019-10-10 21:30:20 +02003108 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003110 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003111
3112 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3113 return NULL;
3114 }
3115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 Py_BEGIN_ALLOW_THREADS
3117 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3118 Py_END_ALLOW_THREADS
3119 if (res < 0)
3120 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003121 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003122}
3123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003124PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003125"bind(address)\n\
3126\n\
3127Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003128pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003129sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003130
Guido van Rossum30a685f1991-06-27 15:51:29 +00003131
3132/* s.close() method.
3133 Set the file descriptor to -1 so operations tried subsequently
3134 will surely fail. */
3135
Guido van Rossum73624e91994-10-10 17:59:00 +00003136static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303137sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003140 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003141
Victor Stinner19a8e842016-03-21 16:36:48 +01003142 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003143 if (fd != INVALID_SOCKET) {
3144 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003145
3146 /* We do not want to retry upon EINTR: see
3147 http://lwn.net/Articles/576478/ and
3148 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3149 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003151 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003153 /* bpo-30319: The peer can already have closed the connection.
3154 Python ignores ECONNRESET on close(). */
3155 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003156 return s->errorhandler();
3157 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003159 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003160}
3161
Christian Heimesd0e31b92018-01-27 09:54:13 +01003162PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003163"close()\n\
3164\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003165Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003166
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003167static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303168sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003169{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003170 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003171 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003172 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003173}
3174
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003175PyDoc_STRVAR(detach_doc,
3176"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003177\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003178Close the socket object without closing the underlying file descriptor.\n\
3179The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003180can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003181
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003182static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003183sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003184{
Victor Stinner81c41db2015-04-02 11:50:57 +02003185 int err;
3186 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003187
Victor Stinner81c41db2015-04-02 11:50:57 +02003188 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3189 /* getsockopt() failed */
3190 return 0;
3191 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003192
Victor Stinner81c41db2015-04-02 11:50:57 +02003193 if (err == EISCONN)
3194 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003195 if (err != 0) {
3196 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3197 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003198 return 0;
3199 }
3200 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003201}
3202
3203static int
3204internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3205 int raise)
3206{
3207 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003208
3209 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003211 Py_END_ALLOW_THREADS
3212
Victor Stinner70a46f62015-03-31 22:03:59 +02003213 if (!res) {
3214 /* connect() succeeded, the socket is connected */
3215 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003217
Victor Stinner81c41db2015-04-02 11:50:57 +02003218 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003219
Victor Stinner81c41db2015-04-02 11:50:57 +02003220 /* save error, PyErr_CheckSignals() can replace it */
3221 err = GET_SOCK_ERROR;
3222 if (CHECK_ERRNO(EINTR)) {
3223 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003224 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003225
3226 /* Issue #23618: when connect() fails with EINTR, the connection is
3227 running asynchronously.
3228
3229 If the socket is blocking or has a timeout, wait until the
3230 connection completes, fails or timed out using select(), and then
3231 get the connection status using getsockopt(SO_ERROR).
3232
3233 If the socket is non-blocking, raise InterruptedError. The caller is
3234 responsible to wait until the connection completes, fails or timed
3235 out (it's the case in asyncio for example). */
3236 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3237 }
3238 else {
3239 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3240 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003241 }
3242
Victor Stinner81c41db2015-04-02 11:50:57 +02003243 if (!wait_connect) {
3244 if (raise) {
3245 /* restore error, maybe replaced by PyErr_CheckSignals() */
3246 SET_SOCK_ERROR(err);
3247 s->errorhandler();
3248 return -1;
3249 }
3250 else
3251 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003252 }
3253
Victor Stinner81c41db2015-04-02 11:50:57 +02003254 if (raise) {
3255 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003256 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3257 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003258 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003259 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003260 else {
3261 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003262 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3263 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003264 return err;
3265 }
3266 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003267}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003268
Fred Drake728819a2000-07-01 03:40:12 +00003269/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003270
Guido van Rossum73624e91994-10-10 17:59:00 +00003271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003272sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 sock_addr_t addrbuf;
3275 int addrlen;
3276 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003277
Victor Stinnerd565fb92019-10-10 21:30:20 +02003278 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003280 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003281
Steve Dowerb82e17e2019-05-23 08:45:22 -07003282 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3283 return NULL;
3284 }
3285
Victor Stinner81c41db2015-04-02 11:50:57 +02003286 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003287 if (res < 0)
3288 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003289
Victor Stinneree699e92015-03-31 21:28:42 +02003290 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003291}
3292
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003293PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003294"connect(address)\n\
3295\n\
3296Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003297is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003298
Guido van Rossum30a685f1991-06-27 15:51:29 +00003299
Fred Drake728819a2000-07-01 03:40:12 +00003300/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003301
3302static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003303sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 sock_addr_t addrbuf;
3306 int addrlen;
3307 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003308
Victor Stinnerd565fb92019-10-10 21:30:20 +02003309 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003311 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003312
Steve Dowerb82e17e2019-05-23 08:45:22 -07003313 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3314 return NULL;
3315 }
3316
Victor Stinner81c41db2015-04-02 11:50:57 +02003317 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003318 if (res < 0)
3319 return NULL;
3320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003322}
3323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003325"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003326\n\
3327This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003328instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003329
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003330
Guido van Rossumed233a51992-06-23 09:07:03 +00003331/* s.fileno() method */
3332
Guido van Rossum73624e91994-10-10 17:59:00 +00003333static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303334sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003337}
3338
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003339PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003340"fileno() -> integer\n\
3341\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003342Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003343
Guido van Rossumed233a51992-06-23 09:07:03 +00003344
Guido van Rossumc89705d1992-11-26 08:54:07 +00003345/* s.getsockname() method */
3346
Guido van Rossum73624e91994-10-10 17:59:00 +00003347static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303348sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 sock_addr_t addrbuf;
3351 int res;
3352 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 if (!getsockaddrlen(s, &addrlen))
3355 return NULL;
3356 memset(&addrbuf, 0, addrlen);
3357 Py_BEGIN_ALLOW_THREADS
3358 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3359 Py_END_ALLOW_THREADS
3360 if (res < 0)
3361 return s->errorhandler();
3362 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3363 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003364}
3365
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003366PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003367"getsockname() -> address info\n\
3368\n\
3369Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003370info is a pair (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) {
4209 PyErr_SetString(socket_timeout, "timed out");
4210 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) {
6105 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6106 "ntohs: Python int too large to convert to C "
6107 "16-bit unsigned integer (The silent truncation "
6108 "is deprecated)",
6109 1)) {
6110 return NULL;
6111 }
6112 }
6113 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006114}
6115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006116PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006117"ntohs(integer) -> integer\n\
6118\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006119Convert a 16-bit unsigned integer from network to host byte order.\n\
6120Note that in case the received integer does not fit in 16-bit unsigned\n\
6121integer, but does fit in a positive C int, it is silently truncated to\n\
612216-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006123However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006124exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006125
6126
Guido van Rossum006bf911996-06-12 04:04:55 +00006127static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006128socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 if (PyLong_Check(arg)) {
6133 x = PyLong_AsUnsignedLong(arg);
6134 if (x == (unsigned long) -1 && PyErr_Occurred())
6135 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006136#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 {
6138 unsigned long y;
6139 /* only want the trailing 32 bits */
6140 y = x & 0xFFFFFFFFUL;
6141 if (y ^ x)
6142 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006143 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 x = y;
6145 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 }
6148 else
6149 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006150 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006153}
6154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006155PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006156"ntohl(integer) -> integer\n\
6157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006158Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006159
6160
Guido van Rossum006bf911996-06-12 04:04:55 +00006161static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006162socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006163{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006164 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006165
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006166 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 return NULL;
6168 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006169 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006171 "htons: can't convert negative Python int to C "
6172 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 return NULL;
6174 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006175 if (x > 0xffff) {
6176 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6177 "htons: Python int too large to convert to C "
6178 "16-bit unsigned integer (The silent truncation "
6179 "is deprecated)",
6180 1)) {
6181 return NULL;
6182 }
6183 }
6184 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006185}
6186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006187PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006188"htons(integer) -> integer\n\
6189\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006190Convert a 16-bit unsigned integer from host to network byte order.\n\
6191Note that in case the received integer does not fit in 16-bit unsigned\n\
6192integer, but does fit in a positive C int, it is silently truncated to\n\
619316-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006194However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006195exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006196
6197
Guido van Rossum006bf911996-06-12 04:04:55 +00006198static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006199socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 if (PyLong_Check(arg)) {
6204 x = PyLong_AsUnsignedLong(arg);
6205 if (x == (unsigned long) -1 && PyErr_Occurred())
6206 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006207#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 {
6209 unsigned long y;
6210 /* only want the trailing 32 bits */
6211 y = x & 0xFFFFFFFFUL;
6212 if (y ^ x)
6213 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006214 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 x = y;
6216 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 }
6219 else
6220 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006221 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 Py_TYPE(arg)->tp_name);
6223 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006224}
6225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006226PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006227"htonl(integer) -> integer\n\
6228\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006229Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006230
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006231/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006233PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006234"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006235\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006236Convert 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 +00006237binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006238
6239static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006240socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006241{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006242#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006244#endif
6245
6246#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006247#if (SIZEOF_INT != 4)
6248#error "Not sure if in_addr_t exists and int is not 32-bits."
6249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 /* Have to use inet_addr() instead */
6251 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006252#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006253 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6256 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006257
Tim Peters1df9fdd2003-02-13 03:13:40 +00006258
6259#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006260
6261#ifdef USE_INET_ATON_WEAKLINK
6262 if (inet_aton != NULL) {
6263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 if (inet_aton(ip_addr, &buf))
6265 return PyBytes_FromStringAndSize((char *)(&buf),
6266 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006267
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006268 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 "illegal IP address string passed to inet_aton");
6270 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006271
Thomas Wouters477c8d52006-05-27 19:21:47 +00006272#ifdef USE_INET_ATON_WEAKLINK
6273 } else {
6274#endif
6275
6276#endif
6277
6278#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006280 /* special-case this address as inet_addr might return INADDR_NONE
6281 * for this */
6282 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006283 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006285
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006286 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006290 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 "illegal IP address string passed to inet_aton");
6292 return NULL;
6293 }
6294 }
6295 return PyBytes_FromStringAndSize((char *) &packed_addr,
6296 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006297
6298#ifdef USE_INET_ATON_WEAKLINK
6299 }
6300#endif
6301
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006302#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006303}
6304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006305PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006306"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006307\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006308Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006309
6310static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006311socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006312{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006313 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006315
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006316 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 return NULL;
6318 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006319
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006320 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006321 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006323 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324 return NULL;
6325 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006326
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006327 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6328 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006329
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006330 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006332}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006333
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006334#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006335
6336PyDoc_STRVAR(inet_pton_doc,
6337"inet_pton(af, ip) -> packed IP address string\n\
6338\n\
6339Convert an IP address from string format to a packed string suitable\n\
6340for use with low-level network functions.");
6341
6342static PyObject *
6343socket_inet_pton(PyObject *self, PyObject *args)
6344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006346 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006348#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006349 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006350#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6354 return NULL;
6355 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006356
Martin v. Löwis04697e82004-06-02 12:35:29 +00006357#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006359 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 "can't use AF_INET6, IPv6 is disabled");
6361 return NULL;
6362 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006363#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 retval = inet_pton(af, ip, packed);
6366 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006367 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 return NULL;
6369 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006370 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 "illegal IP address string passed to inet_pton");
6372 return NULL;
6373 } else if (af == AF_INET) {
6374 return PyBytes_FromStringAndSize(packed,
6375 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006376#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 } else if (af == AF_INET6) {
6378 return PyBytes_FromStringAndSize(packed,
6379 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006382 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 return NULL;
6384 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006385}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006386
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006387PyDoc_STRVAR(inet_ntop_doc,
6388"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6389\n\
6390Convert a packed IP address of the given family to string format.");
6391
6392static PyObject *
6393socket_inet_ntop(PyObject *self, PyObject *args)
6394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006396 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006398#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006399 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006400#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006401 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006402#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006403
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006404 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 return NULL;
6406 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006409 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 PyErr_SetString(PyExc_ValueError,
6411 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006412 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 return NULL;
6414 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006415#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006417 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 PyErr_SetString(PyExc_ValueError,
6419 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006420 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421 return NULL;
6422 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 } else {
6425 PyErr_Format(PyExc_ValueError,
6426 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006427 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 return NULL;
6429 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006430
Коренберг Марк7766b962018-02-13 00:47:42 +05006431 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006432 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6433 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006435 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436 return NULL;
6437 } else {
6438 return PyUnicode_FromString(retval);
6439 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006440}
6441
6442#endif /* HAVE_INET_PTON */
6443
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006444/* Python interface to getaddrinfo(host, port). */
6445
6446/*ARGSUSED*/
6447static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006448socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006449{
Victor Stinner77af1722011-05-26 14:05:59 +02006450 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006451 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452 struct addrinfo hints, *res;
6453 struct addrinfo *res0 = NULL;
6454 PyObject *hobj = NULL;
6455 PyObject *pobj = (PyObject *)NULL;
6456 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006457 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 int family, socktype, protocol, flags;
6459 int error;
6460 PyObject *all = (PyObject *)NULL;
6461 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006462
Georg Brandl6083a4b2013-10-14 06:51:46 +02006463 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006465 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006466 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 &protocol, &flags)) {
6468 return NULL;
6469 }
6470 if (hobj == Py_None) {
6471 hptr = NULL;
6472 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006473 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474 if (!idna)
6475 return NULL;
6476 assert(PyBytes_Check(idna));
6477 hptr = PyBytes_AS_STRING(idna);
6478 } else if (PyBytes_Check(hobj)) {
6479 hptr = PyBytes_AsString(hobj);
6480 } else {
6481 PyErr_SetString(PyExc_TypeError,
6482 "getaddrinfo() argument 1 must be string or None");
6483 return NULL;
6484 }
6485 if (PyLong_CheckExact(pobj)) {
6486 long value = PyLong_AsLong(pobj);
6487 if (value == -1 && PyErr_Occurred())
6488 goto err;
6489 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6490 pptr = pbuf;
6491 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006492 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006493 if (pptr == NULL)
6494 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006496 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497 } else if (pobj == Py_None) {
6498 pptr = (char *)NULL;
6499 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006500 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 goto err;
6502 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006503#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006504 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006505 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006506 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6507 * This workaround avoids a segfault in libsystem.
6508 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006509 pptr = "00";
6510 }
6511#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006512
6513 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6514 hobj, pobj, family, socktype, protocol) < 0) {
6515 return NULL;
6516 }
6517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518 memset(&hints, 0, sizeof(hints));
6519 hints.ai_family = family;
6520 hints.ai_socktype = socktype;
6521 hints.ai_protocol = protocol;
6522 hints.ai_flags = flags;
6523 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524 error = getaddrinfo(hptr, pptr, &hints, &res0);
6525 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526 if (error) {
6527 set_gaierror(error);
6528 goto err;
6529 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006530
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006531 all = PyList_New(0);
6532 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533 goto err;
6534 for (res = res0; res; res = res->ai_next) {
6535 PyObject *single;
6536 PyObject *addr =
6537 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6538 if (addr == NULL)
6539 goto err;
6540 single = Py_BuildValue("iiisO", res->ai_family,
6541 res->ai_socktype, res->ai_protocol,
6542 res->ai_canonname ? res->ai_canonname : "",
6543 addr);
6544 Py_DECREF(addr);
6545 if (single == NULL)
6546 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006547
Zackery Spytz4c596d52018-11-14 15:39:01 -07006548 if (PyList_Append(all, single)) {
6549 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006551 }
6552 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 }
6554 Py_XDECREF(idna);
6555 if (res0)
6556 freeaddrinfo(res0);
6557 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006558 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 Py_XDECREF(all);
6560 Py_XDECREF(idna);
6561 if (res0)
6562 freeaddrinfo(res0);
6563 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006564}
6565
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006566PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006567"getaddrinfo(host, port [, family, type, proto, flags])\n\
6568 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006570Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006571
6572/* Python interface to getnameinfo(sa, flags). */
6573
6574/*ARGSUSED*/
6575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006576socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyObject *sa = (PyObject *)NULL;
6579 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006580 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006581 int port;
6582 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6584 struct addrinfo hints, *res = NULL;
6585 int error;
6586 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006587 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 flags = flowinfo = scope_id = 0;
6590 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6591 return NULL;
6592 if (!PyTuple_Check(sa)) {
6593 PyErr_SetString(PyExc_TypeError,
6594 "getnameinfo() argument 1 must be a tuple");
6595 return NULL;
6596 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006597 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006599 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006601 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006602 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006603 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006604 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006605 return NULL;
6606 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006607
6608 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6609 return NULL;
6610 }
6611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6613 memset(&hints, 0, sizeof(hints));
6614 hints.ai_family = AF_UNSPEC;
6615 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006616 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 error = getaddrinfo(hostp, pbuf, &hints, &res);
6619 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 if (error) {
6621 set_gaierror(error);
6622 goto fail;
6623 }
6624 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006625 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 "sockaddr resolved to multiple addresses");
6627 goto fail;
6628 }
6629 switch (res->ai_family) {
6630 case AF_INET:
6631 {
6632 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006633 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 "IPv4 sockaddr must be 2 tuple");
6635 goto fail;
6636 }
6637 break;
6638 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006639#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 case AF_INET6:
6641 {
6642 struct sockaddr_in6 *sin6;
6643 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006644 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 sin6->sin6_scope_id = scope_id;
6646 break;
6647 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006650 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6652 if (error) {
6653 set_gaierror(error);
6654 goto fail;
6655 }
Victor Stinner72400302016-01-28 15:41:01 +01006656
6657 name = sock_decode_hostname(hbuf);
6658 if (name == NULL)
6659 goto fail;
6660 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006661
6662fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 if (res)
6664 freeaddrinfo(res);
6665 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006666}
6667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006668PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006669"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006671Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006672
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006673
6674/* Python API to getting and setting the default timeout value. */
6675
6676static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306677socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006678{
Victor Stinner71694d52015-03-28 01:18:54 +01006679 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006680 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 }
Victor Stinner71694d52015-03-28 01:18:54 +01006682 else {
6683 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6684 return PyFloat_FromDouble(seconds);
6685 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006686}
6687
6688PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006689"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006690\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006691Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006692A value of None indicates that new socket objects have no timeout.\n\
6693When the socket module is first imported, the default is None.");
6694
6695static PyObject *
6696socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6697{
Victor Stinner71694d52015-03-28 01:18:54 +01006698 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006699
Victor Stinner71694d52015-03-28 01:18:54 +01006700 if (socket_parse_timeout(&timeout, arg) < 0)
6701 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006704
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006705 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006706}
6707
6708PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006709"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006710\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006711Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006712A value of None indicates that new socket objects have no timeout.\n\
6713When the socket module is first imported, the default is None.");
6714
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006715#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006716/* Python API for getting interface indices and names */
6717
6718static PyObject *
6719socket_if_nameindex(PyObject *self, PyObject *arg)
6720{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006721 PyObject *list = PyList_New(0);
6722 if (list == NULL) {
6723 return NULL;
6724 }
6725#ifdef MS_WINDOWS
6726 PMIB_IF_TABLE2 tbl;
6727 int ret;
6728 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6729 Py_DECREF(list);
6730 // ret is used instead of GetLastError()
6731 return PyErr_SetFromWindowsErr(ret);
6732 }
6733 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6734 MIB_IF_ROW2 r = tbl->Table[i];
6735 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6736 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6737 Py_ARRAY_LENGTH(buf)))) {
6738 Py_DECREF(list);
6739 FreeMibTable(tbl);
6740 // ret is used instead of GetLastError()
6741 return PyErr_SetFromWindowsErr(ret);
6742 }
6743 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6744 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6745 Py_XDECREF(tuple);
6746 Py_DECREF(list);
6747 FreeMibTable(tbl);
6748 return NULL;
6749 }
6750 Py_DECREF(tuple);
6751 }
6752 FreeMibTable(tbl);
6753 return list;
6754#else
Charles-François Natali60713592011-05-20 16:55:06 +02006755 int i;
6756 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006757
Charles-François Natali60713592011-05-20 16:55:06 +02006758 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006759 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006760 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006761 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006762 return NULL;
6763 }
6764
Gregory P. Smithb474e672018-12-30 17:05:36 -08006765#ifdef _Py_MEMORY_SANITIZER
6766 __msan_unpoison(ni, sizeof(ni));
6767 __msan_unpoison(&ni[0], sizeof(ni[0]));
6768#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006769 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006770#ifdef _Py_MEMORY_SANITIZER
6771 /* This one isn't the end sentinel, the next one must exist. */
6772 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6773 /* Otherwise Py_BuildValue internals are flagged by MSan when
6774 they access the not-msan-tracked if_name string data. */
6775 {
6776 char *to_sanitize = ni[i].if_name;
6777 do {
6778 __msan_unpoison(to_sanitize, 1);
6779 } while (*to_sanitize++ != '\0');
6780 }
6781#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006782 PyObject *ni_tuple = Py_BuildValue("IO&",
6783 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006784
6785 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6786 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006787 Py_DECREF(list);
6788 if_freenameindex(ni);
6789 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006790 }
6791 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006792 }
6793
6794 if_freenameindex(ni);
6795 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006796#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006797}
6798
6799PyDoc_STRVAR(if_nameindex_doc,
6800"if_nameindex()\n\
6801\n\
6802Returns a list of network interface information (index, name) tuples.");
6803
Charles-François Natali60713592011-05-20 16:55:06 +02006804static PyObject *
6805socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006806{
Charles-François Natali60713592011-05-20 16:55:06 +02006807 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006808#ifdef MS_WINDOWS
6809 NET_IFINDEX index;
6810#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006811 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006812#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006813 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6814 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006815 return NULL;
6816
Charles-François Natali60713592011-05-20 16:55:06 +02006817 index = if_nametoindex(PyBytes_AS_STRING(oname));
6818 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006819 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006820 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006821 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006822 return NULL;
6823 }
6824
6825 return PyLong_FromUnsignedLong(index);
6826}
6827
6828PyDoc_STRVAR(if_nametoindex_doc,
6829"if_nametoindex(if_name)\n\
6830\n\
6831Returns the interface index corresponding to the interface name if_name.");
6832
Charles-François Natali60713592011-05-20 16:55:06 +02006833static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006834socket_if_indextoname(PyObject *self, PyObject *arg)
6835{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006836#ifdef MS_WINDOWS
6837 NET_IFINDEX index;
6838#else
Charles-François Natali60713592011-05-20 16:55:06 +02006839 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006840#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006841 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006842
Charles-François Natali60713592011-05-20 16:55:06 +02006843 index = PyLong_AsUnsignedLong(arg);
6844 if (index == (unsigned long) -1)
6845 return NULL;
6846
6847 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006848 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006849 return NULL;
6850 }
6851
Charles-François Natali60713592011-05-20 16:55:06 +02006852 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006853}
6854
6855PyDoc_STRVAR(if_indextoname_doc,
6856"if_indextoname(if_index)\n\
6857\n\
6858Returns the interface name corresponding to the interface index if_index.");
6859
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006860#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006861
6862
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006863#ifdef CMSG_LEN
6864/* Python interface to CMSG_LEN(length). */
6865
6866static PyObject *
6867socket_CMSG_LEN(PyObject *self, PyObject *args)
6868{
6869 Py_ssize_t length;
6870 size_t result;
6871
6872 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6873 return NULL;
6874 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6875 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6876 return NULL;
6877 }
6878 return PyLong_FromSize_t(result);
6879}
6880
6881PyDoc_STRVAR(CMSG_LEN_doc,
6882"CMSG_LEN(length) -> control message length\n\
6883\n\
6884Return the total length, without trailing padding, of an ancillary\n\
6885data item with associated data of the given length. This value can\n\
6886often be used as the buffer size for recvmsg() to receive a single\n\
6887item of ancillary data, but RFC 3542 requires portable applications to\n\
6888use CMSG_SPACE() and thus include space for padding, even when the\n\
6889item will be the last in the buffer. Raises OverflowError if length\n\
6890is outside the permissible range of values.");
6891
6892
6893#ifdef CMSG_SPACE
6894/* Python interface to CMSG_SPACE(length). */
6895
6896static PyObject *
6897socket_CMSG_SPACE(PyObject *self, PyObject *args)
6898{
6899 Py_ssize_t length;
6900 size_t result;
6901
6902 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6903 return NULL;
6904 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6905 PyErr_SetString(PyExc_OverflowError,
6906 "CMSG_SPACE() argument out of range");
6907 return NULL;
6908 }
6909 return PyLong_FromSize_t(result);
6910}
6911
6912PyDoc_STRVAR(CMSG_SPACE_doc,
6913"CMSG_SPACE(length) -> buffer size\n\
6914\n\
6915Return the buffer size needed for recvmsg() to receive an ancillary\n\
6916data item with associated data of the given length, along with any\n\
6917trailing padding. The buffer space needed to receive multiple items\n\
6918is the sum of the CMSG_SPACE() values for their associated data\n\
6919lengths. Raises OverflowError if length is outside the permissible\n\
6920range of values.");
6921#endif /* CMSG_SPACE */
6922#endif /* CMSG_LEN */
6923
6924
Guido van Rossum30a685f1991-06-27 15:51:29 +00006925/* List of functions exported by this module. */
6926
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006927static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 {"gethostbyname", socket_gethostbyname,
6929 METH_VARARGS, gethostbyname_doc},
6930 {"gethostbyname_ex", socket_gethostbyname_ex,
6931 METH_VARARGS, ghbn_ex_doc},
6932 {"gethostbyaddr", socket_gethostbyaddr,
6933 METH_VARARGS, gethostbyaddr_doc},
6934 {"gethostname", socket_gethostname,
6935 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006936#ifdef HAVE_SETHOSTNAME
6937 {"sethostname", socket_sethostname,
6938 METH_VARARGS, sethostname_doc},
6939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 {"getservbyname", socket_getservbyname,
6941 METH_VARARGS, getservbyname_doc},
6942 {"getservbyport", socket_getservbyport,
6943 METH_VARARGS, getservbyport_doc},
6944 {"getprotobyname", socket_getprotobyname,
6945 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006946 {"close", socket_close,
6947 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006948#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949 {"dup", socket_dup,
6950 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006951#endif
Dave Cole331708b2004-08-09 04:51:41 +00006952#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953 {"socketpair", socket_socketpair,
6954 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956 {"ntohs", socket_ntohs,
6957 METH_VARARGS, ntohs_doc},
6958 {"ntohl", socket_ntohl,
6959 METH_O, ntohl_doc},
6960 {"htons", socket_htons,
6961 METH_VARARGS, htons_doc},
6962 {"htonl", socket_htonl,
6963 METH_O, htonl_doc},
6964 {"inet_aton", socket_inet_aton,
6965 METH_VARARGS, inet_aton_doc},
6966 {"inet_ntoa", socket_inet_ntoa,
6967 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006968#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969 {"inet_pton", socket_inet_pton,
6970 METH_VARARGS, inet_pton_doc},
6971 {"inet_ntop", socket_inet_ntop,
6972 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006973#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006974 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006975 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006976 {"getnameinfo", socket_getnameinfo,
6977 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306978 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 METH_NOARGS, getdefaulttimeout_doc},
6980 {"setdefaulttimeout", socket_setdefaulttimeout,
6981 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006982#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006983 {"if_nameindex", socket_if_nameindex,
6984 METH_NOARGS, if_nameindex_doc},
6985 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006986 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006987 {"if_indextoname", socket_if_indextoname,
6988 METH_O, if_indextoname_doc},
6989#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006990#ifdef CMSG_LEN
6991 {"CMSG_LEN", socket_CMSG_LEN,
6992 METH_VARARGS, CMSG_LEN_doc},
6993#ifdef CMSG_SPACE
6994 {"CMSG_SPACE", socket_CMSG_SPACE,
6995 METH_VARARGS, CMSG_SPACE_doc},
6996#endif
6997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006999};
7000
Guido van Rossum30a685f1991-06-27 15:51:29 +00007001
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007002#ifdef MS_WINDOWS
7003#define OS_INIT_DEFINED
7004
7005/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007006
7007static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007008os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007011}
7012
7013static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007014os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007016 WSADATA WSAData;
7017 int ret;
7018 ret = WSAStartup(0x0101, &WSAData);
7019 switch (ret) {
7020 case 0: /* No error */
7021 Py_AtExit(os_cleanup);
7022 return 1; /* Success */
7023 case WSASYSNOTREADY:
7024 PyErr_SetString(PyExc_ImportError,
7025 "WSAStartup failed: network not ready");
7026 break;
7027 case WSAVERNOTSUPPORTED:
7028 case WSAEINVAL:
7029 PyErr_SetString(
7030 PyExc_ImportError,
7031 "WSAStartup failed: requested version not supported");
7032 break;
7033 default:
7034 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7035 break;
7036 }
7037 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007038}
7039
Guido van Rossum8d665e61996-06-26 18:22:49 +00007040#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007041
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007042
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007043
7044#ifndef OS_INIT_DEFINED
7045static int
7046os_init(void)
7047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007049}
7050#endif
7051
7052
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007053/* C API table - always add new things to the end for binary
7054 compatibility. */
7055static
7056PySocketModule_APIObject PySocketModuleAPI =
7057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007059 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007060 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007061};
7062
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007063
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007064/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007065
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007066 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007067 "socket.py" which implements some additional functionality.
7068 The import of "_socket" may fail with an ImportError exception if
7069 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007070 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007071 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007072*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007074PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007075"Implementation module for socket operations.\n\
7076\n\
7077See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007078
Martin v. Löwis1a214512008-06-11 05:26:20 +00007079static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080 PyModuleDef_HEAD_INIT,
7081 PySocket_MODULE_NAME,
7082 socket_doc,
7083 -1,
7084 socket_methods,
7085 NULL,
7086 NULL,
7087 NULL,
7088 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007089};
7090
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007091PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007092PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007096 if (!os_init())
7097 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007098
Victor Stinnerdaf45552013-08-28 00:53:59 +02007099#ifdef MS_WINDOWS
7100 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007101 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007102 }
7103#endif
7104
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007105 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106 m = PyModule_Create(&socketmodule);
7107 if (m == NULL)
7108 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007109
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007110 Py_INCREF(PyExc_OSError);
7111 PySocketModuleAPI.error = PyExc_OSError;
7112 Py_INCREF(PyExc_OSError);
7113 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007115 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116 if (socket_herror == NULL)
7117 return NULL;
7118 Py_INCREF(socket_herror);
7119 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007120 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007121 NULL);
7122 if (socket_gaierror == NULL)
7123 return NULL;
7124 Py_INCREF(socket_gaierror);
7125 PyModule_AddObject(m, "gaierror", socket_gaierror);
7126 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007127 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007128 if (socket_timeout == NULL)
7129 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007130 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131 Py_INCREF(socket_timeout);
7132 PyModule_AddObject(m, "timeout", socket_timeout);
7133 Py_INCREF((PyObject *)&sock_type);
7134 if (PyModule_AddObject(m, "SocketType",
7135 (PyObject *)&sock_type) != 0)
7136 return NULL;
7137 Py_INCREF((PyObject *)&sock_type);
7138 if (PyModule_AddObject(m, "socket",
7139 (PyObject *)&sock_type) != 0)
7140 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007141
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007142#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007144#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147 Py_INCREF(has_ipv6);
7148 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 /* Export C API */
7151 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7152 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7153 ) != 0)
7154 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007157#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007159#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007161#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007163#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007164#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007167#endif
7168#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007170#endif
7171#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007174#endif
7175#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007176 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007178#endif
7179#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007182#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007183#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007186#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007187#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007190#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007191#ifdef HAVE_SOCKADDR_ALG
7192 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7193#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007194#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007197#endif
7198#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007200#endif
7201#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007204#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007205#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007208#endif
7209#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007212#endif
7213#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007216#endif
7217#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007220#endif
7221#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, AF_NETLINK);
7224 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007225#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007227#endif
7228#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007230#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7232 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007233#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007235#endif
7236#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007238#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007239#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007241#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007242#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007244#endif
7245#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007247#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007249#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007251#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007252#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007253 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007254#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007255#ifdef NETLINK_CRYPTO
7256 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7257#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007258#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007259
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007260#ifdef AF_QIPCRTR
7261 /* Qualcomm IPCROUTER */
7262 PyModule_AddIntMacro(m, AF_QIPCRTR);
7263#endif
7264
caaveryeffc12f2017-09-06 18:18:10 -04007265#ifdef AF_VSOCK
7266 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7267 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7268 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7269 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7270 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7271 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7272 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7273 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7274 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7275#endif
7276
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007277#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007280#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007281#ifdef AF_LINK
7282 PyModule_AddIntMacro(m, AF_LINK);
7283#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007284#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007287#endif
7288#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007289 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007291#endif
7292#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007295#endif
7296#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007299#endif
7300#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007303#endif
7304#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007307#endif
7308#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007311#endif
7312#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007315#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007316
Hye-Shik Chang81268602004-02-02 06:05:24 +00007317#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007319#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007321#endif /* BTPROTO_L2CAP */
7322#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, BTPROTO_HCI);
7324 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007325#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007327#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007330#endif /* !__FreeBSD__ */
7331#endif /* !__NetBSD__ && !__DragonFly__ */
7332#endif /* BTPROTO_HCI */
7333#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007335#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7337 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007338#ifdef BTPROTO_SCO
7339 PyModule_AddIntMacro(m, BTPROTO_SCO);
7340#endif /* BTPROTO_SCO */
7341#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007342
Charles-François Natali47413c12011-10-06 19:47:44 +02007343#ifdef AF_CAN
7344 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007346#endif
7347#ifdef PF_CAN
7348 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007350#endif
7351
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007352/* Reliable Datagram Sockets */
7353#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007355#endif
7356#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007358#endif
7359
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007360/* Kernel event messages */
7361#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007363#endif
7364#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007366#endif
7367
Antoine Pitroub156a462010-10-27 20:13:57 +00007368#ifdef AF_PACKET
7369 PyModule_AddIntMacro(m, AF_PACKET);
7370#endif
7371#ifdef PF_PACKET
7372 PyModule_AddIntMacro(m, PF_PACKET);
7373#endif
7374#ifdef PACKET_HOST
7375 PyModule_AddIntMacro(m, PACKET_HOST);
7376#endif
7377#ifdef PACKET_BROADCAST
7378 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7379#endif
7380#ifdef PACKET_MULTICAST
7381 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7382#endif
7383#ifdef PACKET_OTHERHOST
7384 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7385#endif
7386#ifdef PACKET_OUTGOING
7387 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7388#endif
7389#ifdef PACKET_LOOPBACK
7390 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7391#endif
7392#ifdef PACKET_FASTROUTE
7393 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007394#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007395
Christian Heimes043d6f62008-01-07 17:19:16 +00007396#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007399 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7401 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7402 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007403
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7405 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7406 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007408 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, SOL_TIPC);
7410 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7411 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7412 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7413 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007414
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7416 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7417 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7418 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7422 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007423#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007426#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7428 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7429 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7430 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7431 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7432 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007433#endif
7434
Christian Heimesdffa3942016-09-05 23:54:41 +02007435#ifdef HAVE_SOCKADDR_ALG
7436 /* Socket options */
7437 PyModule_AddIntMacro(m, ALG_SET_KEY);
7438 PyModule_AddIntMacro(m, ALG_SET_IV);
7439 PyModule_AddIntMacro(m, ALG_SET_OP);
7440 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7441 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7442 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7443
7444 /* Operations */
7445 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7446 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7447 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7448 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7449#endif
7450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007451 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, SOCK_STREAM);
7453 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007454/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007455#ifdef SOCK_RAW
7456 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007458#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007460#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007462#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007463#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007465#endif
7466#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007468#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007478#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007479#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007481#endif
7482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007483#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007486#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007489#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007492#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007495#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007500#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007501#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007504#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007530#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007532#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007533#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007535#endif
7536#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007538#endif
7539#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007541#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007542#ifdef SO_PASSSEC
7543 PyModule_AddIntMacro(m, SO_PASSSEC);
7544#endif
7545#ifdef SO_PEERSEC
7546 PyModule_AddIntMacro(m, SO_PEERSEC);
7547#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007548#ifdef SO_BINDTODEVICE
7549 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7550#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007551#ifdef SO_PRIORITY
7552 PyModule_AddIntMacro(m, SO_PRIORITY);
7553#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007554#ifdef SO_MARK
7555 PyModule_AddIntMacro(m, SO_MARK);
7556#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007557#ifdef SO_DOMAIN
7558 PyModule_AddIntMacro(m, SO_DOMAIN);
7559#endif
7560#ifdef SO_PROTOCOL
7561 PyModule_AddIntMacro(m, SO_PROTOCOL);
7562#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564 /* Maximum number of connections for "listen" */
7565#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007567#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007569#endif
7570
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007571 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007572#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007574#endif
7575#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007577#endif
7578#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007580#endif
7581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582 /* Flags for send, recv */
7583#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007592#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007610#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007612#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007613#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007615#endif
7616#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007618#endif
7619#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007621#endif
7622#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007624#endif
7625#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007627#endif
7628#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007630#endif
7631#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007633#endif
7634#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007636#endif
7637#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007639#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007640#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007642#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644 /* Protocol level and numbers, usable for [gs]etsockopt */
7645#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007650#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007670#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007673#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007675#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007676 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007677#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007678#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007680#endif
7681#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7683 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007684#endif
7685#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7687 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7688 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007689
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7691 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7692 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007693#ifdef CAN_ISOTP
7694 PyModule_AddIntMacro(m, CAN_ISOTP);
7695#endif
karl ding360371f2020-04-29 15:31:19 -07007696#ifdef CAN_J1939
7697 PyModule_AddIntMacro(m, CAN_J1939);
7698#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007699#endif
7700#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7702 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7703 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7704 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007705#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007706#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7707 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7708#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007709#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7710 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7711#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007712#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007714
7715 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007716 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7717 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7718 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7719 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7720 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7721 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7722 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7723 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7724 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7725 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7726 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7727 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007728
7729 /* BCM flags */
7730 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7731 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7732 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7733 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7734 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7735 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7736 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7737 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7738 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7739 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7740 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7741#ifdef CAN_FD_FRAME
7742 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7743 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7744#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007745#endif
karl ding360371f2020-04-29 15:31:19 -07007746#ifdef HAVE_LINUX_CAN_J1939_H
7747 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7748 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7749 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7750 PyModule_AddIntMacro(m, J1939_NO_NAME);
7751 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7752 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7753 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7754 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7755 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7756 PyModule_AddIntMacro(m, J1939_NO_PGN);
7757
7758 /* J1939 socket options */
7759 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7760 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7761 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7762 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7763
7764 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7765 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7766 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7767 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7768
7769 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7770 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7771
7772 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7773 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7774
7775 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7776#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007777#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007778 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007779#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007780#ifdef HAVE_SOCKADDR_ALG
7781 PyModule_AddIntMacro(m, SOL_ALG);
7782#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007783#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007784 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007785#endif
7786#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007787 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007788#endif
7789#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007790 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007791#endif
7792#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007793 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007794#endif
7795#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007796 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007797#endif
7798#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007799 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007801#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007803#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007804 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007806#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007809#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007811#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007812 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007814#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007820#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007823#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007824 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007826#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007827 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007829#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007830 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007831#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007832 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007842#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007844#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007845#ifdef IPPROTO_UDPLITE
7846 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7847 #ifndef UDPLITE_SEND_CSCOV
7848 #define UDPLITE_SEND_CSCOV 10
7849 #endif
7850 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7851 #ifndef UDPLITE_RECV_CSCOV
7852 #define UDPLITE_RECV_CSCOV 11
7853 #endif
7854 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007856#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007857 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007859#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007860 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007862#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007863 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007865#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007866 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007868#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007869 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007871#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007872 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007874#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007875 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007877#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007880#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007881 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007883#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007884 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007886#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007887 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007889#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007890 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007892#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007893 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007895#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007896 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007898#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007901#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007902 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007904#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007905 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007907#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007908 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007910#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007911 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007912#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007913#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007914 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007916#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007917 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007918#endif
7919/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007920#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007921 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007922#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007923 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007925#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007926 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007927#endif
7928
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007929#ifdef MS_WINDOWS
7930 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7931 PyModule_AddIntMacro(m, IPPROTO_ST);
7932 PyModule_AddIntMacro(m, IPPROTO_CBT);
7933 PyModule_AddIntMacro(m, IPPROTO_IGP);
7934 PyModule_AddIntMacro(m, IPPROTO_RDP);
7935 PyModule_AddIntMacro(m, IPPROTO_PGM);
7936 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7937 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7938#endif
7939
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007940#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007941 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007942#endif
7943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944 /* Some port configuration */
7945#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007947#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007948 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007950#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007952#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007953 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007954#endif
7955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007956 /* Some reserved IP v.4 addresses */
7957#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007958 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007959#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007960 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007962#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007963 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007964#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007965 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007967#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007968 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007969#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007970 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007972#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007974#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007975 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007977#ifdef INADDR_ALLHOSTS_GROUP
7978 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7979 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007980#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007981 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007983#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007985#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007989 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007990#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007991 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007992#endif
7993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994 /* IPv4 [gs]etsockopt options */
7995#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007996 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007998#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008001#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008002 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008004#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008005 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008007#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008008 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008010#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008013#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008014 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008016#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008017 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008019#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008020 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008022#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008023 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008025#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008026 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008028#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008029 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008031#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008032 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008034#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008035 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008037#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008038 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008040#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008042#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008043#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008044 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008045#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008047 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8048#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008049 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008051#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008052 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008054#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008055 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008057#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008058 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008060#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008061 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008063#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008064 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008066 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008067#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008068 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008070 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008071#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008072 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008073#endif
8074#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008075 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008076#endif
8077#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008078 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008079#endif
8080#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008081 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008082#endif
8083#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008084 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008085#endif
8086#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008087 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008088#endif
8089#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008090 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008091#endif
8092#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008093 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008094#endif
8095#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008096 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008097#endif
8098#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008099 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008100#endif
8101#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008102 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008103#endif
8104#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008105 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008106#endif
8107#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008108 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008109#endif
8110#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008111 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008112#endif
8113#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008114 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008115#endif
8116#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008117 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008118#endif
8119#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008120 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008121#endif
8122#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008123 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008124#endif
8125#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008126 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008127#endif
8128#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008129 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008130#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008132 /* TCP options */
8133#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008136#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008138#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008139#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008142#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008143 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008145#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008146 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008148#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008149 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008151#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008152 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008154#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008155 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008157#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008158 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008160#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008161 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008163#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008166#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008168#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008169#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008171#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008172#ifdef TCP_CONGESTION
8173 PyModule_AddIntMacro(m, TCP_CONGESTION);
8174#endif
8175#ifdef TCP_USER_TIMEOUT
8176 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8177#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008178#ifdef TCP_NOTSENT_LOWAT
8179 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8180#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008182 /* IPX options */
8183#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008184 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008185#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008186
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008187/* Reliable Datagram Sockets */
8188#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008189 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008190#endif
8191#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008192 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008193#endif
8194#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008195 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008196#endif
8197#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008198 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008199#endif
8200#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008201 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008202#endif
8203#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008204 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008205#endif
8206#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008207 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008208#endif
8209#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008210 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008211#endif
8212#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008213 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008214#endif
8215#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008216 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008217#endif
8218#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008219 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008220#endif
8221#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008222 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008223#endif
8224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008225 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008226#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008227 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008228#endif
8229#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008230 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008231#endif
8232#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008233 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008234#endif
8235#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008236 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008237#endif
8238#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008239 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008240#endif
8241#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008242 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008243#endif
8244#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008245 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008246#endif
8247#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008248 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008249#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008250#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008251 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008252#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008253#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008254 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008255#endif
8256#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008257 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008258#endif
8259#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008260 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008261#endif
8262#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008263 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008264#endif
8265#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008266 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008267#endif
8268#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008269 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008270#endif
8271#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008272 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008273#endif
8274#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008275 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008276#endif
8277#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008278 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008279#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008280#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008281 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008282#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008283#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008284 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008285#endif
8286#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008287 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008288#endif
8289#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008290 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008291#endif
8292#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008293 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008294#endif
8295#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008296 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008297#endif
8298#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008299 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008300#endif
8301#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008302 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008303#endif
8304#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008305 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008306#endif
8307#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008308 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008309#endif
8310#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008311 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008312#endif
8313#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008314 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008315#endif
8316#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008317 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008318#endif
8319#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008320 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008321#endif
8322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008323 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008324#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008325 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008326#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008327 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008329 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008330#endif
8331#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008332 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008333#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008334 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008336 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008337#endif
8338#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008339 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008340#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008341 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008342#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008343 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008344#endif
8345
Christian Heimesfaf2f632008-01-06 16:59:19 +00008346#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008347 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008348 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8349#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008350 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008351#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008352 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008353 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8354#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008355 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008356#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008357 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008358 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008359 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008360 PyObject *tmp;
8361 tmp = PyLong_FromUnsignedLong(codes[i]);
8362 if (tmp == NULL)
8363 return NULL;
8364 PyModule_AddObject(m, names[i], tmp);
8365 }
8366 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008367 PyModule_AddIntMacro(m, RCVALL_OFF);
8368 PyModule_AddIntMacro(m, RCVALL_ON);
8369 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008370#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008371 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008372#endif
8373#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008374 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008375#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008376#endif /* _MSTCPIP_ */
8377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008378 /* Initialize gethostbyname lock */
Victor Stinner0de437d2020-05-28 17:23:39 +02008379#if defined(USE_GETHOSTBYNAME_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008380 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008381#endif
animalize19e7d482018-02-27 02:10:36 +08008382
8383#ifdef MS_WINDOWS
8384 /* remove some flags on older version Windows during run-time */
8385 remove_unusable_flags(m);
8386#endif
8387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008388 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008389}