blob: f60a27ebe408c9ad3f15033667bdc384bd40236b [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
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000439#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000440#define EAFNOSUPPORT WSAEAFNOSUPPORT
441#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000442#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000443
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000444#ifndef SOCKETCLOSE
445#define SOCKETCLOSE close
446#endif
447
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000448#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000449#define USE_BLUETOOTH 1
450#if defined(__FreeBSD__)
451#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
452#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000453#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000454#define SOL_HCI SOL_HCI_RAW
455#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000456#define sockaddr_l2 sockaddr_l2cap
457#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000458#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000459#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
460#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000461#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000462#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463#define sockaddr_l2 sockaddr_bt
464#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000465#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000467#define SOL_HCI BTPROTO_HCI
468#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000469#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
470#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000471#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000472#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000473#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000474#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
475#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000476#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000477#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
478#endif
479#endif
480
Greg Bowser8fbece12019-08-02 16:29:52 -0400481#ifdef MS_WINDOWS
482#define sockaddr_rc SOCKADDR_BTH_REDEF
483
484#define USE_BLUETOOTH 1
485#define AF_BLUETOOTH AF_BTH
486#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
487#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
488#endif
489
Charles-François Natali8b759652011-12-23 16:44:51 +0100490/* Convert "sock_addr_t *" to "struct sockaddr *". */
491#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000492
Martin v. Löwise9416172003-05-03 10:12:45 +0000493/*
494 * Constants for getnameinfo()
495 */
496#if !defined(NI_MAXHOST)
497#define NI_MAXHOST 1025
498#endif
499#if !defined(NI_MAXSERV)
500#define NI_MAXSERV 32
501#endif
502
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000503#ifndef INVALID_SOCKET /* MS defines this */
504#define INVALID_SOCKET (-1)
505#endif
506
Charles-François Natali0cc86852013-09-13 19:53:08 +0200507#ifndef INADDR_NONE
508#define INADDR_NONE (-1)
509#endif
510
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000511/* XXX There's a problem here: *static* functions are not supposed to have
512 a Py prefix (or use CapitalizedWords). Later... */
513
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514/* Global variable holding the exception type for errors detected
515 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000516static PyObject *socket_herror;
517static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000518static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519
Tim Peters643a7fc2002-02-17 04:13:21 +0000520/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000521 The sock_type variable contains pointers to various functions,
522 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000523 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000524static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000525
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000526#if defined(HAVE_POLL_H)
527#include <poll.h>
528#elif defined(HAVE_SYS_POLL_H)
529#include <sys/poll.h>
530#endif
531
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000532/* Largest value to try to store in a socklen_t (used when handling
533 ancillary data). POSIX requires socklen_t to hold at least
534 (2**31)-1 and recommends against storing larger values, but
535 socklen_t was originally int in the BSD interface, so to be on the
536 safe side we use the smaller of (2**31)-1 and INT_MAX. */
537#if INT_MAX > 0x7fffffff
538#define SOCKLEN_T_LIMIT 0x7fffffff
539#else
540#define SOCKLEN_T_LIMIT INT_MAX
541#endif
542
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200543#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000544/* Instead of select(), we'll use poll() since poll() works on any fd. */
545#define IS_SELECTABLE(s) 1
546/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000547#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200548/* If there's no timeout left, we don't have to call select, so it's a safe,
549 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100550#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000551#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000552
553static PyObject*
554select_error(void)
555{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200556 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000558}
559
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000560#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000561#ifndef WSAEAGAIN
562#define WSAEAGAIN WSAEWOULDBLOCK
563#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000564#define CHECK_ERRNO(expected) \
565 (WSAGetLastError() == WSA ## expected)
566#else
567#define CHECK_ERRNO(expected) \
568 (errno == expected)
569#endif
570
Victor Stinnerdaf45552013-08-28 00:53:59 +0200571#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200572# define GET_SOCK_ERROR WSAGetLastError()
573# define SET_SOCK_ERROR(err) WSASetLastError(err)
574# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
575# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
576#else
577# define GET_SOCK_ERROR errno
578# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
579# define SOCK_TIMEOUT_ERR EWOULDBLOCK
580# define SOCK_INPROGRESS_ERR EINPROGRESS
581#endif
582
Erik Janssens874809e2018-09-05 08:29:42 +0200583#ifdef _MSC_VER
584# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
585#else
586# define SUPPRESS_DEPRECATED_CALL
587#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200588
589#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200590/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
591static int support_wsa_no_inherit = -1;
592#endif
593
Guido van Rossum30a685f1991-06-27 15:51:29 +0000594/* Convenience function to raise an error according to errno
595 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596
Guido van Rossum73624e91994-10-10 17:59:00 +0000597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000598set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000600#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 int err_no = WSAGetLastError();
602 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
603 recognizes the error codes used by both GetLastError() and
604 WSAGetLastError */
605 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200606 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000607#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000608
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200609 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610}
611
Guido van Rossum30a685f1991-06-27 15:51:29 +0000612
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000614set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617
618#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600619 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 if (v != NULL) {
624 PyErr_SetObject(socket_herror, v);
625 Py_DECREF(v);
626 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629}
630
631
632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000633set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000636
Martin v. Löwis272cb402002-03-01 08:31:07 +0000637#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 /* EAI_SYSTEM is not available on Windows XP. */
639 if (error == EAI_SYSTEM)
640 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000641#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000643#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if (v != NULL) {
649 PyErr_SetObject(socket_gaierror, v);
650 Py_DECREF(v);
651 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000654}
655
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000656/* Function to perform the setting of socket blocking mode
657 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658static int
659internal_setblocking(PySocketSockObject *s, int block)
660{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400661 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200662#ifdef MS_WINDOWS
663 u_long arg;
664#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100665#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100666 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100667 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100672#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200674 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400675 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200678 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400679 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100681 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 else
Victor Stinner9a954832013-12-04 00:41:24 +0100683 new_delay_flag = delay_flag | O_NONBLOCK;
684 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200685 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400686 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100687#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000688#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200689 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200690 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000692#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400693
694 result = 0;
695
696 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Yury Selivanovfa22b292016-10-18 16:03:52 -0400699 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200700#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400701 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200702#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400703 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200704#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400705 }
706
707 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000708}
709
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000710static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200711internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
712 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100715#ifdef HAVE_POLL
716 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200717 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100718#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200719 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200720 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100721#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000722
Victor Stinnerb7df3142015-03-27 22:59:32 +0100723 /* must be called with the GIL held */
724 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100725
Victor Stinner416f2e62015-03-31 13:56:29 +0200726 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200727 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200730 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 /* Prefer poll, if available, since you can poll() any fd
734 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000735#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100736 pollfd.fd = s->sock_fd;
737 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200738 if (connect) {
739 /* On Windows, the socket becomes writable on connection success,
740 but a connection failure is notified as an error. On POSIX, the
741 socket becomes writable on connection success or on connection
742 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200743 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200744 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000745
Victor Stinner71694d52015-03-28 01:18:54 +0100746 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200747 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200748 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000749
Artem Khramov28146202019-08-15 03:21:48 +0600750 /* On some OSes, typically BSD-based ones, the timeout parameter of the
751 poll() syscall, when negative, must be exactly INFTIM, where defined,
752 or -1. See issue 37811. */
753 if (ms < 0) {
754#ifdef INFTIM
755 ms = INFTIM;
756#else
757 ms = -1;
758#endif
759 }
760
Victor Stinner71694d52015-03-28 01:18:54 +0100761 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200762 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100763 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000764#else
Victor Stinnerced11742015-04-09 10:27:25 +0200765 if (interval >= 0) {
766 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
767 tvp = &tv;
768 }
769 else
770 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771
Victor Stinner71694d52015-03-28 01:18:54 +0100772 FD_ZERO(&fds);
773 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200774 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 if (connect) {
776 /* On Windows, the socket becomes writable on connection success,
777 but a connection failure is notified as an error. On POSIX, the
778 socket becomes writable on connection success or on connection
779 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200780 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200781 }
Victor Stinner71694d52015-03-28 01:18:54 +0100782
783 /* See if the socket is ready */
784 Py_BEGIN_ALLOW_THREADS;
785 if (writing)
786 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200787 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100788 else
789 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200790 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100791 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000792#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 if (n < 0)
795 return -1;
796 if (n == 0)
797 return 1;
798 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000799}
800
Victor Stinner31bf2d52015-04-01 21:57:09 +0200801/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000802
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 On error, raise an exception and return -1 if err is set, or fill err and
804 return -1 otherwise. If a signal was received and the signal handler raised
805 an exception, return -1, and set err to -1 if err is set.
806
807 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100808
Victor Stinner31bf2d52015-04-01 21:57:09 +0200809 If the socket has a timeout, wait until the socket is ready before calling
810 the function: wait until the socket is writable if writing is nonzero, wait
811 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100812
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200814 the function, except if the signal handler raised an exception (PEP 475).
815
816 When the function is retried, recompute the timeout using a monotonic clock.
817
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 sock_call_ex() must be called with the GIL held. The socket function is
819 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200821sock_call_ex(PySocketSockObject *s,
822 int writing,
823 int (*sock_func) (PySocketSockObject *s, void *data),
824 void *data,
825 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200826 int *err,
827 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828{
Victor Stinner8912d142015-04-06 23:16:34 +0200829 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830 _PyTime_t deadline = 0;
831 int deadline_initialized = 0;
832 int res;
833
834 /* sock_call() must be called with the GIL held. */
835 assert(PyGILState_Check());
836
837 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 /* For connect(), poll even for blocking socket. The connection
841 runs asynchronously. */
842 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200844 _PyTime_t interval;
845
Victor Stinner81c41db2015-04-02 11:50:57 +0200846 if (deadline_initialized) {
847 /* recompute the timeout */
848 interval = deadline - _PyTime_GetMonotonicClock();
849 }
850 else {
851 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200852 deadline = _PyTime_GetMonotonicClock() + timeout;
853 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200855
Victor Stinner10550cd2015-04-03 13:22:27 +0200856 if (interval >= 0)
857 res = internal_select(s, writing, interval, connect);
858 else
859 res = 1;
860 }
861 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200862 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200863 }
864
Victor Stinner31bf2d52015-04-01 21:57:09 +0200865 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200866 if (err)
867 *err = GET_SOCK_ERROR;
868
Victor Stinner31bf2d52015-04-01 21:57:09 +0200869 if (CHECK_ERRNO(EINTR)) {
870 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200871 if (PyErr_CheckSignals()) {
872 if (err)
873 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200875 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876
877 /* retry select() */
878 continue;
879 }
880
881 /* select() failed */
882 s->errorhandler();
883 return -1;
884 }
885
886 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200887 if (err)
888 *err = SOCK_TIMEOUT_ERR;
889 else
890 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891 return -1;
892 }
893
894 /* the socket is ready */
895 }
896
Victor Stinner81c41db2015-04-02 11:50:57 +0200897 /* inner loop to retry sock_func() when sock_func() is interrupted
898 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200899 while (1) {
900 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200901 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902 Py_END_ALLOW_THREADS
903
904 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200905 /* sock_func() succeeded */
906 if (err)
907 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200908 return 0;
909 }
910
Victor Stinner81c41db2015-04-02 11:50:57 +0200911 if (err)
912 *err = GET_SOCK_ERROR;
913
Victor Stinner31bf2d52015-04-01 21:57:09 +0200914 if (!CHECK_ERRNO(EINTR))
915 break;
916
Victor Stinner81c41db2015-04-02 11:50:57 +0200917 /* sock_func() was interrupted by a signal */
918 if (PyErr_CheckSignals()) {
919 if (err)
920 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200921 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200922 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200923
Victor Stinner81c41db2015-04-02 11:50:57 +0200924 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200925 }
926
927 if (s->sock_timeout > 0
928 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200929 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200930
931 For example, select() could indicate a socket is ready for
932 reading, but the data then discarded by the OS because of a
933 wrong checksum.
934
935 Loop on select() to recheck for socket readyness. */
936 continue;
937 }
938
Victor Stinner81c41db2015-04-02 11:50:57 +0200939 /* sock_func() failed */
940 if (!err)
941 s->errorhandler();
942 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000943 return -1;
944 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200945}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000946
Victor Stinner81c41db2015-04-02 11:50:57 +0200947static int
948sock_call(PySocketSockObject *s,
949 int writing,
950 int (*func) (PySocketSockObject *s, void *data),
951 void *data)
952{
Victor Stinner8912d142015-04-06 23:16:34 +0200953 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200954}
955
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000956
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000957/* Initialize a new socket object. */
958
Victor Stinner88ed6402015-04-09 10:23:12 +0200959/* Default timeout for new sockets */
960static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000961
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200962static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000963init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 s->sock_fd = fd;
967 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500970
971 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
972 on some OSes as part of socket.type. We want to reset them here,
973 to make socket.type be set to the same value on all platforms.
974 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
975 not portable.
976 */
977#ifdef SOCK_NONBLOCK
978 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
979#endif
980#ifdef SOCK_CLOEXEC
981 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
982#endif
983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000987#ifdef SOCK_NONBLOCK
988 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100989 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000990 else
991#endif
992 {
993 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200994 if (defaulttimeout >= 0) {
995 if (internal_setblocking(s, 0) == -1) {
996 return -1;
997 }
998 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000999 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001000 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001001}
1002
1003
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004/* Create a new socket object.
1005 This just creates the object and initializes it.
1006 If the creation fails, return NULL and set an exception (implicit
1007 in NEWOBJ()). */
1008
Guido van Rossum73624e91994-10-10 17:59:00 +00001009static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001010new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 PySocketSockObject *s;
1013 s = (PySocketSockObject *)
1014 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001015 if (s == NULL)
1016 return NULL;
1017 if (init_sockobject(s, fd, family, type, proto) == -1) {
1018 Py_DECREF(s);
1019 return NULL;
1020 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001022}
1023
Guido van Rossum30a685f1991-06-27 15:51:29 +00001024
Guido van Rossum48a680c2001-03-02 06:34:14 +00001025/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001026 thread to be in gethostbyname or getaddrinfo */
Victor Stinner0de437d2020-05-28 17:23:39 +02001027#if defined(USE_GETHOSTBYNAME_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001028static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001029#endif
1030
1031
Guido van Rossum30a685f1991-06-27 15:51:29 +00001032/* Convert a string specifying a host name or one of a few symbolic
1033 names to a numeric IP address. This usually calls gethostbyname()
1034 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001035 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036 an error occurred; then an exception is raised. */
1037
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001039setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 struct addrinfo hints, *res;
1042 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1045 if (name[0] == '\0') {
1046 int siz;
1047 memset(&hints, 0, sizeof(hints));
1048 hints.ai_family = af;
1049 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1050 hints.ai_flags = AI_PASSIVE;
1051 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 error = getaddrinfo(NULL, "0", &hints, &res);
1053 Py_END_ALLOW_THREADS
1054 /* We assume that those thread-unsafe getaddrinfo() versions
1055 *are* safe regarding their return value, ie. that a
1056 subsequent call to getaddrinfo() does not destroy the
1057 outcome of the first call. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (error) {
1059 set_gaierror(error);
1060 return -1;
1061 }
1062 switch (res->ai_family) {
1063 case AF_INET:
1064 siz = 4;
1065 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001066#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case AF_INET6:
1068 siz = 16;
1069 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 default:
1072 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001073 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 "unsupported address family");
1075 return -1;
1076 }
1077 if (res->ai_next) {
1078 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001079 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 "wildcard resolved to multiple address");
1081 return -1;
1082 }
1083 if (res->ai_addrlen < addr_ret_size)
1084 addr_ret_size = res->ai_addrlen;
1085 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1086 freeaddrinfo(res);
1087 return siz;
1088 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001089 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001090 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001091 if (strcmp(name, "255.255.255.255") == 0 ||
1092 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 struct sockaddr_in *sin;
1094 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001095 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 "address family mismatched");
1097 return -1;
1098 }
1099 sin = (struct sockaddr_in *)addr_ret;
1100 memset((void *) sin, '\0', sizeof(*sin));
1101 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001102#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 sin->sin_addr.s_addr = INADDR_BROADCAST;
1106 return sizeof(sin->sin_addr);
1107 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001108
1109 /* avoid a name resolution in case of numeric address */
1110#ifdef HAVE_INET_PTON
1111 /* check for an IPv4 address */
1112 if (af == AF_UNSPEC || af == AF_INET) {
1113 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1114 memset(sin, 0, sizeof(*sin));
1115 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1116 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001117#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001118 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001119#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001120 return 4;
1121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001123#ifdef ENABLE_IPV6
1124 /* check for an IPv6 address - if the address contains a scope ID, we
1125 * fallback to getaddrinfo(), which can handle translation from interface
1126 * name to interface index */
1127 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1128 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1129 memset(sin, 0, sizeof(*sin));
1130 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1131 sin->sin6_family = AF_INET6;
1132#ifdef HAVE_SOCKADDR_SA_LEN
1133 sin->sin6_len = sizeof(*sin);
1134#endif
1135 return 16;
1136 }
1137 }
1138#endif /* ENABLE_IPV6 */
1139#else /* HAVE_INET_PTON */
1140 /* check for an IPv4 address */
1141 if (af == AF_INET || af == AF_UNSPEC) {
1142 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1143 memset(sin, 0, sizeof(*sin));
1144 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1145 sin->sin_family = AF_INET;
1146#ifdef HAVE_SOCKADDR_SA_LEN
1147 sin->sin_len = sizeof(*sin);
1148#endif
1149 return 4;
1150 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001151 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001152#endif /* HAVE_INET_PTON */
1153
1154 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 memset(&hints, 0, sizeof(hints));
1156 hints.ai_family = af;
1157 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001159#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (error == EAI_NONAME && af == AF_UNSPEC) {
1161 /* On Tru64 V5.1, numeric-to-addr conversion fails
1162 if no address family is given. Assume IPv4 for now.*/
1163 hints.ai_family = AF_INET;
1164 error = getaddrinfo(name, NULL, &hints, &res);
1165 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 if (error) {
1169 set_gaierror(error);
1170 return -1;
1171 }
1172 if (res->ai_addrlen < addr_ret_size)
1173 addr_ret_size = res->ai_addrlen;
1174 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1175 freeaddrinfo(res);
1176 switch (addr_ret->sa_family) {
1177 case AF_INET:
1178 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001179#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case AF_INET6:
1181 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001184 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 return -1;
1186 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001187}
1188
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189
Коренберг Марк7766b962018-02-13 00:47:42 +05001190/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191
Guido van Rossum73624e91994-10-10 17:59:00 +00001192static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001193make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001194{
Коренберг Марк7766b962018-02-13 00:47:42 +05001195 char buf[INET_ADDRSTRLEN];
1196 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1197 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 return NULL;
1199 }
1200 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201}
1202
Коренберг Марк7766b962018-02-13 00:47:42 +05001203#ifdef ENABLE_IPV6
1204/* Convert IPv6 sockaddr to a Python str. */
1205
1206static PyObject *
1207make_ipv6_addr(const struct sockaddr_in6 *addr)
1208{
1209 char buf[INET6_ADDRSTRLEN];
1210 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1211 PyErr_SetFromErrno(PyExc_OSError);
1212 return NULL;
1213 }
1214 return PyUnicode_FromString(buf);
1215}
1216#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001218#ifdef USE_BLUETOOTH
1219/* Convert a string representation of a Bluetooth address into a numeric
1220 address. Returns the length (6), or raises an exception and returns -1 if
1221 an error occurred. */
1222
1223static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001224setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 unsigned int b0, b1, b2, b3, b4, b5;
1227 char ch;
1228 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1231 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1232 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001233
1234#ifdef MS_WINDOWS
1235 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1236 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1237 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1238 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1239 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1240 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1241#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 bdaddr->b[0] = b0;
1243 bdaddr->b[1] = b1;
1244 bdaddr->b[2] = b2;
1245 bdaddr->b[3] = b3;
1246 bdaddr->b[4] = b4;
1247 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001248#endif
1249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 return 6;
1251 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001252 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 return -1;
1254 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255}
1256
1257/* Create a string representation of the Bluetooth address. This is always a
1258 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1259 value (zero padded if necessary). */
1260
1261static PyObject *
1262makebdaddr(bdaddr_t *bdaddr)
1263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001265
Greg Bowser8fbece12019-08-02 16:29:52 -04001266#ifdef MS_WINDOWS
1267 int i;
1268 unsigned int octets[6];
1269
1270 for (i = 0; i < 6; ++i) {
1271 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1272 }
1273
1274 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1275 octets[5], octets[4], octets[3],
1276 octets[2], octets[1], octets[0]);
1277#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1279 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1280 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001281#endif
1282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001284}
1285#endif
1286
1287
Guido van Rossum30a685f1991-06-27 15:51:29 +00001288/* Create an object representing the given socket address,
1289 suitable for passing it back to bind(), connect() etc.
1290 The family field of the sockaddr structure is inspected
1291 to determine what kind of address it really is. */
1292
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001293/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001294static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001295makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 if (addrlen == 0) {
1298 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001299 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 case AF_INET:
1305 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001306 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1307 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyObject *ret = NULL;
1309 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1311 Py_DECREF(addrobj);
1312 }
1313 return ret;
1314 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001315
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001316#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 case AF_UNIX:
1318 {
1319 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001320#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001321 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1322 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1323 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 }
1325 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001326#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 {
1328 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001329 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 }
1331 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001332#endif /* AF_UNIX */
1333
Martin v. Löwis11017b12006-01-14 18:12:57 +00001334#if defined(AF_NETLINK)
1335 case AF_NETLINK:
1336 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1338 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001339 }
1340#endif /* AF_NETLINK */
1341
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001342#if defined(AF_QIPCRTR)
1343 case AF_QIPCRTR:
1344 {
1345 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1346 return Py_BuildValue("II", a->sq_node, a->sq_port);
1347 }
1348#endif /* AF_QIPCRTR */
1349
caaveryeffc12f2017-09-06 18:18:10 -04001350#if defined(AF_VSOCK)
1351 case AF_VSOCK:
1352 {
1353 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1354 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1355 }
1356#endif /* AF_VSOCK */
1357
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001358#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 case AF_INET6:
1360 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001361 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1362 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 PyObject *ret = NULL;
1364 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001365 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 addrobj,
1367 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001368 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 a->sin6_scope_id);
1370 Py_DECREF(addrobj);
1371 }
1372 return ret;
1373 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001374#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001375
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001376#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 case AF_BLUETOOTH:
1378 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001379
Greg Bowser8fbece12019-08-02 16:29:52 -04001380#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 case BTPROTO_L2CAP:
1382 {
1383 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1384 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1385 PyObject *ret = NULL;
1386 if (addrobj) {
1387 ret = Py_BuildValue("Oi",
1388 addrobj,
1389 _BT_L2_MEMB(a, psm));
1390 Py_DECREF(addrobj);
1391 }
1392 return ret;
1393 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001394
Greg Bowser8fbece12019-08-02 16:29:52 -04001395#endif /* BTPROTO_L2CAP */
1396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 case BTPROTO_RFCOMM:
1398 {
1399 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1400 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1401 PyObject *ret = NULL;
1402 if (addrobj) {
1403 ret = Py_BuildValue("Oi",
1404 addrobj,
1405 _BT_RC_MEMB(a, channel));
1406 Py_DECREF(addrobj);
1407 }
1408 return ret;
1409 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001410
Greg Bowser8fbece12019-08-02 16:29:52 -04001411#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 case BTPROTO_HCI:
1413 {
1414 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001415#if defined(__NetBSD__) || defined(__DragonFly__)
1416 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001417#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 PyObject *ret = NULL;
1419 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1420 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001421#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001423
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001424#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 case BTPROTO_SCO:
1426 {
1427 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1428 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1429 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001430#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001431#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 default:
1434 PyErr_SetString(PyExc_ValueError,
1435 "Unknown Bluetooth protocol");
1436 return NULL;
1437 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001438#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001439
Antoine Pitroub156a462010-10-27 20:13:57 +00001440#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 case AF_PACKET:
1442 {
1443 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001444 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 struct ifreq ifr;
1446 /* need to look up interface name give index */
1447 if (a->sll_ifindex) {
1448 ifr.ifr_ifindex = a->sll_ifindex;
1449 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1450 ifname = ifr.ifr_name;
1451 }
1452 return Py_BuildValue("shbhy#",
1453 ifname,
1454 ntohs(a->sll_protocol),
1455 a->sll_pkttype,
1456 a->sll_hatype,
1457 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001458 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001460#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001461
Christian Heimes043d6f62008-01-07 17:19:16 +00001462#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 case AF_TIPC:
1464 {
1465 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1466 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1467 return Py_BuildValue("IIIII",
1468 a->addrtype,
1469 a->addr.nameseq.type,
1470 a->addr.nameseq.lower,
1471 a->addr.nameseq.upper,
1472 a->scope);
1473 } else if (a->addrtype == TIPC_ADDR_NAME) {
1474 return Py_BuildValue("IIIII",
1475 a->addrtype,
1476 a->addr.name.name.type,
1477 a->addr.name.name.instance,
1478 a->addr.name.name.instance,
1479 a->scope);
1480 } else if (a->addrtype == TIPC_ADDR_ID) {
1481 return Py_BuildValue("IIIII",
1482 a->addrtype,
1483 a->addr.id.node,
1484 a->addr.id.ref,
1485 0,
1486 a->scope);
1487 } else {
1488 PyErr_SetString(PyExc_ValueError,
1489 "Invalid address type");
1490 return NULL;
1491 }
1492 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001493#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001494
Serhiy Storchakad3187152017-11-09 18:00:38 +02001495#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001496 case AF_CAN:
1497 {
1498 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001499 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001500 struct ifreq ifr;
1501 /* need to look up interface name given index */
1502 if (a->can_ifindex) {
1503 ifr.ifr_ifindex = a->can_ifindex;
1504 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1505 ifname = ifr.ifr_name;
1506 }
1507
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001508 switch (proto) {
1509#ifdef CAN_ISOTP
1510 case CAN_ISOTP:
1511 {
1512 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1513 ifname,
1514 a->can_addr.tp.rx_id,
1515 a->can_addr.tp.tx_id);
1516 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001517#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07001518#ifdef CAN_J1939
1519 case CAN_J1939:
1520 {
1521 return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1522 ifname,
1523 a->can_addr.j1939.name,
1524 a->can_addr.j1939.pgn,
1525 a->can_addr.j1939.addr);
1526 }
1527#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001528 default:
1529 {
bggardner954900a2019-09-12 06:02:48 -04001530 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001531 ifname);
1532 }
1533 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001534 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001535#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001536
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001537#ifdef PF_SYSTEM
1538 case PF_SYSTEM:
1539 switch(proto) {
1540#ifdef SYSPROTO_CONTROL
1541 case SYSPROTO_CONTROL:
1542 {
1543 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1544 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1545 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001546#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001547 default:
1548 PyErr_SetString(PyExc_ValueError,
1549 "Invalid address type");
1550 return 0;
1551 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001552#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001553
Christian Heimesdffa3942016-09-05 23:54:41 +02001554#ifdef HAVE_SOCKADDR_ALG
1555 case AF_ALG:
1556 {
1557 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1558 return Py_BuildValue("s#s#HH",
1559 a->salg_type,
1560 strnlen((const char*)a->salg_type,
1561 sizeof(a->salg_type)),
1562 a->salg_name,
1563 strnlen((const char*)a->salg_name,
1564 sizeof(a->salg_name)),
1565 a->salg_feat,
1566 a->salg_mask);
1567 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001568#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 default:
1573 /* If we don't know the address family, don't raise an
1574 exception -- return it as an (int, bytes) tuple. */
1575 return Py_BuildValue("iy#",
1576 addr->sa_family,
1577 addr->sa_data,
1578 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581}
1582
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001583/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1584 (in particular, numeric IP addresses). */
1585struct maybe_idna {
1586 PyObject *obj;
1587 char *buf;
1588};
1589
1590static void
1591idna_cleanup(struct maybe_idna *data)
1592{
1593 Py_CLEAR(data->obj);
1594}
1595
1596static int
1597idna_converter(PyObject *obj, struct maybe_idna *data)
1598{
1599 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001600 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001601 if (obj == NULL) {
1602 idna_cleanup(data);
1603 return 1;
1604 }
1605 data->obj = NULL;
1606 len = -1;
1607 if (PyBytes_Check(obj)) {
1608 data->buf = PyBytes_AsString(obj);
1609 len = PyBytes_Size(obj);
1610 }
1611 else if (PyByteArray_Check(obj)) {
1612 data->buf = PyByteArray_AsString(obj);
1613 len = PyByteArray_Size(obj);
1614 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001615 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001616 if (PyUnicode_READY(obj) == -1) {
1617 return 0;
1618 }
1619 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001620 data->buf = PyUnicode_DATA(obj);
1621 len = PyUnicode_GET_LENGTH(obj);
1622 }
1623 else {
1624 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1625 if (!obj2) {
1626 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1627 return 0;
1628 }
1629 assert(PyBytes_Check(obj2));
1630 data->obj = obj2;
1631 data->buf = PyBytes_AS_STRING(obj2);
1632 len = PyBytes_GET_SIZE(obj2);
1633 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 }
1635 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001636 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001637 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001638 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 }
1640 if (strlen(data->buf) != len) {
1641 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001642 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001643 return 0;
1644 }
1645 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001646}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001647
1648/* Parse a socket address argument according to the socket object's
1649 address family. Return 1 if the address was in the proper format,
1650 0 of not. The address is returned through addr_ret, its length
1651 through len_ret. */
1652
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001654getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001655 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001658
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001659#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 case AF_UNIX:
1661 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001662 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001663 int retval = 0;
1664
1665 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1666 allow embedded nulls on Linux. */
1667 if (PyUnicode_Check(args)) {
1668 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1669 return 0;
1670 }
1671 else
1672 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001673 if (!PyArg_Parse(args, "y*", &path)) {
1674 Py_DECREF(args);
1675 return retval;
1676 }
1677 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001678
Victor Stinnerd565fb92019-10-10 21:30:20 +02001679 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001680#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001681 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001683 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001684 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001686 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 }
1688 }
1689 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 {
1692 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001693 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001694 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001696 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001698 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 }
1700 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001701 memcpy(addr->sun_path, path.buf, path.len);
1702 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001703 retval = 1;
1704 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001705 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001706 Py_DECREF(args);
1707 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001709#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001710
Martin v. Löwis11017b12006-01-14 18:12:57 +00001711#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 case AF_NETLINK:
1713 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001715 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 if (!PyTuple_Check(args)) {
1717 PyErr_Format(
1718 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001719 "%s(): AF_NETLINK address must be tuple, not %.500s",
1720 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 return 0;
1722 }
Oren Milman735171e2018-09-11 19:51:29 +03001723 if (!PyArg_ParseTuple(args,
1724 "II;AF_NETLINK address must be a pair "
1725 "(pid, groups)",
1726 &pid, &groups))
1727 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 addr->nl_family = AF_NETLINK;
1731 addr->nl_pid = pid;
1732 addr->nl_groups = groups;
1733 *len_ret = sizeof(*addr);
1734 return 1;
1735 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001736#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001737
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001738#if defined(AF_QIPCRTR)
1739 case AF_QIPCRTR:
1740 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001741 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001742 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001743 if (!PyTuple_Check(args)) {
1744 PyErr_Format(
1745 PyExc_TypeError,
1746 "getsockaddrarg: "
1747 "AF_QIPCRTR address must be tuple, not %.500s",
1748 Py_TYPE(args)->tp_name);
1749 return 0;
1750 }
1751 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1752 return 0;
1753 addr->sq_family = AF_QIPCRTR;
1754 addr->sq_node = node;
1755 addr->sq_port = port;
1756 *len_ret = sizeof(*addr);
1757 return 1;
1758 }
1759#endif /* AF_QIPCRTR */
1760
caaveryeffc12f2017-09-06 18:18:10 -04001761#if defined(AF_VSOCK)
1762 case AF_VSOCK:
1763 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001764 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001765 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001766 memset(addr, 0, sizeof(struct sockaddr_vm));
1767 if (!PyTuple_Check(args)) {
1768 PyErr_Format(
1769 PyExc_TypeError,
1770 "getsockaddrarg: "
1771 "AF_VSOCK address must be tuple, not %.500s",
1772 Py_TYPE(args)->tp_name);
1773 return 0;
1774 }
1775 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1776 return 0;
1777 addr->svm_family = s->sock_family;
1778 addr->svm_port = port;
1779 addr->svm_cid = cid;
1780 *len_ret = sizeof(*addr);
1781 return 1;
1782 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001783#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001784
1785
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001786#ifdef AF_RDS
1787 case AF_RDS:
1788 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001789#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 case AF_INET:
1792 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001793 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 int port, result;
1795 if (!PyTuple_Check(args)) {
1796 PyErr_Format(
1797 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001798 "%s(): AF_INET address must be tuple, not %.500s",
1799 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return 0;
1801 }
Oren Milman735171e2018-09-11 19:51:29 +03001802 if (!PyArg_ParseTuple(args,
1803 "O&i;AF_INET address must be a pair "
1804 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001805 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001806 {
1807 assert(PyErr_Occurred());
1808 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1809 PyErr_Format(PyExc_OverflowError,
1810 "%s(): port must be 0-65535.", caller);
1811 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001813 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001814 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001815 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001817 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 if (result < 0)
1819 return 0;
1820 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001821 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001823 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 return 0;
1825 }
1826 addr->sin_family = AF_INET;
1827 addr->sin_port = htons((short)port);
1828 *len_ret = sizeof *addr;
1829 return 1;
1830 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001831
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001832#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 case AF_INET6:
1834 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001835 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001836 int port, result;
1837 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 flowinfo = scope_id = 0;
1839 if (!PyTuple_Check(args)) {
1840 PyErr_Format(
1841 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001842 "%s(): AF_INET6 address must be tuple, not %.500s",
1843 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return 0;
1845 }
Oren Milman735171e2018-09-11 19:51:29 +03001846 if (!PyArg_ParseTuple(args,
1847 "O&i|II;AF_INET6 address must be a tuple "
1848 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001849 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001850 &scope_id))
1851 {
1852 assert(PyErr_Occurred());
1853 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1854 PyErr_Format(PyExc_OverflowError,
1855 "%s(): port must be 0-65535.", caller);
1856 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return 0;
1858 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001859 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001860 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001862 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 if (result < 0)
1864 return 0;
1865 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001866 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001868 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 return 0;
1870 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001871 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001872 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001873 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001874 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001875 return 0;
1876 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 addr->sin6_family = s->sock_family;
1878 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001879 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 addr->sin6_scope_id = scope_id;
1881 *len_ret = sizeof *addr;
1882 return 1;
1883 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001884#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001885
Hye-Shik Chang81268602004-02-02 06:05:24 +00001886#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 case AF_BLUETOOTH:
1888 {
1889 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001890#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 case BTPROTO_L2CAP:
1892 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001893 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001894
Victor Stinnerd565fb92019-10-10 21:30:20 +02001895 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 memset(addr, 0, sizeof(struct sockaddr_l2));
1897 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1898 if (!PyArg_ParseTuple(args, "si", &straddr,
1899 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001900 PyErr_Format(PyExc_OSError,
1901 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 return 0;
1903 }
1904 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1905 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 *len_ret = sizeof *addr;
1908 return 1;
1909 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001910#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 case BTPROTO_RFCOMM:
1912 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001913 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001914 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1916 if (!PyArg_ParseTuple(args, "si", &straddr,
1917 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001918 PyErr_Format(PyExc_OSError,
1919 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 return 0;
1921 }
1922 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1923 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 *len_ret = sizeof *addr;
1926 return 1;
1927 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001928#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 case BTPROTO_HCI:
1930 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001931 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001932#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001933 const char *straddr;
1934 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1935 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001936 PyErr_Format(PyExc_OSError, "%s: "
1937 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001938 return 0;
1939 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001940 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001941 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1942 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001943#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1945 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001946 PyErr_Format(PyExc_OSError,
1947 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return 0;
1949 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001950#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 *len_ret = sizeof *addr;
1952 return 1;
1953 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001954#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 case BTPROTO_SCO:
1956 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001957 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001958
Victor Stinnerd565fb92019-10-10 21:30:20 +02001959 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1961 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001962 PyErr_Format(PyExc_OSError,
1963 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 return 0;
1965 }
1966 straddr = PyBytes_AS_STRING(args);
1967 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1968 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 *len_ret = sizeof *addr;
1971 return 1;
1972 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001973#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001974#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 default:
Oren Milman735171e2018-09-11 19:51:29 +03001976 PyErr_Format(PyExc_OSError,
1977 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 return 0;
1979 }
1980 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001981#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001982
Antoine Pitroub156a462010-10-27 20:13:57 +00001983#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 case AF_PACKET:
1985 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001987 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 int protoNumber;
1989 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001990 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001991 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 if (!PyTuple_Check(args)) {
1994 PyErr_Format(
1995 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001996 "%s(): AF_PACKET address must be tuple, not %.500s",
1997 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 return 0;
1999 }
Oren Milman735171e2018-09-11 19:51:29 +03002000 /* XXX: improve the default error message according to the
2001 documentation of AF_PACKET, which would be added as part
2002 of bpo-25041. */
2003 if (!PyArg_ParseTuple(args,
2004 "si|iiy*;AF_PACKET address must be a tuple of "
2005 "two to five elements",
2006 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002007 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002008 {
2009 assert(PyErr_Occurred());
2010 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2011 PyErr_Format(PyExc_OverflowError,
2012 "%s(): address argument out of range", caller);
2013 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002015 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2017 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2018 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2019 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002020 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 return 0;
2022 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002023 if (haddr.buf && haddr.len > 8) {
2024 PyErr_SetString(PyExc_ValueError,
2025 "Hardware address must be 8 bytes or less");
2026 PyBuffer_Release(&haddr);
2027 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 }
2029 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002030 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002032 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002033 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 return 0;
2035 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002036 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 addr->sll_family = AF_PACKET;
2038 addr->sll_protocol = htons((short)protoNumber);
2039 addr->sll_ifindex = ifr.ifr_ifindex;
2040 addr->sll_pkttype = pkttype;
2041 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002042 if (haddr.buf) {
2043 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2044 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002046 else
2047 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002049 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 return 1;
2051 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002052#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002053
Christian Heimes043d6f62008-01-07 17:19:16 +00002054#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 case AF_TIPC:
2056 {
2057 unsigned int atype, v1, v2, v3;
2058 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (!PyTuple_Check(args)) {
2061 PyErr_Format(
2062 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002063 "%s(): AF_TIPC address must be tuple, not %.500s",
2064 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return 0;
2066 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002069 "IIII|I;AF_TIPC address must be a tuple "
2070 "(addr_type, v1, v2, v3[, scope])",
2071 &atype, &v1, &v2, &v3, &scope))
2072 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002074 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002075
Victor Stinnerd565fb92019-10-10 21:30:20 +02002076 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 addr->family = AF_TIPC;
2080 addr->scope = scope;
2081 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 if (atype == TIPC_ADDR_NAMESEQ) {
2084 addr->addr.nameseq.type = v1;
2085 addr->addr.nameseq.lower = v2;
2086 addr->addr.nameseq.upper = v3;
2087 } else if (atype == TIPC_ADDR_NAME) {
2088 addr->addr.name.name.type = v1;
2089 addr->addr.name.name.instance = v2;
2090 } else if (atype == TIPC_ADDR_ID) {
2091 addr->addr.id.node = v1;
2092 addr->addr.id.ref = v2;
2093 } else {
2094 /* Shouldn't happen */
2095 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2096 return 0;
2097 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 return 1;
2102 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002103#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002104
Serhiy Storchakad3187152017-11-09 18:00:38 +02002105#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002106 case AF_CAN:
2107 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002108#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002109 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002110 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002111#endif
2112#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002113 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002114#endif
2115#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002116 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002117 PyObject *interfaceName;
2118 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002119 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002120 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002121
Oren Milman735171e2018-09-11 19:51:29 +03002122 if (!PyTuple_Check(args)) {
2123 PyErr_Format(PyExc_TypeError,
2124 "%s(): AF_CAN address must be tuple, not %.500s",
2125 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002126 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002127 }
2128 if (!PyArg_ParseTuple(args,
2129 "O&;AF_CAN address must be a tuple "
2130 "(interface, )",
2131 PyUnicode_FSConverter, &interfaceName))
2132 {
2133 return 0;
2134 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002135
2136 len = PyBytes_GET_SIZE(interfaceName);
2137
2138 if (len == 0) {
2139 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002140 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002141 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2142 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002143 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2144 s->errorhandler();
2145 Py_DECREF(interfaceName);
2146 return 0;
2147 }
2148 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002149 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002150 "AF_CAN interface name too long");
2151 Py_DECREF(interfaceName);
2152 return 0;
2153 }
2154
2155 addr->can_family = AF_CAN;
2156 addr->can_ifindex = ifr.ifr_ifindex;
2157
2158 *len_ret = sizeof(*addr);
2159 Py_DECREF(interfaceName);
2160 return 1;
2161 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002162#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002163
2164#ifdef CAN_ISOTP
2165 case CAN_ISOTP:
2166 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002167 PyObject *interfaceName;
2168 struct ifreq ifr;
2169 Py_ssize_t len;
2170 unsigned long int rx_id, tx_id;
2171
Victor Stinnerd565fb92019-10-10 21:30:20 +02002172 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002173
2174 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2175 &interfaceName,
2176 &rx_id,
2177 &tx_id))
2178 return 0;
2179
2180 len = PyBytes_GET_SIZE(interfaceName);
2181
2182 if (len == 0) {
2183 ifr.ifr_ifindex = 0;
2184 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2185 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2186 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2187 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2188 s->errorhandler();
2189 Py_DECREF(interfaceName);
2190 return 0;
2191 }
2192 } else {
2193 PyErr_SetString(PyExc_OSError,
2194 "AF_CAN interface name too long");
2195 Py_DECREF(interfaceName);
2196 return 0;
2197 }
2198
2199 addr->can_family = AF_CAN;
2200 addr->can_ifindex = ifr.ifr_ifindex;
2201 addr->can_addr.tp.rx_id = rx_id;
2202 addr->can_addr.tp.tx_id = tx_id;
2203
2204 *len_ret = sizeof(*addr);
2205 Py_DECREF(interfaceName);
2206 return 1;
2207 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002208#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002209#ifdef CAN_J1939
2210 case CAN_J1939:
2211 {
2212 PyObject *interfaceName;
2213 struct ifreq ifr;
2214 Py_ssize_t len;
2215 uint64_t j1939_name;
2216 uint32_t j1939_pgn;
2217 uint8_t j1939_addr;
2218
2219 struct sockaddr_can *addr = &addrbuf->can;
2220
2221 if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2222 &interfaceName,
2223 &j1939_name,
2224 &j1939_pgn,
2225 &j1939_addr))
2226 return 0;
2227
2228 len = PyBytes_GET_SIZE(interfaceName);
2229
2230 if (len == 0) {
2231 ifr.ifr_ifindex = 0;
2232 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2233 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2234 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2235 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2236 s->errorhandler();
2237 Py_DECREF(interfaceName);
2238 return 0;
2239 }
2240 } else {
2241 PyErr_SetString(PyExc_OSError,
2242 "AF_CAN interface name too long");
2243 Py_DECREF(interfaceName);
2244 return 0;
2245 }
2246
2247 addr->can_family = AF_CAN;
2248 addr->can_ifindex = ifr.ifr_ifindex;
2249 addr->can_addr.j1939.name = j1939_name;
2250 addr->can_addr.j1939.pgn = j1939_pgn;
2251 addr->can_addr.j1939.addr = j1939_addr;
2252
2253 *len_ret = sizeof(*addr);
2254 Py_DECREF(interfaceName);
2255 return 1;
2256 }
2257#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002258 default:
Oren Milman735171e2018-09-11 19:51:29 +03002259 PyErr_Format(PyExc_OSError,
2260 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002261 return 0;
2262 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002263#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002264
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002265#ifdef PF_SYSTEM
2266 case PF_SYSTEM:
2267 switch (s->sock_proto) {
2268#ifdef SYSPROTO_CONTROL
2269 case SYSPROTO_CONTROL:
2270 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002271 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002272 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002273 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002274
2275 if (PyUnicode_Check(args)) {
2276 struct ctl_info info;
2277 PyObject *ctl_name;
2278
2279 if (!PyArg_Parse(args, "O&",
2280 PyUnicode_FSConverter, &ctl_name)) {
2281 return 0;
2282 }
2283
Victor Stinnerf50e1872015-03-20 11:32:24 +01002284 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002285 PyErr_SetString(PyExc_ValueError,
2286 "provided string is too long");
2287 Py_DECREF(ctl_name);
2288 return 0;
2289 }
2290 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2291 sizeof(info.ctl_name));
2292 Py_DECREF(ctl_name);
2293
2294 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2295 PyErr_SetString(PyExc_OSError,
2296 "cannot find kernel control with provided name");
2297 return 0;
2298 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002299
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002300 addr->sc_id = info.ctl_id;
2301 addr->sc_unit = 0;
2302 } else if (!PyArg_ParseTuple(args, "II",
2303 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002304 PyErr_Format(PyExc_TypeError,
2305 "%s(): PF_SYSTEM address must be a str or "
2306 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002307 return 0;
2308 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002309
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002310 *len_ret = sizeof(*addr);
2311 return 1;
2312 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002313#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002314 default:
Oren Milman735171e2018-09-11 19:51:29 +03002315 PyErr_Format(PyExc_OSError,
2316 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002317 return 0;
2318 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002319#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002320#ifdef HAVE_SOCKADDR_ALG
2321 case AF_ALG:
2322 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002323 const char *type;
2324 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002325 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002326
2327 memset(sa, 0, sizeof(*sa));
2328 sa->salg_family = AF_ALG;
2329
Oren Milman735171e2018-09-11 19:51:29 +03002330 if (!PyTuple_Check(args)) {
2331 PyErr_Format(PyExc_TypeError,
2332 "%s(): AF_ALG address must be tuple, not %.500s",
2333 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002334 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002335 }
2336 if (!PyArg_ParseTuple(args,
2337 "ss|HH;AF_ALG address must be a tuple "
2338 "(type, name[, feat[, mask]])",
2339 &type, &name, &sa->salg_feat, &sa->salg_mask))
2340 {
2341 return 0;
2342 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002343 /* sockaddr_alg has fixed-sized char arrays for type, and name
2344 * both must be NULL terminated.
2345 */
2346 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002347 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2348 return 0;
2349 }
2350 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002351 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002352 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2353 return 0;
2354 }
2355 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2356
2357 *len_ret = sizeof(*sa);
2358 return 1;
2359 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002360#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 default:
Oren Milman735171e2018-09-11 19:51:29 +03002365 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002369}
2370
Guido van Rossum30a685f1991-06-27 15:51:29 +00002371
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002373 Return 1 if the family is known, 0 otherwise. The length is returned
2374 through len_ret. */
2375
2376static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002377getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002380
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002381#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 case AF_UNIX:
2383 {
2384 *len_ret = sizeof (struct sockaddr_un);
2385 return 1;
2386 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002387#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002388
Martin v. Löwis11017b12006-01-14 18:12:57 +00002389#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002390 case AF_NETLINK:
2391 {
2392 *len_ret = sizeof (struct sockaddr_nl);
2393 return 1;
2394 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002395#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002396
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002397#if defined(AF_QIPCRTR)
2398 case AF_QIPCRTR:
2399 {
2400 *len_ret = sizeof (struct sockaddr_qrtr);
2401 return 1;
2402 }
2403#endif /* AF_QIPCRTR */
2404
caaveryeffc12f2017-09-06 18:18:10 -04002405#if defined(AF_VSOCK)
2406 case AF_VSOCK:
2407 {
2408 *len_ret = sizeof (struct sockaddr_vm);
2409 return 1;
2410 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002411#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002412
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002413#ifdef AF_RDS
2414 case AF_RDS:
2415 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002416#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 case AF_INET:
2419 {
2420 *len_ret = sizeof (struct sockaddr_in);
2421 return 1;
2422 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002423
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002424#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 case AF_INET6:
2426 {
2427 *len_ret = sizeof (struct sockaddr_in6);
2428 return 1;
2429 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002430#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002431
Hye-Shik Chang81268602004-02-02 06:05:24 +00002432#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 case AF_BLUETOOTH:
2434 {
2435 switch(s->sock_proto)
2436 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002437
Greg Bowser8fbece12019-08-02 16:29:52 -04002438#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 case BTPROTO_L2CAP:
2440 *len_ret = sizeof (struct sockaddr_l2);
2441 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002442#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 case BTPROTO_RFCOMM:
2444 *len_ret = sizeof (struct sockaddr_rc);
2445 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002446#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 case BTPROTO_HCI:
2448 *len_ret = sizeof (struct sockaddr_hci);
2449 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002450#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 case BTPROTO_SCO:
2452 *len_ret = sizeof (struct sockaddr_sco);
2453 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002454#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002455#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002457 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 "unknown BT protocol");
2459 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 }
2462 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002463#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002464
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002465#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 case AF_PACKET:
2467 {
2468 *len_ret = sizeof (struct sockaddr_ll);
2469 return 1;
2470 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002471#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002472
Christian Heimes043d6f62008-01-07 17:19:16 +00002473#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 case AF_TIPC:
2475 {
2476 *len_ret = sizeof (struct sockaddr_tipc);
2477 return 1;
2478 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002479#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002480
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002481#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002482 case AF_CAN:
2483 {
2484 *len_ret = sizeof (struct sockaddr_can);
2485 return 1;
2486 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002487#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002488
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002489#ifdef PF_SYSTEM
2490 case PF_SYSTEM:
2491 switch(s->sock_proto) {
2492#ifdef SYSPROTO_CONTROL
2493 case SYSPROTO_CONTROL:
2494 *len_ret = sizeof (struct sockaddr_ctl);
2495 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002496#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002497 default:
2498 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2499 "unknown PF_SYSTEM protocol");
2500 return 0;
2501 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002502#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002503#ifdef HAVE_SOCKADDR_ALG
2504 case AF_ALG:
2505 {
2506 *len_ret = sizeof (struct sockaddr_alg);
2507 return 1;
2508 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002509#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002514 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002518}
2519
2520
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002521/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2522 Currently, these methods are only compiled if the RFC 2292/3542
2523 CMSG_LEN() macro is available. Older systems seem to have used
2524 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2525 it may be possible to define CMSG_LEN() that way if it's not
2526 provided. Some architectures might need extra padding after the
2527 cmsghdr, however, and CMSG_LEN() would have to take account of
2528 this. */
2529#ifdef CMSG_LEN
2530/* If length is in range, set *result to CMSG_LEN(length) and return
2531 true; otherwise, return false. */
2532static int
2533get_CMSG_LEN(size_t length, size_t *result)
2534{
2535 size_t tmp;
2536
2537 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2538 return 0;
2539 tmp = CMSG_LEN(length);
2540 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2541 return 0;
2542 *result = tmp;
2543 return 1;
2544}
2545
2546#ifdef CMSG_SPACE
2547/* If length is in range, set *result to CMSG_SPACE(length) and return
2548 true; otherwise, return false. */
2549static int
2550get_CMSG_SPACE(size_t length, size_t *result)
2551{
2552 size_t tmp;
2553
2554 /* Use CMSG_SPACE(1) here in order to take account of the padding
2555 necessary before *and* after the data. */
2556 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2557 return 0;
2558 tmp = CMSG_SPACE(length);
2559 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2560 return 0;
2561 *result = tmp;
2562 return 1;
2563}
2564#endif
2565
2566/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2567 pointer in msg->msg_control with at least "space" bytes after it,
2568 and its cmsg_len member inside the buffer. */
2569static int
2570cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2571{
2572 size_t cmsg_offset;
2573 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2574 sizeof(cmsgh->cmsg_len));
2575
Charles-François Natali466517d2011-08-28 18:23:43 +02002576 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002577 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002578 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002579 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2580 annoying under OS X as it's unsigned there and so it triggers a
2581 tautological comparison warning under Clang when compared against 0.
2582 Since the check is valid on other platforms, silence the warning under
2583 Clang. */
2584 #ifdef __clang__
2585 #pragma clang diagnostic push
2586 #pragma clang diagnostic ignored "-Wtautological-compare"
2587 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002588 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002589 #pragma GCC diagnostic push
2590 #pragma GCC diagnostic ignored "-Wtype-limits"
2591 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002592 if (msg->msg_controllen < 0)
2593 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002594 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002595 #pragma GCC diagnostic pop
2596 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002597 #ifdef __clang__
2598 #pragma clang diagnostic pop
2599 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002600 if (space < cmsg_len_end)
2601 space = cmsg_len_end;
2602 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2603 return (cmsg_offset <= (size_t)-1 - space &&
2604 cmsg_offset + space <= msg->msg_controllen);
2605}
2606
2607/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2608 *space to number of bytes following it in the buffer and return
2609 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2610 msg->msg_controllen are valid. */
2611static int
2612get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2613{
2614 size_t data_offset;
2615 char *data_ptr;
2616
2617 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2618 return 0;
2619 data_offset = data_ptr - (char *)msg->msg_control;
2620 if (data_offset > msg->msg_controllen)
2621 return 0;
2622 *space = msg->msg_controllen - data_offset;
2623 return 1;
2624}
2625
2626/* If cmsgh is invalid or not contained in the buffer pointed to by
2627 msg->msg_control, return -1. If cmsgh is valid and its associated
2628 data is entirely contained in the buffer, set *data_len to the
2629 length of the associated data and return 0. If only part of the
2630 associated data is contained in the buffer but cmsgh is otherwise
2631 valid, set *data_len to the length contained in the buffer and
2632 return 1. */
2633static int
2634get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2635{
2636 size_t space, cmsg_data_len;
2637
2638 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2639 cmsgh->cmsg_len < CMSG_LEN(0))
2640 return -1;
2641 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2642 if (!get_cmsg_data_space(msg, cmsgh, &space))
2643 return -1;
2644 if (space >= cmsg_data_len) {
2645 *data_len = cmsg_data_len;
2646 return 0;
2647 }
2648 *data_len = space;
2649 return 1;
2650}
2651#endif /* CMSG_LEN */
2652
2653
Victor Stinner31bf2d52015-04-01 21:57:09 +02002654struct sock_accept {
2655 socklen_t *addrlen;
2656 sock_addr_t *addrbuf;
2657 SOCKET_T result;
2658};
2659
2660#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2661/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2662static int accept4_works = -1;
2663#endif
2664
2665static int
2666sock_accept_impl(PySocketSockObject *s, void *data)
2667{
2668 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002669 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2670 socklen_t *paddrlen = ctx->addrlen;
2671#ifdef HAVE_SOCKADDR_ALG
2672 /* AF_ALG does not support accept() with addr and raises
2673 * ECONNABORTED instead. */
2674 if (s->sock_family == AF_ALG) {
2675 addr = NULL;
2676 paddrlen = NULL;
2677 *ctx->addrlen = 0;
2678 }
2679#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002680
2681#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2682 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002683 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002684 SOCK_CLOEXEC);
2685 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2686 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2687 accept4_works = (errno != ENOSYS);
2688 }
2689 }
2690 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002691 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002692#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002693 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002694#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002695
2696#ifdef MS_WINDOWS
2697 return (ctx->result != INVALID_SOCKET);
2698#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002699 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002700#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002701}
2702
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002703/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002704
Guido van Rossum73624e91994-10-10 17:59:00 +00002705static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302706sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002709 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 socklen_t addrlen;
2711 PyObject *sock = NULL;
2712 PyObject *addr = NULL;
2713 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002714 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 if (!getsockaddrlen(s, &addrlen))
2717 return NULL;
2718 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (!IS_SELECTABLE(s))
2721 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002722
Victor Stinner31bf2d52015-04-01 21:57:09 +02002723 ctx.addrlen = &addrlen;
2724 ctx.addrbuf = &addrbuf;
2725 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002727 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002728
Victor Stinnerdaf45552013-08-28 00:53:59 +02002729#ifdef MS_WINDOWS
2730 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2731 PyErr_SetFromWindowsErr(0);
2732 SOCKETCLOSE(newfd);
2733 goto finally;
2734 }
2735#else
2736
2737#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2738 if (!accept4_works)
2739#endif
2740 {
2741 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2742 SOCKETCLOSE(newfd);
2743 goto finally;
2744 }
2745 }
2746#endif
2747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 sock = PyLong_FromSocket_t(newfd);
2749 if (sock == NULL) {
2750 SOCKETCLOSE(newfd);
2751 goto finally;
2752 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2755 addrlen, s->sock_proto);
2756 if (addr == NULL)
2757 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002760
Guido van Rossum67f7a382002-06-06 21:08:16 +00002761finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_XDECREF(sock);
2763 Py_XDECREF(addr);
2764 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002765}
2766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002767PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002768"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002769\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002770Wait for an incoming connection. Return a new socket file descriptor\n\
2771representing the connection, and the address of the client.\n\
2772For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002773
Guido van Rossum11ba0942002-06-13 15:07:44 +00002774/* s.setblocking(flag) method. Argument:
2775 False -- non-blocking mode; same as settimeout(0)
2776 True -- blocking mode; same as settimeout(None)
2777*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002778
Guido van Rossum73624e91994-10-10 17:59:00 +00002779static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002780sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002781{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002782 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 block = PyLong_AsLong(arg);
2785 if (block == -1 && PyErr_Occurred())
2786 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002787
Victor Stinner9001d802015-04-06 23:06:01 +02002788 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002789 if (internal_setblocking(s, block) == -1) {
2790 return NULL;
2791 }
2792 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002793}
Guido van Rossume4485b01994-09-07 14:32:49 +00002794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002795PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002796"setblocking(flag)\n\
2797\n\
2798Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002799setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002800setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002801
Yury Selivanovf11b4602018-01-28 17:27:38 -05002802/* s.getblocking() method.
2803 Returns True if socket is in blocking mode,
2804 False if it is in non-blocking mode.
2805*/
2806static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302807sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002808{
2809 if (s->sock_timeout) {
2810 Py_RETURN_TRUE;
2811 }
2812 else {
2813 Py_RETURN_FALSE;
2814 }
2815}
2816
2817PyDoc_STRVAR(getblocking_doc,
2818"getblocking()\n\
2819\n\
2820Returns True if socket is in blocking mode, or False if it\n\
2821is in non-blocking mode.");
2822
Victor Stinner71694d52015-03-28 01:18:54 +01002823static int
2824socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2825{
2826#ifdef MS_WINDOWS
2827 struct timeval tv;
2828#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002829#ifndef HAVE_POLL
2830 _PyTime_t ms;
2831#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002832 int overflow = 0;
2833
2834 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002835 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002836 return 0;
2837 }
2838
Victor Stinner869e1772015-03-30 03:49:14 +02002839 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002840 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002841 return -1;
2842
2843 if (*timeout < 0) {
2844 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2845 return -1;
2846 }
2847
2848#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002849 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002850#endif
2851#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002852 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002853 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002854#endif
2855 if (overflow) {
2856 PyErr_SetString(PyExc_OverflowError,
2857 "timeout doesn't fit into C timeval");
2858 return -1;
2859 }
2860
2861 return 0;
2862}
2863
Guido van Rossum11ba0942002-06-13 15:07:44 +00002864/* s.settimeout(timeout) method. Argument:
2865 None -- no timeout, blocking mode; same as setblocking(True)
2866 0.0 -- non-blocking mode; same as setblocking(False)
2867 > 0 -- timeout mode; operations time out after timeout seconds
2868 < 0 -- illegal; raises an exception
2869*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002871sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872{
Victor Stinner71694d52015-03-28 01:18:54 +01002873 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002874
Victor Stinner71694d52015-03-28 01:18:54 +01002875 if (socket_parse_timeout(&timeout, arg) < 0)
2876 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002879
2880 int block = timeout < 0;
2881 /* Blocking mode for a Python socket object means that operations
2882 like :meth:`recv` or :meth:`sendall` will block the execution of
2883 the current thread until they are complete or aborted with a
2884 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2885 the underlying FD is in a blocking mode. When timeout is a positive
2886 number, the FD is in a non-blocking mode, and socket ops are
2887 implemented with a `select()` call.
2888
2889 When timeout is 0.0, the FD is in a non-blocking mode.
2890
2891 This table summarizes all states in which the socket object and
2892 its underlying FD can be:
2893
2894 ==================== ===================== ==============
2895 `gettimeout()` `getblocking()` FD
2896 ==================== ===================== ==============
2897 ``None`` ``True`` blocking
2898 ``0.0`` ``False`` non-blocking
2899 ``> 0`` ``True`` non-blocking
2900 */
2901
2902 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002903 return NULL;
2904 }
2905 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002909"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002911Set a timeout on socket operations. 'timeout' can be a float,\n\
2912giving in seconds, or None. Setting a timeout of None disables\n\
2913the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002916/* s.gettimeout() method.
2917 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002918static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302919sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002920{
Victor Stinner71694d52015-03-28 01:18:54 +01002921 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002922 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 }
Victor Stinner71694d52015-03-28 01:18:54 +01002924 else {
2925 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2926 return PyFloat_FromDouble(seconds);
2927 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002928}
2929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002931"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002932\n\
oldkaa0735f2018-02-02 16:52:55 +08002933Returns the timeout in seconds (float) associated with socket\n\
2934operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002935operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002936
Guido van Rossumaee08791992-09-08 09:05:33 +00002937/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002938 With an integer third argument, sets an integer optval with optlen=4.
2939 With None as third argument and an integer fourth argument, set
2940 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002941 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002942 use optional built-in module 'struct' to encode the string.
2943*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002944
Guido van Rossum73624e91994-10-10 17:59:00 +00002945static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002946sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 int level;
2949 int optname;
2950 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002951 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002953 unsigned int optlen;
2954 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002955
caaveryeffc12f2017-09-06 18:18:10 -04002956#ifdef AF_VSOCK
2957 if (s->sock_family == AF_VSOCK) {
2958 uint64_t vflag; // Must be set width of 64 bits
2959 /* setsockopt(level, opt, flag) */
2960 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2961 &level, &optname, &vflag)) {
2962 // level should always be set to AF_VSOCK
2963 res = setsockopt(s->sock_fd, level, optname,
2964 (void*)&vflag, sizeof vflag);
2965 goto done;
2966 }
2967 return NULL;
2968 }
2969#endif
2970
Christian Heimesdffa3942016-09-05 23:54:41 +02002971 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 if (PyArg_ParseTuple(args, "iii:setsockopt",
2973 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002974 res = setsockopt(s->sock_fd, level, optname,
2975 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002976 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002978
2979 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002980 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002981 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2982 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2983 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002984 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002985 NULL, (socklen_t)optlen);
2986 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002988
2989 PyErr_Clear();
2990 /* setsockopt(level, opt, buffer) */
2991 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2992 &level, &optname, &optval))
2993 return NULL;
2994
2995#ifdef MS_WINDOWS
2996 if (optval.len > INT_MAX) {
2997 PyBuffer_Release(&optval);
2998 PyErr_Format(PyExc_OverflowError,
2999 "socket option is larger than %i bytes",
3000 INT_MAX);
3001 return NULL;
3002 }
3003 res = setsockopt(s->sock_fd, level, optname,
3004 optval.buf, (int)optval.len);
3005#else
3006 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3007#endif
3008 PyBuffer_Release(&optval);
3009
3010done:
Victor Stinnercc739322016-03-23 21:35:29 +01003011 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003013 }
3014
3015 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003016}
3017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003019"setsockopt(level, option, value: int)\n\
3020setsockopt(level, option, value: buffer)\n\
3021setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003022\n\
3023Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003024The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003025None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003026
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003027
Guido van Rossumaee08791992-09-08 09:05:33 +00003028/* s.getsockopt() method.
3029 With two arguments, retrieves an integer option.
3030 With a third integer argument, retrieves a string buffer of that size;
3031 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003032
Guido van Rossum73624e91994-10-10 17:59:00 +00003033static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 int level;
3037 int optname;
3038 int res;
3039 PyObject *buf;
3040 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003041 int flag = 0;
3042 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3045 &level, &optname, &buflen))
3046 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003049#ifdef AF_VSOCK
3050 if (s->sock_family == AF_VSOCK) {
3051 uint64_t vflag = 0; // Must be set width of 64 bits
3052 flagsize = sizeof vflag;
3053 res = getsockopt(s->sock_fd, level, optname,
3054 (void *)&vflag, &flagsize);
3055 if (res < 0)
3056 return s->errorhandler();
3057 return PyLong_FromUnsignedLong(vflag);
3058 }
3059#endif
3060 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 res = getsockopt(s->sock_fd, level, optname,
3062 (void *)&flag, &flagsize);
3063 if (res < 0)
3064 return s->errorhandler();
3065 return PyLong_FromLong(flag);
3066 }
caaveryeffc12f2017-09-06 18:18:10 -04003067#ifdef AF_VSOCK
3068 if (s->sock_family == AF_VSOCK) {
3069 PyErr_SetString(PyExc_OSError,
3070 "getsockopt string buffer not allowed");
3071 return NULL;
3072 }
3073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003075 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 "getsockopt buflen out of range");
3077 return NULL;
3078 }
3079 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3080 if (buf == NULL)
3081 return NULL;
3082 res = getsockopt(s->sock_fd, level, optname,
3083 (void *)PyBytes_AS_STRING(buf), &buflen);
3084 if (res < 0) {
3085 Py_DECREF(buf);
3086 return s->errorhandler();
3087 }
3088 _PyBytes_Resize(&buf, buflen);
3089 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003090}
3091
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003092PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003093"getsockopt(level, option[, buffersize]) -> value\n\
3094\n\
3095Get a socket option. See the Unix manual for level and option.\n\
3096If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003097string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003098
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003099
Fred Drake728819a2000-07-01 03:40:12 +00003100/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003101
Guido van Rossum73624e91994-10-10 17:59:00 +00003102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003103sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 sock_addr_t addrbuf;
3106 int addrlen;
3107 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003108
Victor Stinnerd565fb92019-10-10 21:30:20 +02003109 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003111 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003112
3113 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3114 return NULL;
3115 }
3116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 Py_BEGIN_ALLOW_THREADS
3118 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3119 Py_END_ALLOW_THREADS
3120 if (res < 0)
3121 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003122 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003123}
3124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003125PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126"bind(address)\n\
3127\n\
3128Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003129pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003130sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003131
Guido van Rossum30a685f1991-06-27 15:51:29 +00003132
3133/* s.close() method.
3134 Set the file descriptor to -1 so operations tried subsequently
3135 will surely fail. */
3136
Guido van Rossum73624e91994-10-10 17:59:00 +00003137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303138sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003141 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003142
Victor Stinner19a8e842016-03-21 16:36:48 +01003143 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003144 if (fd != INVALID_SOCKET) {
3145 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003146
3147 /* We do not want to retry upon EINTR: see
3148 http://lwn.net/Articles/576478/ and
3149 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3150 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003152 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003154 /* bpo-30319: The peer can already have closed the connection.
3155 Python ignores ECONNRESET on close(). */
3156 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003157 return s->errorhandler();
3158 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003160 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003161}
3162
Christian Heimesd0e31b92018-01-27 09:54:13 +01003163PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003164"close()\n\
3165\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003166Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003167
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003168static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303169sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003170{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003171 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003172 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003173 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003174}
3175
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003176PyDoc_STRVAR(detach_doc,
3177"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003178\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003179Close the socket object without closing the underlying file descriptor.\n\
3180The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003181can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003182
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003183static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003184sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003185{
Victor Stinner81c41db2015-04-02 11:50:57 +02003186 int err;
3187 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003188
Victor Stinner81c41db2015-04-02 11:50:57 +02003189 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3190 /* getsockopt() failed */
3191 return 0;
3192 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003193
Victor Stinner81c41db2015-04-02 11:50:57 +02003194 if (err == EISCONN)
3195 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003196 if (err != 0) {
3197 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3198 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003199 return 0;
3200 }
3201 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003202}
3203
3204static int
3205internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3206 int raise)
3207{
3208 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003209
3210 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003212 Py_END_ALLOW_THREADS
3213
Victor Stinner70a46f62015-03-31 22:03:59 +02003214 if (!res) {
3215 /* connect() succeeded, the socket is connected */
3216 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003218
Victor Stinner81c41db2015-04-02 11:50:57 +02003219 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003220
Victor Stinner81c41db2015-04-02 11:50:57 +02003221 /* save error, PyErr_CheckSignals() can replace it */
3222 err = GET_SOCK_ERROR;
3223 if (CHECK_ERRNO(EINTR)) {
3224 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003225 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003226
3227 /* Issue #23618: when connect() fails with EINTR, the connection is
3228 running asynchronously.
3229
3230 If the socket is blocking or has a timeout, wait until the
3231 connection completes, fails or timed out using select(), and then
3232 get the connection status using getsockopt(SO_ERROR).
3233
3234 If the socket is non-blocking, raise InterruptedError. The caller is
3235 responsible to wait until the connection completes, fails or timed
3236 out (it's the case in asyncio for example). */
3237 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3238 }
3239 else {
3240 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3241 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003242 }
3243
Victor Stinner81c41db2015-04-02 11:50:57 +02003244 if (!wait_connect) {
3245 if (raise) {
3246 /* restore error, maybe replaced by PyErr_CheckSignals() */
3247 SET_SOCK_ERROR(err);
3248 s->errorhandler();
3249 return -1;
3250 }
3251 else
3252 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003253 }
3254
Victor Stinner81c41db2015-04-02 11:50:57 +02003255 if (raise) {
3256 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003257 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3258 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003259 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003260 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003261 else {
3262 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003263 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3264 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003265 return err;
3266 }
3267 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003268}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003269
Fred Drake728819a2000-07-01 03:40:12 +00003270/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003271
Guido van Rossum73624e91994-10-10 17:59:00 +00003272static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003273sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 sock_addr_t addrbuf;
3276 int addrlen;
3277 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003278
Victor Stinnerd565fb92019-10-10 21:30:20 +02003279 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003281 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003282
Steve Dowerb82e17e2019-05-23 08:45:22 -07003283 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3284 return NULL;
3285 }
3286
Victor Stinner81c41db2015-04-02 11:50:57 +02003287 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003288 if (res < 0)
3289 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003290
Victor Stinneree699e92015-03-31 21:28:42 +02003291 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003292}
3293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003294PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003295"connect(address)\n\
3296\n\
3297Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003298is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003299
Guido van Rossum30a685f1991-06-27 15:51:29 +00003300
Fred Drake728819a2000-07-01 03:40:12 +00003301/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003302
3303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003304sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 sock_addr_t addrbuf;
3307 int addrlen;
3308 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003309
Victor Stinnerd565fb92019-10-10 21:30:20 +02003310 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003312 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003313
Steve Dowerb82e17e2019-05-23 08:45:22 -07003314 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3315 return NULL;
3316 }
3317
Victor Stinner81c41db2015-04-02 11:50:57 +02003318 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003319 if (res < 0)
3320 return NULL;
3321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003323}
3324
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003325PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003326"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003327\n\
3328This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003329instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003330
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003331
Guido van Rossumed233a51992-06-23 09:07:03 +00003332/* s.fileno() method */
3333
Guido van Rossum73624e91994-10-10 17:59:00 +00003334static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303335sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003338}
3339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003340PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003341"fileno() -> integer\n\
3342\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003343Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003344
Guido van Rossumed233a51992-06-23 09:07:03 +00003345
Guido van Rossumc89705d1992-11-26 08:54:07 +00003346/* s.getsockname() method */
3347
Guido van Rossum73624e91994-10-10 17:59:00 +00003348static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303349sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 sock_addr_t addrbuf;
3352 int res;
3353 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (!getsockaddrlen(s, &addrlen))
3356 return NULL;
3357 memset(&addrbuf, 0, addrlen);
3358 Py_BEGIN_ALLOW_THREADS
3359 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3360 Py_END_ALLOW_THREADS
3361 if (res < 0)
3362 return s->errorhandler();
3363 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3364 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003365}
3366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003367PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003368"getsockname() -> address info\n\
3369\n\
3370Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003371info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003372
Guido van Rossumc89705d1992-11-26 08:54:07 +00003373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003375/* s.getpeername() method */
3376
Guido van Rossum73624e91994-10-10 17:59:00 +00003377static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303378sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 sock_addr_t addrbuf;
3381 int res;
3382 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 if (!getsockaddrlen(s, &addrlen))
3385 return NULL;
3386 memset(&addrbuf, 0, addrlen);
3387 Py_BEGIN_ALLOW_THREADS
3388 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3389 Py_END_ALLOW_THREADS
3390 if (res < 0)
3391 return s->errorhandler();
3392 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3393 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003394}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003395
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003396PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003397"getpeername() -> address info\n\
3398\n\
3399Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003400info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003401
Guido van Rossumb6775db1994-08-01 11:34:53 +00003402#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003403
3404
Guido van Rossum30a685f1991-06-27 15:51:29 +00003405/* s.listen(n) method */
3406
Guido van Rossum73624e91994-10-10 17:59:00 +00003407static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003408sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003409{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003410 /* We try to choose a default backlog high enough to avoid connection drops
3411 * for common workloads, yet not too high to limit resource usage. */
3412 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003414
Charles-François Natali644b8f52014-05-22 19:45:39 +01003415 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003419 /* To avoid problems on systems that don't allow a negative backlog
3420 * (which doesn't make sense anyway) we force a minimum value of 0. */
3421 if (backlog < 0)
3422 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 res = listen(s->sock_fd, backlog);
3424 Py_END_ALLOW_THREADS
3425 if (res < 0)
3426 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003427 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003428}
3429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003430PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003431"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003432\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003433Enable a server to accept connections. If backlog is specified, it must be\n\
3434at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003435unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003436connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437
Victor Stinner31bf2d52015-04-01 21:57:09 +02003438struct sock_recv {
3439 char *cbuf;
3440 Py_ssize_t len;
3441 int flags;
3442 Py_ssize_t result;
3443};
3444
3445static int
3446sock_recv_impl(PySocketSockObject *s, void *data)
3447{
3448 struct sock_recv *ctx = data;
3449
3450#ifdef MS_WINDOWS
3451 if (ctx->len > INT_MAX)
3452 ctx->len = INT_MAX;
3453 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3454#else
3455 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3456#endif
3457 return (ctx->result >= 0);
3458}
3459
Guido van Rossum82a5c661998-07-07 20:45:43 +00003460
Thomas Wouters477c8d52006-05-27 19:21:47 +00003461/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003462 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003463 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003464 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003465 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003466 * also possible that we return a number of bytes smaller than the request
3467 * bytes.
3468 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003469
Antoine Pitrou19467d22010-08-17 19:33:30 +00003470static Py_ssize_t
3471sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003472{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003473 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 if (!IS_SELECTABLE(s)) {
3476 select_error();
3477 return -1;
3478 }
3479 if (len == 0) {
3480 /* If 0 bytes were requested, do nothing. */
3481 return 0;
3482 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003483
Victor Stinner31bf2d52015-04-01 21:57:09 +02003484 ctx.cbuf = cbuf;
3485 ctx.len = len;
3486 ctx.flags = flags;
3487 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003489
3490 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003491}
3492
Guido van Rossum48a680c2001-03-02 06:34:14 +00003493
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003494/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003495
Guido van Rossum73624e91994-10-10 17:59:00 +00003496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003497sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003498{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003499 Py_ssize_t recvlen, outlen;
3500 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003502
Antoine Pitrou19467d22010-08-17 19:33:30 +00003503 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 if (recvlen < 0) {
3507 PyErr_SetString(PyExc_ValueError,
3508 "negative buffersize in recv");
3509 return NULL;
3510 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 /* Allocate a new string. */
3513 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3514 if (buf == NULL)
3515 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003517 /* Call the guts */
3518 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3519 if (outlen < 0) {
3520 /* An error occurred, release the string and return an
3521 error. */
3522 Py_DECREF(buf);
3523 return NULL;
3524 }
3525 if (outlen != recvlen) {
3526 /* We did not read as many bytes as we anticipated, resize the
3527 string if possible and be successful. */
3528 _PyBytes_Resize(&buf, outlen);
3529 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003532}
3533
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003534PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003535"recv(buffersize[, flags]) -> data\n\
3536\n\
3537Receive up to buffersize bytes from the socket. For the optional flags\n\
3538argument, see the Unix manual. When no data is available, block until\n\
3539at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003540the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003541
Guido van Rossum30a685f1991-06-27 15:51:29 +00003542
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003543/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003544
Thomas Wouters477c8d52006-05-27 19:21:47 +00003545static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003546sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003549
Antoine Pitrou19467d22010-08-17 19:33:30 +00003550 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 Py_buffer pbuf;
3552 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003553 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003556 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 &pbuf, &recvlen, &flags))
3558 return NULL;
3559 buf = pbuf.buf;
3560 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 if (recvlen < 0) {
3563 PyBuffer_Release(&pbuf);
3564 PyErr_SetString(PyExc_ValueError,
3565 "negative buffersize in recv_into");
3566 return NULL;
3567 }
3568 if (recvlen == 0) {
3569 /* If nbytes was not specified, use the buffer's length */
3570 recvlen = buflen;
3571 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 /* Check if the buffer is large enough */
3574 if (buflen < recvlen) {
3575 PyBuffer_Release(&pbuf);
3576 PyErr_SetString(PyExc_ValueError,
3577 "buffer too small for requested bytes");
3578 return NULL;
3579 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 /* Call the guts */
3582 readlen = sock_recv_guts(s, buf, recvlen, flags);
3583 if (readlen < 0) {
3584 /* Return an error. */
3585 PyBuffer_Release(&pbuf);
3586 return NULL;
3587 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 PyBuffer_Release(&pbuf);
3590 /* Return the number of bytes read. Note that we do not do anything
3591 special here in the case that readlen < recvlen. */
3592 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003593}
3594
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003595PyDoc_STRVAR(recv_into_doc,
3596"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003597\n\
oldkaa0735f2018-02-02 16:52:55 +08003598A version of recv() that stores its data into a buffer rather than creating\n\
3599a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003600is not specified (or 0), receive up to the size available in the given buffer.\n\
3601\n\
3602See recv() for documentation about the flags.");
3603
Victor Stinner31bf2d52015-04-01 21:57:09 +02003604struct sock_recvfrom {
3605 char* cbuf;
3606 Py_ssize_t len;
3607 int flags;
3608 socklen_t *addrlen;
3609 sock_addr_t *addrbuf;
3610 Py_ssize_t result;
3611};
3612
3613static int
3614sock_recvfrom_impl(PySocketSockObject *s, void *data)
3615{
3616 struct sock_recvfrom *ctx = data;
3617
3618 memset(ctx->addrbuf, 0, *ctx->addrlen);
3619
3620#ifdef MS_WINDOWS
3621 if (ctx->len > INT_MAX)
3622 ctx->len = INT_MAX;
3623 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3624 SAS2SA(ctx->addrbuf), ctx->addrlen);
3625#else
3626 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3627 SAS2SA(ctx->addrbuf), ctx->addrlen);
3628#endif
3629 return (ctx->result >= 0);
3630}
3631
Thomas Wouters477c8d52006-05-27 19:21:47 +00003632
3633/*
Christian Heimes99170a52007-12-19 02:07:34 +00003634 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3635 * into a char buffer. If you have any inc/def ref to do to the objects that
3636 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003637 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003638 * that it is also possible that we return a number of bytes smaller than the
3639 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003640 *
3641 * 'addr' is a return value for the address object. Note that you must decref
3642 * it yourself.
3643 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003644static Py_ssize_t
3645sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003650 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 if (!getsockaddrlen(s, &addrlen))
3655 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 if (!IS_SELECTABLE(s)) {
3658 select_error();
3659 return -1;
3660 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003661
Victor Stinner31bf2d52015-04-01 21:57:09 +02003662 ctx.cbuf = cbuf;
3663 ctx.len = len;
3664 ctx.flags = flags;
3665 ctx.addrbuf = &addrbuf;
3666 ctx.addrlen = &addrlen;
3667 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003669
Victor Stinner31bf2d52015-04-01 21:57:09 +02003670 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3671 s->sock_proto);
3672 if (*addr == NULL)
3673 return -1;
3674
3675 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003676}
3677
3678/* s.recvfrom(nbytes [,flags]) method */
3679
3680static PyObject *
3681sock_recvfrom(PySocketSockObject *s, PyObject *args)
3682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 PyObject *buf = NULL;
3684 PyObject *addr = NULL;
3685 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003686 int flags = 0;
3687 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003688
Antoine Pitrou19467d22010-08-17 19:33:30 +00003689 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 if (recvlen < 0) {
3693 PyErr_SetString(PyExc_ValueError,
3694 "negative buffersize in recvfrom");
3695 return NULL;
3696 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3699 if (buf == NULL)
3700 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3703 recvlen, flags, &addr);
3704 if (outlen < 0) {
3705 goto finally;
3706 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 if (outlen != recvlen) {
3709 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003710 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003712 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 goto finally;
3714 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003717
3718finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 Py_XDECREF(buf);
3720 Py_XDECREF(addr);
3721 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003722}
3723
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003724PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003725"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3726\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003727Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003728
Thomas Wouters477c8d52006-05-27 19:21:47 +00003729
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003730/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003731
3732static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003733sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003736
Antoine Pitrou19467d22010-08-17 19:33:30 +00003737 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 Py_buffer pbuf;
3739 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003740 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003743
Antoine Pitrou19467d22010-08-17 19:33:30 +00003744 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 kwlist, &pbuf,
3746 &recvlen, &flags))
3747 return NULL;
3748 buf = pbuf.buf;
3749 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 if (recvlen < 0) {
3752 PyBuffer_Release(&pbuf);
3753 PyErr_SetString(PyExc_ValueError,
3754 "negative buffersize in recvfrom_into");
3755 return NULL;
3756 }
3757 if (recvlen == 0) {
3758 /* If nbytes was not specified, use the buffer's length */
3759 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003760 } else if (recvlen > buflen) {
3761 PyBuffer_Release(&pbuf);
3762 PyErr_SetString(PyExc_ValueError,
3763 "nbytes is greater than the length of the buffer");
3764 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3768 if (readlen < 0) {
3769 PyBuffer_Release(&pbuf);
3770 /* Return an error */
3771 Py_XDECREF(addr);
3772 return NULL;
3773 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 PyBuffer_Release(&pbuf);
3776 /* Return the number of bytes read and the address. Note that we do
3777 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003778 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003779}
3780
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003781PyDoc_STRVAR(recvfrom_into_doc,
3782"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003783\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003784Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003785
Victor Stinner35bee932015-04-02 12:28:07 +02003786/* The sendmsg() and recvmsg[_into]() methods require a working
3787 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3788#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003789struct sock_recvmsg {
3790 struct msghdr *msg;
3791 int flags;
3792 ssize_t result;
3793};
3794
3795static int
3796sock_recvmsg_impl(PySocketSockObject *s, void *data)
3797{
3798 struct sock_recvmsg *ctx = data;
3799
3800 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3801 return (ctx->result >= 0);
3802}
3803
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003804/*
3805 * Call recvmsg() with the supplied iovec structures, flags, and
3806 * ancillary data buffer size (controllen). Returns the tuple return
3807 * value for recvmsg() or recvmsg_into(), with the first item provided
3808 * by the supplied makeval() function. makeval() will be called with
3809 * the length read and makeval_data as arguments, and must return a
3810 * new reference (which will be decrefed if there is a subsequent
3811 * error). On error, closes any file descriptors received via
3812 * SCM_RIGHTS.
3813 */
3814static PyObject *
3815sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3816 int flags, Py_ssize_t controllen,
3817 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3818{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003819 sock_addr_t addrbuf;
3820 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003821 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822 PyObject *cmsg_list = NULL, *retval = NULL;
3823 void *controlbuf = NULL;
3824 struct cmsghdr *cmsgh;
3825 size_t cmsgdatalen = 0;
3826 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003827 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828
3829 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3830 ignored" when the socket is connected (Linux fills them in
3831 anyway for AF_UNIX sockets at least). Normally msg_namelen
3832 seems to be set to 0 if there's no address, but try to
3833 initialize msg_name to something that won't be mistaken for a
3834 real address if that doesn't happen. */
3835 if (!getsockaddrlen(s, &addrbuflen))
3836 return NULL;
3837 memset(&addrbuf, 0, addrbuflen);
3838 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3839
3840 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3841 PyErr_SetString(PyExc_ValueError,
3842 "invalid ancillary data buffer length");
3843 return NULL;
3844 }
3845 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3846 return PyErr_NoMemory();
3847
3848 /* Make the system call. */
3849 if (!IS_SELECTABLE(s)) {
3850 select_error();
3851 goto finally;
3852 }
3853
Victor Stinner31bf2d52015-04-01 21:57:09 +02003854 msg.msg_name = SAS2SA(&addrbuf);
3855 msg.msg_namelen = addrbuflen;
3856 msg.msg_iov = iov;
3857 msg.msg_iovlen = iovlen;
3858 msg.msg_control = controlbuf;
3859 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003860
Victor Stinner31bf2d52015-04-01 21:57:09 +02003861 ctx.msg = &msg;
3862 ctx.flags = flags;
3863 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003865
3866 /* Make list of (level, type, data) tuples from control messages. */
3867 if ((cmsg_list = PyList_New(0)) == NULL)
3868 goto err_closefds;
3869 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3870 implementations didn't do so. */
3871 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3872 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3873 PyObject *bytes, *tuple;
3874 int tmp;
3875
3876 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3877 if (cmsg_status != 0) {
3878 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3879 "received malformed or improperly-truncated "
3880 "ancillary data", 1) == -1)
3881 goto err_closefds;
3882 }
3883 if (cmsg_status < 0)
3884 break;
3885 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003886 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003887 goto err_closefds;
3888 }
3889
3890 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3891 cmsgdatalen);
3892 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3893 (int)cmsgh->cmsg_type, bytes);
3894 if (tuple == NULL)
3895 goto err_closefds;
3896 tmp = PyList_Append(cmsg_list, tuple);
3897 Py_DECREF(tuple);
3898 if (tmp != 0)
3899 goto err_closefds;
3900
3901 if (cmsg_status != 0)
3902 break;
3903 }
3904
3905 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003906 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003907 cmsg_list,
3908 (int)msg.msg_flags,
3909 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3910 ((msg.msg_namelen > addrbuflen) ?
3911 addrbuflen : msg.msg_namelen),
3912 s->sock_proto));
3913 if (retval == NULL)
3914 goto err_closefds;
3915
3916finally:
3917 Py_XDECREF(cmsg_list);
3918 PyMem_Free(controlbuf);
3919 return retval;
3920
3921err_closefds:
3922#ifdef SCM_RIGHTS
3923 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3924 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3925 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3926 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3927 if (cmsg_status < 0)
3928 break;
3929 if (cmsgh->cmsg_level == SOL_SOCKET &&
3930 cmsgh->cmsg_type == SCM_RIGHTS) {
3931 size_t numfds;
3932 int *fdp;
3933
3934 numfds = cmsgdatalen / sizeof(int);
3935 fdp = (int *)CMSG_DATA(cmsgh);
3936 while (numfds-- > 0)
3937 close(*fdp++);
3938 }
3939 if (cmsg_status != 0)
3940 break;
3941 }
3942#endif /* SCM_RIGHTS */
3943 goto finally;
3944}
3945
3946
3947static PyObject *
3948makeval_recvmsg(ssize_t received, void *data)
3949{
3950 PyObject **buf = data;
3951
3952 if (received < PyBytes_GET_SIZE(*buf))
3953 _PyBytes_Resize(buf, received);
3954 Py_XINCREF(*buf);
3955 return *buf;
3956}
3957
3958/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3959
3960static PyObject *
3961sock_recvmsg(PySocketSockObject *s, PyObject *args)
3962{
3963 Py_ssize_t bufsize, ancbufsize = 0;
3964 int flags = 0;
3965 struct iovec iov;
3966 PyObject *buf = NULL, *retval = NULL;
3967
3968 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3969 return NULL;
3970
3971 if (bufsize < 0) {
3972 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3973 return NULL;
3974 }
3975 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3976 return NULL;
3977 iov.iov_base = PyBytes_AS_STRING(buf);
3978 iov.iov_len = bufsize;
3979
3980 /* Note that we're passing a pointer to *our pointer* to the bytes
3981 object here (&buf); makeval_recvmsg() may incref the object, or
3982 deallocate it and set our pointer to NULL. */
3983 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3984 &makeval_recvmsg, &buf);
3985 Py_XDECREF(buf);
3986 return retval;
3987}
3988
3989PyDoc_STRVAR(recvmsg_doc,
3990"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3991\n\
3992Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3993socket. The ancbufsize argument sets the size in bytes of the\n\
3994internal buffer used to receive the ancillary data; it defaults to 0,\n\
3995meaning that no ancillary data will be received. Appropriate buffer\n\
3996sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3997CMSG_LEN(), and items which do not fit into the buffer might be\n\
3998truncated or discarded. The flags argument defaults to 0 and has the\n\
3999same meaning as for recv().\n\
4000\n\
4001The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4002The data item is a bytes object holding the non-ancillary data\n\
4003received. The ancdata item is a list of zero or more tuples\n\
4004(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4005(control messages) received: cmsg_level and cmsg_type are integers\n\
4006specifying the protocol level and protocol-specific type respectively,\n\
4007and cmsg_data is a bytes object holding the associated data. The\n\
4008msg_flags item is the bitwise OR of various flags indicating\n\
4009conditions on the received message; see your system documentation for\n\
4010details. If the receiving socket is unconnected, address is the\n\
4011address of the sending socket, if available; otherwise, its value is\n\
4012unspecified.\n\
4013\n\
4014If recvmsg() raises an exception after the system call returns, it\n\
4015will first attempt to close any file descriptors received via the\n\
4016SCM_RIGHTS mechanism.");
4017
4018
4019static PyObject *
4020makeval_recvmsg_into(ssize_t received, void *data)
4021{
4022 return PyLong_FromSsize_t(received);
4023}
4024
4025/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4026
4027static PyObject *
4028sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4029{
4030 Py_ssize_t ancbufsize = 0;
4031 int flags = 0;
4032 struct iovec *iovs = NULL;
4033 Py_ssize_t i, nitems, nbufs = 0;
4034 Py_buffer *bufs = NULL;
4035 PyObject *buffers_arg, *fast, *retval = NULL;
4036
4037 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4038 &buffers_arg, &ancbufsize, &flags))
4039 return NULL;
4040
4041 if ((fast = PySequence_Fast(buffers_arg,
4042 "recvmsg_into() argument 1 must be an "
4043 "iterable")) == NULL)
4044 return NULL;
4045 nitems = PySequence_Fast_GET_SIZE(fast);
4046 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004047 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004048 goto finally;
4049 }
4050
4051 /* Fill in an iovec for each item, and save the Py_buffer
4052 structs to release afterwards. */
4053 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4054 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4055 PyErr_NoMemory();
4056 goto finally;
4057 }
4058 for (; nbufs < nitems; nbufs++) {
4059 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4060 "w*;recvmsg_into() argument 1 must be an iterable "
4061 "of single-segment read-write buffers",
4062 &bufs[nbufs]))
4063 goto finally;
4064 iovs[nbufs].iov_base = bufs[nbufs].buf;
4065 iovs[nbufs].iov_len = bufs[nbufs].len;
4066 }
4067
4068 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4069 &makeval_recvmsg_into, NULL);
4070finally:
4071 for (i = 0; i < nbufs; i++)
4072 PyBuffer_Release(&bufs[i]);
4073 PyMem_Free(bufs);
4074 PyMem_Free(iovs);
4075 Py_DECREF(fast);
4076 return retval;
4077}
4078
4079PyDoc_STRVAR(recvmsg_into_doc,
4080"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4081\n\
4082Receive normal data and ancillary data from the socket, scattering the\n\
4083non-ancillary data into a series of buffers. The buffers argument\n\
4084must be an iterable of objects that export writable buffers\n\
4085(e.g. bytearray objects); these will be filled with successive chunks\n\
4086of the non-ancillary data until it has all been written or there are\n\
4087no more buffers. The ancbufsize argument sets the size in bytes of\n\
4088the internal buffer used to receive the ancillary data; it defaults to\n\
40890, meaning that no ancillary data will be received. Appropriate\n\
4090buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4091or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4092truncated or discarded. The flags argument defaults to 0 and has the\n\
4093same meaning as for recv().\n\
4094\n\
4095The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4096The nbytes item is the total number of bytes of non-ancillary data\n\
4097written into the buffers. The ancdata item is a list of zero or more\n\
4098tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4099data (control messages) received: cmsg_level and cmsg_type are\n\
4100integers specifying the protocol level and protocol-specific type\n\
4101respectively, and cmsg_data is a bytes object holding the associated\n\
4102data. The msg_flags item is the bitwise OR of various flags\n\
4103indicating conditions on the received message; see your system\n\
4104documentation for details. If the receiving socket is unconnected,\n\
4105address is the address of the sending socket, if available; otherwise,\n\
4106its value is unspecified.\n\
4107\n\
4108If recvmsg_into() raises an exception after the system call returns,\n\
4109it will first attempt to close any file descriptors received via the\n\
4110SCM_RIGHTS mechanism.");
4111#endif /* CMSG_LEN */
4112
4113
Victor Stinner31bf2d52015-04-01 21:57:09 +02004114struct sock_send {
4115 char *buf;
4116 Py_ssize_t len;
4117 int flags;
4118 Py_ssize_t result;
4119};
4120
4121static int
4122sock_send_impl(PySocketSockObject *s, void *data)
4123{
4124 struct sock_send *ctx = data;
4125
4126#ifdef MS_WINDOWS
4127 if (ctx->len > INT_MAX)
4128 ctx->len = INT_MAX;
4129 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4130#else
4131 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4132#endif
4133 return (ctx->result >= 0);
4134}
4135
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004136/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004137
Guido van Rossum73624e91994-10-10 17:59:00 +00004138static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004139sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004140{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004141 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004143 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4146 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 if (!IS_SELECTABLE(s)) {
4149 PyBuffer_Release(&pbuf);
4150 return select_error();
4151 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004152 ctx.buf = pbuf.buf;
4153 ctx.len = pbuf.len;
4154 ctx.flags = flags;
4155 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004156 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 return NULL;
4158 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004159 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004160
4161 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004162}
4163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004164PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004165"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004166\n\
4167Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004168argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004169sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004170
4171
4172/* s.sendall(data [,flags]) method */
4173
4174static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004175sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004178 Py_ssize_t len, n;
4179 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004181 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004182 int has_timeout = (s->sock_timeout > 0);
4183 _PyTime_t interval = s->sock_timeout;
4184 _PyTime_t deadline = 0;
4185 int deadline_initialized = 0;
4186 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4189 return NULL;
4190 buf = pbuf.buf;
4191 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 if (!IS_SELECTABLE(s)) {
4194 PyBuffer_Release(&pbuf);
4195 return select_error();
4196 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004199 if (has_timeout) {
4200 if (deadline_initialized) {
4201 /* recompute the timeout */
4202 interval = deadline - _PyTime_GetMonotonicClock();
4203 }
4204 else {
4205 deadline_initialized = 1;
4206 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4207 }
4208
4209 if (interval <= 0) {
4210 PyErr_SetString(socket_timeout, "timed out");
4211 goto done;
4212 }
4213 }
4214
Victor Stinner02f32ab2015-04-01 22:53:26 +02004215 ctx.buf = buf;
4216 ctx.len = len;
4217 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004218 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4219 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004220 n = ctx.result;
4221 assert(n >= 0);
4222
4223 buf += n;
4224 len -= n;
4225
4226 /* We must run our signal handlers before looping again.
4227 send() can return a successful partial write when it is
4228 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004229 if (PyErr_CheckSignals())
4230 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004231 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004232 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004233
Victor Stinner8912d142015-04-06 23:16:34 +02004234 Py_INCREF(Py_None);
4235 res = Py_None;
4236
4237done:
4238 PyBuffer_Release(&pbuf);
4239 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004240}
4241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004242PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004243"sendall(data[, flags])\n\
4244\n\
4245Send a data string to the socket. For the optional flags\n\
4246argument, see the Unix manual. This calls send() repeatedly\n\
4247until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004248to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004249
Guido van Rossum30a685f1991-06-27 15:51:29 +00004250
Victor Stinner31bf2d52015-04-01 21:57:09 +02004251struct sock_sendto {
4252 char *buf;
4253 Py_ssize_t len;
4254 int flags;
4255 int addrlen;
4256 sock_addr_t *addrbuf;
4257 Py_ssize_t result;
4258};
4259
4260static int
4261sock_sendto_impl(PySocketSockObject *s, void *data)
4262{
4263 struct sock_sendto *ctx = data;
4264
4265#ifdef MS_WINDOWS
4266 if (ctx->len > INT_MAX)
4267 ctx->len = INT_MAX;
4268 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4269 SAS2SA(ctx->addrbuf), ctx->addrlen);
4270#else
4271 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4272 SAS2SA(ctx->addrbuf), ctx->addrlen);
4273#endif
4274 return (ctx->result >= 0);
4275}
4276
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004277/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004278
Guido van Rossum73624e91994-10-10 17:59:00 +00004279static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004280sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 Py_buffer pbuf;
4283 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004284 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004286 int addrlen, flags;
4287 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004290 arglen = PyTuple_Size(args);
4291 switch (arglen) {
4292 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004293 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4294 return NULL;
4295 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004296 break;
4297 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004298 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4299 &pbuf, &flags, &addro)) {
4300 return NULL;
4301 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004302 break;
4303 default:
4304 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004305 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004306 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004307 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004310 if (!IS_SELECTABLE(s)) {
4311 PyBuffer_Release(&pbuf);
4312 return select_error();
4313 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004314
Victor Stinnerd565fb92019-10-10 21:30:20 +02004315 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 PyBuffer_Release(&pbuf);
4317 return NULL;
4318 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004319
Steve Dowerb82e17e2019-05-23 08:45:22 -07004320 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4321 return NULL;
4322 }
4323
Victor Stinner31bf2d52015-04-01 21:57:09 +02004324 ctx.buf = pbuf.buf;
4325 ctx.len = pbuf.len;
4326 ctx.flags = flags;
4327 ctx.addrlen = addrlen;
4328 ctx.addrbuf = &addrbuf;
4329 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004330 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 return NULL;
4332 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004333 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004334
4335 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004336}
4337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004338PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004339"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004340\n\
4341Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004342For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004343
Guido van Rossum30a685f1991-06-27 15:51:29 +00004344
Victor Stinner35bee932015-04-02 12:28:07 +02004345/* The sendmsg() and recvmsg[_into]() methods require a working
4346 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4347#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004348struct sock_sendmsg {
4349 struct msghdr *msg;
4350 int flags;
4351 ssize_t result;
4352};
4353
4354static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004355sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4356 struct msghdr *msg,
4357 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4358 Py_ssize_t ndataparts, ndatabufs = 0;
4359 int result = -1;
4360 struct iovec *iovs = NULL;
4361 PyObject *data_fast = NULL;
4362 Py_buffer *databufs = NULL;
4363
4364 /* Fill in an iovec for each message part, and save the Py_buffer
4365 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004366 data_fast = PySequence_Fast(data_arg,
4367 "sendmsg() argument 1 must be an "
4368 "iterable");
4369 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004370 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004371 }
4372
Christian Heimesdffa3942016-09-05 23:54:41 +02004373 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4374 if (ndataparts > INT_MAX) {
4375 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4376 goto finally;
4377 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004378
Christian Heimesdffa3942016-09-05 23:54:41 +02004379 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004380 if (ndataparts > 0) {
4381 iovs = PyMem_New(struct iovec, ndataparts);
4382 if (iovs == NULL) {
4383 PyErr_NoMemory();
4384 goto finally;
4385 }
4386 msg->msg_iov = iovs;
4387
4388 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004389 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004390 PyErr_NoMemory();
4391 goto finally;
4392 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004393 }
4394 for (; ndatabufs < ndataparts; ndatabufs++) {
4395 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4396 "y*;sendmsg() argument 1 must be an iterable of "
4397 "bytes-like objects",
4398 &databufs[ndatabufs]))
4399 goto finally;
4400 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4401 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4402 }
4403 result = 0;
4404 finally:
4405 *databufsout = databufs;
4406 *ndatabufsout = ndatabufs;
4407 Py_XDECREF(data_fast);
4408 return result;
4409}
4410
4411static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004412sock_sendmsg_impl(PySocketSockObject *s, void *data)
4413{
4414 struct sock_sendmsg *ctx = data;
4415
4416 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4417 return (ctx->result >= 0);
4418}
4419
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004420/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4421
4422static PyObject *
4423sock_sendmsg(PySocketSockObject *s, PyObject *args)
4424{
Christian Heimesdffa3942016-09-05 23:54:41 +02004425 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004428 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429 struct cmsginfo {
4430 int level;
4431 int type;
4432 Py_buffer data;
4433 } *cmsgs = NULL;
4434 void *controlbuf = NULL;
4435 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004436 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004437 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004438 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004439 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440
4441 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004442 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004443 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004444 }
4445
4446 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004447
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004448 /* Parse destination address. */
4449 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004450 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004451 "sendmsg"))
4452 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004453 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004454 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004455 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4456 return NULL;
4457 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004458 msg.msg_name = &addrbuf;
4459 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004460 } else {
4461 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4462 return NULL;
4463 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004464 }
4465
4466 /* Fill in an iovec for each message part, and save the Py_buffer
4467 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004468 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004469 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004470 }
4471
4472 if (cmsg_arg == NULL)
4473 ncmsgs = 0;
4474 else {
4475 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4476 "sendmsg() argument 2 must be an "
4477 "iterable")) == NULL)
4478 goto finally;
4479 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4480 }
4481
4482#ifndef CMSG_SPACE
4483 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004484 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004485 "sending multiple control messages is not supported "
4486 "on this system");
4487 goto finally;
4488 }
4489#endif
4490 /* Save level, type and Py_buffer for each control message,
4491 and calculate total size. */
4492 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4493 PyErr_NoMemory();
4494 goto finally;
4495 }
4496 controllen = controllen_last = 0;
4497 while (ncmsgbufs < ncmsgs) {
4498 size_t bufsize, space;
4499
4500 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4501 "(iiy*):[sendmsg() ancillary data items]",
4502 &cmsgs[ncmsgbufs].level,
4503 &cmsgs[ncmsgbufs].type,
4504 &cmsgs[ncmsgbufs].data))
4505 goto finally;
4506 bufsize = cmsgs[ncmsgbufs++].data.len;
4507
4508#ifdef CMSG_SPACE
4509 if (!get_CMSG_SPACE(bufsize, &space)) {
4510#else
4511 if (!get_CMSG_LEN(bufsize, &space)) {
4512#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004513 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004514 goto finally;
4515 }
4516 controllen += space;
4517 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004518 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004519 goto finally;
4520 }
4521 controllen_last = controllen;
4522 }
4523
4524 /* Construct ancillary data block from control message info. */
4525 if (ncmsgbufs > 0) {
4526 struct cmsghdr *cmsgh = NULL;
4527
Victor Stinner52d61e42016-09-12 11:41:58 +02004528 controlbuf = PyMem_Malloc(controllen);
4529 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004530 PyErr_NoMemory();
4531 goto finally;
4532 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004533 msg.msg_control = controlbuf;
4534
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004535 msg.msg_controllen = controllen;
4536
4537 /* Need to zero out the buffer as a workaround for glibc's
4538 CMSG_NXTHDR() implementation. After getting the pointer to
4539 the next header, it checks its (uninitialized) cmsg_len
4540 member to see if the "message" fits in the buffer, and
4541 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004542 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004543 memset(controlbuf, 0, controllen);
4544
4545 for (i = 0; i < ncmsgbufs; i++) {
4546 size_t msg_len, data_len = cmsgs[i].data.len;
4547 int enough_space = 0;
4548
4549 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4550 if (cmsgh == NULL) {
4551 PyErr_Format(PyExc_RuntimeError,
4552 "unexpected NULL result from %s()",
4553 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4554 goto finally;
4555 }
4556 if (!get_CMSG_LEN(data_len, &msg_len)) {
4557 PyErr_SetString(PyExc_RuntimeError,
4558 "item size out of range for CMSG_LEN()");
4559 goto finally;
4560 }
4561 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4562 size_t space;
4563
4564 cmsgh->cmsg_len = msg_len;
4565 if (get_cmsg_data_space(&msg, cmsgh, &space))
4566 enough_space = (space >= data_len);
4567 }
4568 if (!enough_space) {
4569 PyErr_SetString(PyExc_RuntimeError,
4570 "ancillary data does not fit in calculated "
4571 "space");
4572 goto finally;
4573 }
4574 cmsgh->cmsg_level = cmsgs[i].level;
4575 cmsgh->cmsg_type = cmsgs[i].type;
4576 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4577 }
4578 }
4579
4580 /* Make the system call. */
4581 if (!IS_SELECTABLE(s)) {
4582 select_error();
4583 goto finally;
4584 }
4585
Victor Stinner31bf2d52015-04-01 21:57:09 +02004586 ctx.msg = &msg;
4587 ctx.flags = flags;
4588 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004589 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004590
4591 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004592
4593finally:
4594 PyMem_Free(controlbuf);
4595 for (i = 0; i < ncmsgbufs; i++)
4596 PyBuffer_Release(&cmsgs[i].data);
4597 PyMem_Free(cmsgs);
4598 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004599 PyMem_Free(msg.msg_iov);
4600 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004601 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004602 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004603 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004604 return retval;
4605}
4606
4607PyDoc_STRVAR(sendmsg_doc,
4608"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4609\n\
4610Send normal and ancillary data to the socket, gathering the\n\
4611non-ancillary data from a series of buffers and concatenating it into\n\
4612a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004613data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004614The ancdata argument specifies the ancillary data (control messages)\n\
4615as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4616cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4617protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004618is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004619argument defaults to 0 and has the same meaning as for send(). If\n\
4620address is supplied and not None, it sets a destination address for\n\
4621the message. The return value is the number of bytes of non-ancillary\n\
4622data sent.");
4623#endif /* CMSG_LEN */
4624
Christian Heimesdffa3942016-09-05 23:54:41 +02004625#ifdef HAVE_SOCKADDR_ALG
4626static PyObject*
4627sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4628{
4629 PyObject *retval = NULL;
4630
4631 Py_ssize_t i, ndatabufs = 0;
4632 Py_buffer *databufs = NULL;
4633 PyObject *data_arg = NULL;
4634
4635 Py_buffer iv = {NULL, NULL};
4636
4637 PyObject *opobj = NULL;
4638 int op = -1;
4639
4640 PyObject *assoclenobj = NULL;
4641 int assoclen = -1;
4642
4643 unsigned int *uiptr;
4644 int flags = 0;
4645
4646 struct msghdr msg;
4647 struct cmsghdr *header = NULL;
4648 struct af_alg_iv *alg_iv = NULL;
4649 struct sock_sendmsg ctx;
4650 Py_ssize_t controllen;
4651 void *controlbuf = NULL;
4652 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4653
4654 if (self->sock_family != AF_ALG) {
4655 PyErr_SetString(PyExc_OSError,
4656 "algset is only supported for AF_ALG");
4657 return NULL;
4658 }
4659
4660 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4661 "|O$O!y*O!i:sendmsg_afalg", keywords,
4662 &data_arg,
4663 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004664 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004665 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004666 }
4667
4668 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004669
4670 /* op is a required, keyword-only argument >= 0 */
4671 if (opobj != NULL) {
4672 op = _PyLong_AsInt(opobj);
4673 }
4674 if (op < 0) {
4675 /* override exception from _PyLong_AsInt() */
4676 PyErr_SetString(PyExc_TypeError,
4677 "Invalid or missing argument 'op'");
4678 goto finally;
4679 }
4680 /* assoclen is optional but must be >= 0 */
4681 if (assoclenobj != NULL) {
4682 assoclen = _PyLong_AsInt(assoclenobj);
4683 if (assoclen == -1 && PyErr_Occurred()) {
4684 goto finally;
4685 }
4686 if (assoclen < 0) {
4687 PyErr_SetString(PyExc_TypeError,
4688 "assoclen must be positive");
4689 goto finally;
4690 }
4691 }
4692
4693 controllen = CMSG_SPACE(4);
4694 if (iv.buf != NULL) {
4695 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4696 }
4697 if (assoclen >= 0) {
4698 controllen += CMSG_SPACE(4);
4699 }
4700
4701 controlbuf = PyMem_Malloc(controllen);
4702 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004703 PyErr_NoMemory();
4704 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004705 }
4706 memset(controlbuf, 0, controllen);
4707
Christian Heimesdffa3942016-09-05 23:54:41 +02004708 msg.msg_controllen = controllen;
4709 msg.msg_control = controlbuf;
4710
4711 /* Fill in an iovec for each message part, and save the Py_buffer
4712 structs to release afterwards. */
4713 if (data_arg != NULL) {
4714 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4715 goto finally;
4716 }
4717 }
4718
4719 /* set operation to encrypt or decrypt */
4720 header = CMSG_FIRSTHDR(&msg);
4721 if (header == NULL) {
4722 PyErr_SetString(PyExc_RuntimeError,
4723 "unexpected NULL result from CMSG_FIRSTHDR");
4724 goto finally;
4725 }
4726 header->cmsg_level = SOL_ALG;
4727 header->cmsg_type = ALG_SET_OP;
4728 header->cmsg_len = CMSG_LEN(4);
4729 uiptr = (void*)CMSG_DATA(header);
4730 *uiptr = (unsigned int)op;
4731
4732 /* set initialization vector */
4733 if (iv.buf != NULL) {
4734 header = CMSG_NXTHDR(&msg, header);
4735 if (header == NULL) {
4736 PyErr_SetString(PyExc_RuntimeError,
4737 "unexpected NULL result from CMSG_NXTHDR(iv)");
4738 goto finally;
4739 }
4740 header->cmsg_level = SOL_ALG;
4741 header->cmsg_type = ALG_SET_IV;
4742 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4743 alg_iv = (void*)CMSG_DATA(header);
4744 alg_iv->ivlen = iv.len;
4745 memcpy(alg_iv->iv, iv.buf, iv.len);
4746 }
4747
4748 /* set length of associated data for AEAD */
4749 if (assoclen >= 0) {
4750 header = CMSG_NXTHDR(&msg, header);
4751 if (header == NULL) {
4752 PyErr_SetString(PyExc_RuntimeError,
4753 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4754 goto finally;
4755 }
4756 header->cmsg_level = SOL_ALG;
4757 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4758 header->cmsg_len = CMSG_LEN(4);
4759 uiptr = (void*)CMSG_DATA(header);
4760 *uiptr = (unsigned int)assoclen;
4761 }
4762
4763 ctx.msg = &msg;
4764 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004765 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004766 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004767 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004768
4769 retval = PyLong_FromSsize_t(ctx.result);
4770
4771 finally:
4772 PyMem_Free(controlbuf);
4773 if (iv.buf != NULL) {
4774 PyBuffer_Release(&iv);
4775 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004776 PyMem_Free(msg.msg_iov);
4777 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004778 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004779 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004780 PyMem_Free(databufs);
4781 return retval;
4782}
4783
4784PyDoc_STRVAR(sendmsg_afalg_doc,
4785"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4786\n\
4787Set operation mode, IV and length of associated data for an AF_ALG\n\
4788operation socket.");
4789#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004790
Guido van Rossum30a685f1991-06-27 15:51:29 +00004791/* s.shutdown(how) method */
4792
Guido van Rossum73624e91994-10-10 17:59:00 +00004793static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004794sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 int how;
4797 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004798
Serhiy Storchaka78980432013-01-15 01:12:17 +02004799 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 if (how == -1 && PyErr_Occurred())
4801 return NULL;
4802 Py_BEGIN_ALLOW_THREADS
4803 res = shutdown(s->sock_fd, how);
4804 Py_END_ALLOW_THREADS
4805 if (res < 0)
4806 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004807 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004808}
4809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004810PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004811"shutdown(flag)\n\
4812\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004813Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4814of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004815
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004816#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004817static PyObject*
4818sock_ioctl(PySocketSockObject *s, PyObject *arg)
4819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 unsigned long cmd = SIO_RCVALL;
4821 PyObject *argO;
4822 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4825 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 switch (cmd) {
4828 case SIO_RCVALL: {
4829 unsigned int option = RCVALL_ON;
4830 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4831 return NULL;
4832 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4833 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4834 return set_error();
4835 }
4836 return PyLong_FromUnsignedLong(recv); }
4837 case SIO_KEEPALIVE_VALS: {
4838 struct tcp_keepalive ka;
4839 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4840 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4841 return NULL;
4842 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4843 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4844 return set_error();
4845 }
4846 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004847#if defined(SIO_LOOPBACK_FAST_PATH)
4848 case SIO_LOOPBACK_FAST_PATH: {
4849 unsigned int option;
4850 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4851 return NULL;
4852 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4853 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4854 return set_error();
4855 }
4856 return PyLong_FromUnsignedLong(recv); }
4857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004859 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 return NULL;
4861 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004862}
4863PyDoc_STRVAR(sock_ioctl_doc,
4864"ioctl(cmd, option) -> long\n\
4865\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004866Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4867SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004868SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4869SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004870#endif
4871
4872#if defined(MS_WINDOWS)
4873static PyObject*
4874sock_share(PySocketSockObject *s, PyObject *arg)
4875{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004876 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004877 DWORD processId;
4878 int result;
4879
4880 if (!PyArg_ParseTuple(arg, "I", &processId))
4881 return NULL;
4882
4883 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004884 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004885 Py_END_ALLOW_THREADS
4886 if (result == SOCKET_ERROR)
4887 return set_error();
4888 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4889}
4890PyDoc_STRVAR(sock_share_doc,
4891"share(process_id) -> bytes\n\
4892\n\
4893Share the socket with another process. The target process id\n\
4894must be provided and the resulting bytes object passed to the target\n\
4895process. There the shared socket can be instantiated by calling\n\
4896socket.fromshare().");
4897
Christian Heimesfaf2f632008-01-06 16:59:19 +00004898
4899#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004900
4901/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004902
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004903static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4905 accept_doc},
4906 {"bind", (PyCFunction)sock_bind, METH_O,
4907 bind_doc},
4908 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004909 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 {"connect", (PyCFunction)sock_connect, METH_O,
4911 connect_doc},
4912 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4913 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004914 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4915 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4917 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004918#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 {"getpeername", (PyCFunction)sock_getpeername,
4920 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 {"getsockname", (PyCFunction)sock_getsockname,
4923 METH_NOARGS, getsockname_doc},
4924 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4925 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004926#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4928 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004929#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004930#if defined(MS_WINDOWS)
4931 {"share", (PyCFunction)sock_share, METH_VARARGS,
4932 sock_share_doc},
4933#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004934 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 listen_doc},
4936 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4937 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004938 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 recv_into_doc},
4940 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4941 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004942 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 recvfrom_into_doc},
4944 {"send", (PyCFunction)sock_send, METH_VARARGS,
4945 send_doc},
4946 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4947 sendall_doc},
4948 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4949 sendto_doc},
4950 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4951 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004952 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4953 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4955 settimeout_doc},
4956 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4957 gettimeout_doc},
4958 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4959 setsockopt_doc},
4960 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4961 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004962#ifdef CMSG_LEN
4963 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4964 recvmsg_doc},
4965 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4966 recvmsg_into_doc,},
4967 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4968 sendmsg_doc},
4969#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004970#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004971 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004972 sendmsg_afalg_doc},
4973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004975};
4976
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004977/* SockObject members */
4978static PyMemberDef sock_memberlist[] = {
4979 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4980 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4981 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004982 {0},
4983};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004984
Victor Stinner71694d52015-03-28 01:18:54 +01004985static PyGetSetDef sock_getsetlist[] = {
4986 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4987 {NULL} /* sentinel */
4988};
4989
Guido van Rossum73624e91994-10-10 17:59:00 +00004990/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004991 First close the file description. */
4992
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004993static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004994sock_finalize(PySocketSockObject *s)
4995{
4996 SOCKET_T fd;
4997 PyObject *error_type, *error_value, *error_traceback;
4998
4999 /* Save the current exception, if any. */
5000 PyErr_Fetch(&error_type, &error_value, &error_traceback);
5001
Victor Stinnerd3afb622016-07-22 17:47:09 +02005002 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005003 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5004 /* Spurious errors can appear at shutdown */
5005 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5006 PyErr_WriteUnraisable((PyObject *)s);
5007 }
5008 }
5009
5010 /* Only close the socket *after* logging the ResourceWarning warning
5011 to allow the logger to call socket methods like
5012 socket.getsockname(). If the socket is closed before, socket
5013 methods fails with the EBADF error. */
5014 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005015 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005016
5017 /* We do not want to retry upon EINTR: see sock_close() */
5018 Py_BEGIN_ALLOW_THREADS
5019 (void) SOCKETCLOSE(fd);
5020 Py_END_ALLOW_THREADS
5021 }
5022
5023 /* Restore the saved exception. */
5024 PyErr_Restore(error_type, error_value, error_traceback);
5025}
5026
5027static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005028sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005029{
Victor Stinner19a8e842016-03-21 16:36:48 +01005030 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5031 return;
5032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005034}
5035
Guido van Rossum30a685f1991-06-27 15:51:29 +00005036
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005037static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005038sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005039{
Victor Stinnere254e532014-07-26 14:36:55 +02005040 long sock_fd;
5041 /* On Windows, this test is needed because SOCKET_T is unsigned */
5042 if (s->sock_fd == INVALID_SOCKET) {
5043 sock_fd = -1;
5044 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005045#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005046 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 /* this can occur on Win64, and actually there is a special
5048 ugly printf formatter for decimal pointer length integer
5049 printing, only bother if necessary*/
5050 PyErr_SetString(PyExc_OverflowError,
5051 "no printf formatter to display "
5052 "the socket descriptor in decimal");
5053 return NULL;
5054 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005055#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005056 else
5057 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 return PyUnicode_FromFormat(
5059 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005060 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005061 s->sock_type,
5062 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005063}
5064
5065
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005066/* Create a new, uninitialized socket object. */
5067
5068static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005069sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 new = type->tp_alloc(type, 0);
5074 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005075 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005076 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 ((PySocketSockObject *)new)->errorhandler = &set_error;
5078 }
5079 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005080}
5081
5082
5083/* Initialize a new socket object. */
5084
Victor Stinnerdaf45552013-08-28 00:53:59 +02005085#ifdef SOCK_CLOEXEC
5086/* socket() and socketpair() fail with EINVAL on Linux kernel older
5087 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5088static int sock_cloexec_works = -1;
5089#endif
5090
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005091/*ARGSUSED*/
5092static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005093sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 PySocketSockObject *s = (PySocketSockObject *)self;
5096 PyObject *fdobj = NULL;
5097 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005098 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005100#ifndef MS_WINDOWS
5101#ifdef SOCK_CLOEXEC
5102 int *atomic_flag_works = &sock_cloexec_works;
5103#else
5104 int *atomic_flag_works = NULL;
5105#endif
5106#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5109 "|iiiO:socket", keywords,
5110 &family, &type, &proto, &fdobj))
5111 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005112
Steve Dowerb82e17e2019-05-23 08:45:22 -07005113#ifdef MS_WINDOWS
5114 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005115 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005116#endif
5117 {
5118 if (PySys_Audit("socket.__new__", "Oiii",
5119 s, family, type, proto) < 0) {
5120 return -1;
5121 }
5122 }
5123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005125#ifdef MS_WINDOWS
5126 /* recreate a socket that was duplicated */
5127 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005128 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005129 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5130 PyErr_Format(PyExc_ValueError,
5131 "socket descriptor string has wrong size, "
5132 "should be %zu bytes.", sizeof(info));
5133 return -1;
5134 }
5135 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005136
Steve Dower63ba5cc2020-03-31 12:38:53 +01005137 if (PySys_Audit("socket.__new__", "Oiii", s,
5138 info.iAddressFamily, info.iSocketType,
5139 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005140 return -1;
5141 }
5142
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005143 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005144 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005145 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5146 Py_END_ALLOW_THREADS
5147 if (fd == INVALID_SOCKET) {
5148 set_error();
5149 return -1;
5150 }
5151 family = info.iAddressFamily;
5152 type = info.iSocketType;
5153 proto = info.iProtocol;
5154 }
5155 else
5156#endif
5157 {
Dima Tisneke9912702018-12-17 22:07:55 +09005158 fd = PyLong_AsSocket_t(fdobj);
5159 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5160 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005161#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005162 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005163#else
Dima Tisneke9912702018-12-17 22:07:55 +09005164 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005165#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005166 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5167 return -1;
5168 }
5169
5170 /* validate that passed file descriptor is valid and a socket. */
5171 sock_addr_t addrbuf;
5172 socklen_t addrlen = sizeof(sock_addr_t);
5173
5174 memset(&addrbuf, 0, addrlen);
5175 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5176 if (family == -1) {
5177 family = SAS2SA(&addrbuf)->sa_family;
5178 }
5179 } else {
5180#ifdef MS_WINDOWS
5181 /* getsockname() on an unbound socket is an error on Windows.
5182 Invalid descriptor and not a socket is same error code.
5183 Error out if family must be resolved, or bad descriptor. */
5184 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5185#else
5186 /* getsockname() is not supported for SOL_ALG on Linux. */
5187 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5188#endif
5189 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005190 return -1;
5191 }
5192 }
5193#ifdef SO_TYPE
5194 if (type == -1) {
5195 int tmp;
5196 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005197 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5198 (void *)&tmp, &slen) == 0)
5199 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005200 type = tmp;
5201 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005202 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005203 return -1;
5204 }
5205 }
5206#else
5207 type = SOCK_STREAM;
5208#endif
5209#ifdef SO_PROTOCOL
5210 if (proto == -1) {
5211 int tmp;
5212 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005213 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5214 (void *)&tmp, &slen) == 0)
5215 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005216 proto = tmp;
5217 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005218 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005219 return -1;
5220 }
5221 }
5222#else
5223 proto = 0;
5224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 }
5226 }
5227 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005228 /* No fd, default to AF_INET and SOCK_STREAM */
5229 if (family == -1) {
5230 family = AF_INET;
5231 }
5232 if (type == -1) {
5233 type = SOCK_STREAM;
5234 }
5235 if (proto == -1) {
5236 proto = 0;
5237 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005238#ifdef MS_WINDOWS
5239 /* Windows implementation */
5240#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5241#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5242#endif
5243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005245 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005246 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005247 NULL, 0,
5248 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5249 if (fd == INVALID_SOCKET) {
5250 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5251 support_wsa_no_inherit = 0;
5252 fd = socket(family, type, proto);
5253 }
5254 }
5255 else {
5256 fd = socket(family, type, proto);
5257 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 if (fd == INVALID_SOCKET) {
5261 set_error();
5262 return -1;
5263 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005264
5265 if (!support_wsa_no_inherit) {
5266 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5267 closesocket(fd);
5268 PyErr_SetFromWindowsErr(0);
5269 return -1;
5270 }
5271 }
5272#else
5273 /* UNIX */
5274 Py_BEGIN_ALLOW_THREADS
5275#ifdef SOCK_CLOEXEC
5276 if (sock_cloexec_works != 0) {
5277 fd = socket(family, type | SOCK_CLOEXEC, proto);
5278 if (sock_cloexec_works == -1) {
5279 if (fd >= 0) {
5280 sock_cloexec_works = 1;
5281 }
5282 else if (errno == EINVAL) {
5283 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5284 sock_cloexec_works = 0;
5285 fd = socket(family, type, proto);
5286 }
5287 }
5288 }
5289 else
5290#endif
5291 {
5292 fd = socket(family, type, proto);
5293 }
5294 Py_END_ALLOW_THREADS
5295
5296 if (fd == INVALID_SOCKET) {
5297 set_error();
5298 return -1;
5299 }
5300
5301 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5302 SOCKETCLOSE(fd);
5303 return -1;
5304 }
5305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005307 if (init_sockobject(s, fd, family, type, proto) == -1) {
5308 SOCKETCLOSE(fd);
5309 return -1;
5310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005313
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005314}
5315
5316
Guido van Rossumb6775db1994-08-01 11:34:53 +00005317/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005318
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005319static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5321 "_socket.socket", /* tp_name */
5322 sizeof(PySocketSockObject), /* tp_basicsize */
5323 0, /* tp_itemsize */
5324 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005325 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 0, /* tp_getattr */
5327 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005328 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 (reprfunc)sock_repr, /* tp_repr */
5330 0, /* tp_as_number */
5331 0, /* tp_as_sequence */
5332 0, /* tp_as_mapping */
5333 0, /* tp_hash */
5334 0, /* tp_call */
5335 0, /* tp_str */
5336 PyObject_GenericGetAttr, /* tp_getattro */
5337 0, /* tp_setattro */
5338 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005339 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 sock_doc, /* tp_doc */
5341 0, /* tp_traverse */
5342 0, /* tp_clear */
5343 0, /* tp_richcompare */
5344 0, /* tp_weaklistoffset */
5345 0, /* tp_iter */
5346 0, /* tp_iternext */
5347 sock_methods, /* tp_methods */
5348 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005349 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 0, /* tp_base */
5351 0, /* tp_dict */
5352 0, /* tp_descr_get */
5353 0, /* tp_descr_set */
5354 0, /* tp_dictoffset */
5355 sock_initobj, /* tp_init */
5356 PyType_GenericAlloc, /* tp_alloc */
5357 sock_new, /* tp_new */
5358 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005359 0, /* tp_is_gc */
5360 0, /* tp_bases */
5361 0, /* tp_mro */
5362 0, /* tp_cache */
5363 0, /* tp_subclasses */
5364 0, /* tp_weaklist */
5365 0, /* tp_del */
5366 0, /* tp_version_tag */
5367 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005368};
5369
Guido van Rossum30a685f1991-06-27 15:51:29 +00005370
Guido van Rossum81194471991-07-27 21:42:02 +00005371/* Python interface to gethostname(). */
5372
5373/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005374static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005375socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005376{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005377 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5378 return NULL;
5379 }
5380
Martin v. Löwis72f48422010-10-29 18:20:08 +00005381#ifdef MS_WINDOWS
5382 /* Don't use winsock's gethostname, as this returns the ANSI
5383 version of the hostname, whereas we need a Unicode string.
5384 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005385 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005386 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005387 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005388 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005389
5390 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005391 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005392
5393 if (GetLastError() != ERROR_MORE_DATA)
5394 return PyErr_SetFromWindowsErr(0);
5395
5396 if (size == 0)
5397 return PyUnicode_New(0, 0);
5398
5399 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5400 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005401 name = PyMem_New(wchar_t, size);
5402 if (!name) {
5403 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005404 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005405 }
Victor Stinner74168972011-11-17 01:11:36 +01005406 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5407 name,
5408 &size))
5409 {
5410 PyMem_Free(name);
5411 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005412 }
Victor Stinner74168972011-11-17 01:11:36 +01005413
5414 result = PyUnicode_FromWideChar(name, size);
5415 PyMem_Free(name);
5416 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005417#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 char buf[1024];
5419 int res;
5420 Py_BEGIN_ALLOW_THREADS
5421 res = gethostname(buf, (int) sizeof buf - 1);
5422 Py_END_ALLOW_THREADS
5423 if (res < 0)
5424 return set_error();
5425 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005426 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005427#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005428}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005430PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005431"gethostname() -> string\n\
5432\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005433Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005434
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005435#ifdef HAVE_SETHOSTNAME
5436PyDoc_STRVAR(sethostname_doc,
5437"sethostname(name)\n\n\
5438Sets the hostname to name.");
5439
5440static PyObject *
5441socket_sethostname(PyObject *self, PyObject *args)
5442{
5443 PyObject *hnobj;
5444 Py_buffer buf;
5445 int res, flag = 0;
5446
Christian Heimesd2774c72013-06-19 02:06:29 +02005447#ifdef _AIX
5448/* issue #18259, not declared in any useful header file */
5449extern int sethostname(const char *, size_t);
5450#endif
5451
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005452 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5453 PyErr_Clear();
5454 if (!PyArg_ParseTuple(args, "O&:sethostname",
5455 PyUnicode_FSConverter, &hnobj))
5456 return NULL;
5457 flag = 1;
5458 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005459
5460 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5461 return NULL;
5462 }
5463
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005464 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5465 if (!res) {
5466 res = sethostname(buf.buf, buf.len);
5467 PyBuffer_Release(&buf);
5468 }
5469 if (flag)
5470 Py_DECREF(hnobj);
5471 if (res)
5472 return set_error();
5473 Py_RETURN_NONE;
5474}
5475#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005476
Guido van Rossum30a685f1991-06-27 15:51:29 +00005477/* Python interface to gethostbyname(name). */
5478
5479/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005480static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005481socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005484 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005485 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005486
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005487 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005489 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5490 goto finally;
5491 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005492 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005493 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005494 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005495finally:
5496 PyMem_Free(name);
5497 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005498}
5499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005500PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005501"gethostbyname(host) -> address\n\
5502\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005503Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005504
5505
Victor Stinner72400302016-01-28 15:41:01 +01005506static PyObject*
5507sock_decode_hostname(const char *name)
5508{
5509#ifdef MS_WINDOWS
5510 /* Issue #26227: gethostbyaddr() returns a string encoded
5511 * to the ANSI code page */
5512 return PyUnicode_DecodeFSDefault(name);
5513#else
5514 /* Decode from UTF-8 */
5515 return PyUnicode_FromString(name);
5516#endif
5517}
5518
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005519/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5520
5521static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005522gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 char **pch;
5525 PyObject *rtn_tuple = (PyObject *)NULL;
5526 PyObject *name_list = (PyObject *)NULL;
5527 PyObject *addr_list = (PyObject *)NULL;
5528 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005529 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 if (h == NULL) {
5532 /* Let's get real error message to return */
5533 set_herror(h_errno);
5534 return NULL;
5535 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 if (h->h_addrtype != af) {
5538 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005539 errno = EAFNOSUPPORT;
5540 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 return NULL;
5542 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 case AF_INET:
5547 if (alen < sizeof(struct sockaddr_in))
5548 return NULL;
5549 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005550
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005551#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 case AF_INET6:
5553 if (alen < sizeof(struct sockaddr_in6))
5554 return NULL;
5555 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005556#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 if ((name_list = PyList_New(0)) == NULL)
5561 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 if ((addr_list = PyList_New(0)) == NULL)
5564 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 /* SF #1511317: h_aliases can be NULL */
5567 if (h->h_aliases) {
5568 for (pch = h->h_aliases; *pch != NULL; pch++) {
5569 int status;
5570 tmp = PyUnicode_FromString(*pch);
5571 if (tmp == NULL)
5572 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 status = PyList_Append(name_list, tmp);
5575 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 if (status)
5578 goto err;
5579 }
5580 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5583 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 case AF_INET:
5588 {
5589 struct sockaddr_in sin;
5590 memset(&sin, 0, sizeof(sin));
5591 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005592#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005596 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 if (pch == h->h_addr_list && alen >= sizeof(sin))
5599 memcpy((char *) addr, &sin, sizeof(sin));
5600 break;
5601 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005602
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005603#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 case AF_INET6:
5605 {
5606 struct sockaddr_in6 sin6;
5607 memset(&sin6, 0, sizeof(sin6));
5608 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005609#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005613 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5616 memcpy((char *) addr, &sin6, sizeof(sin6));
5617 break;
5618 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005619#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005622 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 "unsupported address family");
5624 return NULL;
5625 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 if (tmp == NULL)
5628 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 status = PyList_Append(addr_list, tmp);
5631 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 if (status)
5634 goto err;
5635 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005636
Victor Stinner72400302016-01-28 15:41:01 +01005637 name = sock_decode_hostname(h->h_name);
5638 if (name == NULL)
5639 goto err;
5640 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005641
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005642 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 Py_XDECREF(name_list);
5644 Py_XDECREF(addr_list);
5645 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005646}
5647
5648
5649/* Python interface to gethostbyname_ex(name). */
5650
5651/*ARGSUSED*/
5652static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005653socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 char *name;
5656 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005657 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005659 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005660#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005662#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005664#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 char buf[16384];
5666 int buf_len = (sizeof buf) - 1;
5667 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005668#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005669#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005671#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005672#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005673
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005674 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005676 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5677 goto finally;
5678 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005679 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005680 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005682#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005683#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005684 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005686#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005688#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 memset((void *) &data, '\0', sizeof(data));
5690 result = gethostbyname_r(name, &hp_allocated, &data);
5691 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005692#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005693#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005694#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005696#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005697 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005699#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 Py_END_ALLOW_THREADS
5701 /* Some C libraries would require addr.__ss_family instead of
5702 addr.ss_family.
5703 Therefore, we cast the sockaddr_storage into sockaddr to
5704 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005705 sa = SAS2SA(&addr);
5706 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005708#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005710#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005711finally:
5712 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005714}
5715
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005716PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005717"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5718\n\
5719Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005720for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005721
5722
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005723/* Python interface to gethostbyaddr(IP). */
5724
5725/*ARGSUSED*/
5726static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005727socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005728{
Charles-François Natali8b759652011-12-23 16:44:51 +01005729 sock_addr_t addr;
5730 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 char *ip_num;
5732 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005733 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005734#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005736#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005738#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 /* glibcs up to 2.10 assume that the buf argument to
5740 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5741 does not ensure. The attribute below instructs the compiler
5742 to maintain this alignment. */
5743 char buf[16384] Py_ALIGNED(8);
5744 int buf_len = (sizeof buf) - 1;
5745 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005746#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005747#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005749#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005750#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005751 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 int al;
5753 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005754
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005755 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005757 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5758 goto finally;
5759 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 af = AF_UNSPEC;
5761 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005762 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 af = sa->sa_family;
5764 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005765 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 switch (af) {
5767 case AF_INET:
5768 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5769 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5770 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005771#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 case AF_INET6:
5773 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5774 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5775 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005778 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005779 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 }
5781 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005782#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005783#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005784 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005785 &hp_allocated, buf, buf_len,
5786 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005787#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 h = gethostbyaddr_r(ap, al, af,
5789 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005790#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 memset((void *) &data, '\0', sizeof(data));
5792 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5793 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005794#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005795#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005796#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005798#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005799 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005801#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005803 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005804#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005806#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005807finally:
5808 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005810}
5811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005812PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005813"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5814\n\
5815Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005816for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005817
Guido van Rossum30a685f1991-06-27 15:51:29 +00005818
5819/* Python interface to getservbyname(name).
5820 This only returns the port number, since the other info is already
5821 known or not useful (like the list of aliases). */
5822
5823/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005824static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005825socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005826{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005827 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 struct servent *sp;
5829 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5830 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005831
5832 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5833 return NULL;
5834 }
5835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 Py_BEGIN_ALLOW_THREADS
5837 sp = getservbyname(name, proto);
5838 Py_END_ALLOW_THREADS
5839 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005840 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 return NULL;
5842 }
5843 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005844}
5845
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005846PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005847"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005848\n\
5849Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005850The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5851otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005852
Guido van Rossum30a685f1991-06-27 15:51:29 +00005853
Barry Warsaw11b91a02004-06-28 00:50:43 +00005854/* Python interface to getservbyport(port).
5855 This only returns the service name, since the other info is already
5856 known or not useful (like the list of aliases). */
5857
5858/*ARGSUSED*/
5859static PyObject *
5860socket_getservbyport(PyObject *self, PyObject *args)
5861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005863 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 struct servent *sp;
5865 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5866 return NULL;
5867 if (port < 0 || port > 0xffff) {
5868 PyErr_SetString(
5869 PyExc_OverflowError,
5870 "getservbyport: port must be 0-65535.");
5871 return NULL;
5872 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005873
5874 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5875 return NULL;
5876 }
5877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 Py_BEGIN_ALLOW_THREADS
5879 sp = getservbyport(htons((short)port), proto);
5880 Py_END_ALLOW_THREADS
5881 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005882 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 return NULL;
5884 }
5885 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005886}
5887
5888PyDoc_STRVAR(getservbyport_doc,
5889"getservbyport(port[, protocolname]) -> string\n\
5890\n\
5891Return the service name from a port number and protocol name.\n\
5892The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5893otherwise any protocol will match.");
5894
Guido van Rossum3901d851996-12-19 16:35:04 +00005895/* Python interface to getprotobyname(name).
5896 This only returns the protocol number, since the other info is
5897 already known or not useful (like the list of aliases). */
5898
5899/*ARGSUSED*/
5900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005901socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005902{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005903 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 struct protoent *sp;
5905 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5906 return NULL;
5907 Py_BEGIN_ALLOW_THREADS
5908 sp = getprotobyname(name);
5909 Py_END_ALLOW_THREADS
5910 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005911 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 return NULL;
5913 }
5914 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005915}
5916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005917PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005918"getprotobyname(name) -> integer\n\
5919\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005920Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005921
Christian Heimesd0e31b92018-01-27 09:54:13 +01005922static PyObject *
5923socket_close(PyObject *self, PyObject *fdobj)
5924{
5925 SOCKET_T fd;
5926 int res;
5927
5928 fd = PyLong_AsSocket_t(fdobj);
5929 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5930 return NULL;
5931 Py_BEGIN_ALLOW_THREADS
5932 res = SOCKETCLOSE(fd);
5933 Py_END_ALLOW_THREADS
5934 /* bpo-30319: The peer can already have closed the connection.
5935 Python ignores ECONNRESET on close(). */
5936 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5937 return set_error();
5938 }
5939 Py_RETURN_NONE;
5940}
5941
5942PyDoc_STRVAR(close_doc,
5943"close(integer) -> None\n\
5944\n\
5945Close an integer socket file descriptor. This is like os.close(), but for\n\
5946sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005947
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005948#ifndef NO_DUP
5949/* dup() function for socket fds */
5950
5951static PyObject *
5952socket_dup(PyObject *self, PyObject *fdobj)
5953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 SOCKET_T fd, newfd;
5955 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005956#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005957 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005958#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 fd = PyLong_AsSocket_t(fdobj);
5961 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5962 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005963
Victor Stinnerdaf45552013-08-28 00:53:59 +02005964#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005965 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005966 return set_error();
5967
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005968 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005969 FROM_PROTOCOL_INFO,
5970 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 if (newfd == INVALID_SOCKET)
5972 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005973
Victor Stinnerdaf45552013-08-28 00:53:59 +02005974 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5975 closesocket(newfd);
5976 PyErr_SetFromWindowsErr(0);
5977 return NULL;
5978 }
5979#else
5980 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5981 newfd = _Py_dup(fd);
5982 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005983 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005984#endif
5985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 newfdobj = PyLong_FromSocket_t(newfd);
5987 if (newfdobj == NULL)
5988 SOCKETCLOSE(newfd);
5989 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005990}
5991
5992PyDoc_STRVAR(dup_doc,
5993"dup(integer) -> integer\n\
5994\n\
5995Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5996sockets; on some platforms os.dup() won't work for socket file descriptors.");
5997#endif
5998
5999
Dave Cole331708b2004-08-09 04:51:41 +00006000#ifdef HAVE_SOCKETPAIR
6001/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006002 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006003 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006004
6005/*ARGSUSED*/
6006static PyObject *
6007socket_socketpair(PyObject *self, PyObject *args)
6008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 PySocketSockObject *s0 = NULL, *s1 = NULL;
6010 SOCKET_T sv[2];
6011 int family, type = SOCK_STREAM, proto = 0;
6012 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006013#ifdef SOCK_CLOEXEC
6014 int *atomic_flag_works = &sock_cloexec_works;
6015#else
6016 int *atomic_flag_works = NULL;
6017#endif
6018 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006019
6020#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006022#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6026 &family, &type, &proto))
6027 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006030 Py_BEGIN_ALLOW_THREADS
6031#ifdef SOCK_CLOEXEC
6032 if (sock_cloexec_works != 0) {
6033 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6034 if (sock_cloexec_works == -1) {
6035 if (ret >= 0) {
6036 sock_cloexec_works = 1;
6037 }
6038 else if (errno == EINVAL) {
6039 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6040 sock_cloexec_works = 0;
6041 ret = socketpair(family, type, proto, sv);
6042 }
6043 }
6044 }
6045 else
6046#endif
6047 {
6048 ret = socketpair(family, type, proto, sv);
6049 }
6050 Py_END_ALLOW_THREADS
6051
6052 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006054
6055 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6056 goto finally;
6057 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6058 goto finally;
6059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 s0 = new_sockobject(sv[0], family, type, proto);
6061 if (s0 == NULL)
6062 goto finally;
6063 s1 = new_sockobject(sv[1], family, type, proto);
6064 if (s1 == NULL)
6065 goto finally;
6066 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006067
6068finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 if (res == NULL) {
6070 if (s0 == NULL)
6071 SOCKETCLOSE(sv[0]);
6072 if (s1 == NULL)
6073 SOCKETCLOSE(sv[1]);
6074 }
6075 Py_XDECREF(s0);
6076 Py_XDECREF(s1);
6077 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006078}
6079
6080PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006081"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006082\n\
6083Create a pair of socket objects from the sockets returned by the platform\n\
6084socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006085The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006086AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006087
6088#endif /* HAVE_SOCKETPAIR */
6089
6090
Guido van Rossum006bf911996-06-12 04:04:55 +00006091static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006092socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006093{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006094 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006095
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006096 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 return NULL;
6098 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006099 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006101 "ntohs: can't convert negative Python int to C "
6102 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 return NULL;
6104 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006105 if (x > 0xffff) {
6106 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6107 "ntohs: Python int too large to convert to C "
6108 "16-bit unsigned integer (The silent truncation "
6109 "is deprecated)",
6110 1)) {
6111 return NULL;
6112 }
6113 }
6114 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006115}
6116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006117PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006118"ntohs(integer) -> integer\n\
6119\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006120Convert a 16-bit unsigned integer from network to host byte order.\n\
6121Note that in case the received integer does not fit in 16-bit unsigned\n\
6122integer, but does fit in a positive C int, it is silently truncated to\n\
612316-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006124However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006125exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006126
6127
Guido van Rossum006bf911996-06-12 04:04:55 +00006128static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006129socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 if (PyLong_Check(arg)) {
6134 x = PyLong_AsUnsignedLong(arg);
6135 if (x == (unsigned long) -1 && PyErr_Occurred())
6136 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006137#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 {
6139 unsigned long y;
6140 /* only want the trailing 32 bits */
6141 y = x & 0xFFFFFFFFUL;
6142 if (y ^ x)
6143 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006144 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 x = y;
6146 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 }
6149 else
6150 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006151 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006154}
6155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006156PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006157"ntohl(integer) -> integer\n\
6158\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006159Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006160
6161
Guido van Rossum006bf911996-06-12 04:04:55 +00006162static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006163socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006164{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006165 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006166
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006167 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 return NULL;
6169 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006170 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006172 "htons: can't convert negative Python int to C "
6173 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 return NULL;
6175 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006176 if (x > 0xffff) {
6177 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6178 "htons: Python int too large to convert to C "
6179 "16-bit unsigned integer (The silent truncation "
6180 "is deprecated)",
6181 1)) {
6182 return NULL;
6183 }
6184 }
6185 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006186}
6187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006188PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006189"htons(integer) -> integer\n\
6190\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006191Convert a 16-bit unsigned integer from host to network byte order.\n\
6192Note that in case the received integer does not fit in 16-bit unsigned\n\
6193integer, but does fit in a positive C int, it is silently truncated to\n\
619416-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006195However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006196exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006197
6198
Guido van Rossum006bf911996-06-12 04:04:55 +00006199static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006200socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 if (PyLong_Check(arg)) {
6205 x = PyLong_AsUnsignedLong(arg);
6206 if (x == (unsigned long) -1 && PyErr_Occurred())
6207 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006208#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209 {
6210 unsigned long y;
6211 /* only want the trailing 32 bits */
6212 y = x & 0xFFFFFFFFUL;
6213 if (y ^ x)
6214 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006215 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 x = y;
6217 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 }
6220 else
6221 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006222 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 Py_TYPE(arg)->tp_name);
6224 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006225}
6226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006227PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006228"htonl(integer) -> integer\n\
6229\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006230Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006231
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006232/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006233
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006234PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006235"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006236\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006237Convert 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 +00006238binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006239
6240static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006241socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006242{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006243#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006245#endif
6246
6247#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006248#if (SIZEOF_INT != 4)
6249#error "Not sure if in_addr_t exists and int is not 32-bits."
6250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 /* Have to use inet_addr() instead */
6252 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006253#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006254 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6257 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006258
Tim Peters1df9fdd2003-02-13 03:13:40 +00006259
6260#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006261
6262#ifdef USE_INET_ATON_WEAKLINK
6263 if (inet_aton != NULL) {
6264#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 if (inet_aton(ip_addr, &buf))
6266 return PyBytes_FromStringAndSize((char *)(&buf),
6267 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006268
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006269 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 "illegal IP address string passed to inet_aton");
6271 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006272
Thomas Wouters477c8d52006-05-27 19:21:47 +00006273#ifdef USE_INET_ATON_WEAKLINK
6274 } else {
6275#endif
6276
6277#endif
6278
6279#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 /* special-case this address as inet_addr might return INADDR_NONE
6282 * for this */
6283 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006284 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006286
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006287 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006291 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 "illegal IP address string passed to inet_aton");
6293 return NULL;
6294 }
6295 }
6296 return PyBytes_FromStringAndSize((char *) &packed_addr,
6297 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006298
6299#ifdef USE_INET_ATON_WEAKLINK
6300 }
6301#endif
6302
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006303#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006304}
6305
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006306PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006307"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006308\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006309Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006310
6311static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006312socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006313{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006314 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006316
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006317 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 return NULL;
6319 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006320
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006321 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006322 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006324 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 return NULL;
6326 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006327
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006328 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6329 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006330
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006331 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006333}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006334
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006335#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006336
6337PyDoc_STRVAR(inet_pton_doc,
6338"inet_pton(af, ip) -> packed IP address string\n\
6339\n\
6340Convert an IP address from string format to a packed string suitable\n\
6341for use with low-level network functions.");
6342
6343static PyObject *
6344socket_inet_pton(PyObject *self, PyObject *args)
6345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006347 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006349#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006350 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006351#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6355 return NULL;
6356 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006357
Martin v. Löwis04697e82004-06-02 12:35:29 +00006358#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006360 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 "can't use AF_INET6, IPv6 is disabled");
6362 return NULL;
6363 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006364#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 retval = inet_pton(af, ip, packed);
6367 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006368 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 return NULL;
6370 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006371 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 "illegal IP address string passed to inet_pton");
6373 return NULL;
6374 } else if (af == AF_INET) {
6375 return PyBytes_FromStringAndSize(packed,
6376 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006377#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 } else if (af == AF_INET6) {
6379 return PyBytes_FromStringAndSize(packed,
6380 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006383 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384 return NULL;
6385 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006386}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006387
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006388PyDoc_STRVAR(inet_ntop_doc,
6389"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6390\n\
6391Convert a packed IP address of the given family to string format.");
6392
6393static PyObject *
6394socket_inet_ntop(PyObject *self, PyObject *args)
6395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006397 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006399#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006400 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006401#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006402 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006403#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006404
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006405 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 return NULL;
6407 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006410 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 PyErr_SetString(PyExc_ValueError,
6412 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006413 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 return NULL;
6415 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006416#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006418 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 PyErr_SetString(PyExc_ValueError,
6420 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006421 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422 return NULL;
6423 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 } else {
6426 PyErr_Format(PyExc_ValueError,
6427 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006428 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 return NULL;
6430 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006431
Коренберг Марк7766b962018-02-13 00:47:42 +05006432 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006433 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6434 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006436 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437 return NULL;
6438 } else {
6439 return PyUnicode_FromString(retval);
6440 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006441}
6442
6443#endif /* HAVE_INET_PTON */
6444
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006445/* Python interface to getaddrinfo(host, port). */
6446
6447/*ARGSUSED*/
6448static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006449socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006450{
Victor Stinner77af1722011-05-26 14:05:59 +02006451 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006452 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 struct addrinfo hints, *res;
6454 struct addrinfo *res0 = NULL;
6455 PyObject *hobj = NULL;
6456 PyObject *pobj = (PyObject *)NULL;
6457 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006458 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 int family, socktype, protocol, flags;
6460 int error;
6461 PyObject *all = (PyObject *)NULL;
6462 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006463
Georg Brandl6083a4b2013-10-14 06:51:46 +02006464 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006466 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006467 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 &protocol, &flags)) {
6469 return NULL;
6470 }
6471 if (hobj == Py_None) {
6472 hptr = NULL;
6473 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006474 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 if (!idna)
6476 return NULL;
6477 assert(PyBytes_Check(idna));
6478 hptr = PyBytes_AS_STRING(idna);
6479 } else if (PyBytes_Check(hobj)) {
6480 hptr = PyBytes_AsString(hobj);
6481 } else {
6482 PyErr_SetString(PyExc_TypeError,
6483 "getaddrinfo() argument 1 must be string or None");
6484 return NULL;
6485 }
6486 if (PyLong_CheckExact(pobj)) {
6487 long value = PyLong_AsLong(pobj);
6488 if (value == -1 && PyErr_Occurred())
6489 goto err;
6490 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6491 pptr = pbuf;
6492 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006493 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006494 if (pptr == NULL)
6495 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006497 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498 } else if (pobj == Py_None) {
6499 pptr = (char *)NULL;
6500 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006501 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 goto err;
6503 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006504#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006505 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006506 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006507 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6508 * This workaround avoids a segfault in libsystem.
6509 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006510 pptr = "00";
6511 }
6512#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006513
6514 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6515 hobj, pobj, family, socktype, protocol) < 0) {
6516 return NULL;
6517 }
6518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519 memset(&hints, 0, sizeof(hints));
6520 hints.ai_family = family;
6521 hints.ai_socktype = socktype;
6522 hints.ai_protocol = protocol;
6523 hints.ai_flags = flags;
6524 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 error = getaddrinfo(hptr, pptr, &hints, &res0);
6526 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527 if (error) {
6528 set_gaierror(error);
6529 goto err;
6530 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006531
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006532 all = PyList_New(0);
6533 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 goto err;
6535 for (res = res0; res; res = res->ai_next) {
6536 PyObject *single;
6537 PyObject *addr =
6538 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6539 if (addr == NULL)
6540 goto err;
6541 single = Py_BuildValue("iiisO", res->ai_family,
6542 res->ai_socktype, res->ai_protocol,
6543 res->ai_canonname ? res->ai_canonname : "",
6544 addr);
6545 Py_DECREF(addr);
6546 if (single == NULL)
6547 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006548
Zackery Spytz4c596d52018-11-14 15:39:01 -07006549 if (PyList_Append(all, single)) {
6550 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006552 }
6553 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 }
6555 Py_XDECREF(idna);
6556 if (res0)
6557 freeaddrinfo(res0);
6558 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006559 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 Py_XDECREF(all);
6561 Py_XDECREF(idna);
6562 if (res0)
6563 freeaddrinfo(res0);
6564 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006565}
6566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006567PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006568"getaddrinfo(host, port [, family, type, proto, flags])\n\
6569 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006570\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006571Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006572
6573/* Python interface to getnameinfo(sa, flags). */
6574
6575/*ARGSUSED*/
6576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006577socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 PyObject *sa = (PyObject *)NULL;
6580 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006581 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006582 int port;
6583 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6585 struct addrinfo hints, *res = NULL;
6586 int error;
6587 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006588 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 flags = flowinfo = scope_id = 0;
6591 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6592 return NULL;
6593 if (!PyTuple_Check(sa)) {
6594 PyErr_SetString(PyExc_TypeError,
6595 "getnameinfo() argument 1 must be a tuple");
6596 return NULL;
6597 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006598 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006600 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006602 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006603 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006604 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006605 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006606 return NULL;
6607 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006608
6609 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6610 return NULL;
6611 }
6612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6614 memset(&hints, 0, sizeof(hints));
6615 hints.ai_family = AF_UNSPEC;
6616 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006617 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 error = getaddrinfo(hostp, pbuf, &hints, &res);
6620 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 if (error) {
6622 set_gaierror(error);
6623 goto fail;
6624 }
6625 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006626 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627 "sockaddr resolved to multiple addresses");
6628 goto fail;
6629 }
6630 switch (res->ai_family) {
6631 case AF_INET:
6632 {
6633 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006634 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635 "IPv4 sockaddr must be 2 tuple");
6636 goto fail;
6637 }
6638 break;
6639 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006640#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641 case AF_INET6:
6642 {
6643 struct sockaddr_in6 *sin6;
6644 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006645 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 sin6->sin6_scope_id = scope_id;
6647 break;
6648 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006651 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6653 if (error) {
6654 set_gaierror(error);
6655 goto fail;
6656 }
Victor Stinner72400302016-01-28 15:41:01 +01006657
6658 name = sock_decode_hostname(hbuf);
6659 if (name == NULL)
6660 goto fail;
6661 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006662
6663fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 if (res)
6665 freeaddrinfo(res);
6666 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006667}
6668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006669PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006670"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006671\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006672Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006673
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006674
6675/* Python API to getting and setting the default timeout value. */
6676
6677static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306678socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006679{
Victor Stinner71694d52015-03-28 01:18:54 +01006680 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006681 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 }
Victor Stinner71694d52015-03-28 01:18:54 +01006683 else {
6684 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6685 return PyFloat_FromDouble(seconds);
6686 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006687}
6688
6689PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006690"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006691\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006692Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006693A value of None indicates that new socket objects have no timeout.\n\
6694When the socket module is first imported, the default is None.");
6695
6696static PyObject *
6697socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6698{
Victor Stinner71694d52015-03-28 01:18:54 +01006699 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006700
Victor Stinner71694d52015-03-28 01:18:54 +01006701 if (socket_parse_timeout(&timeout, arg) < 0)
6702 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006705
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006706 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006707}
6708
6709PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006710"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006711\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006712Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006713A value of None indicates that new socket objects have no timeout.\n\
6714When the socket module is first imported, the default is None.");
6715
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006716#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006717/* Python API for getting interface indices and names */
6718
6719static PyObject *
6720socket_if_nameindex(PyObject *self, PyObject *arg)
6721{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006722 PyObject *list = PyList_New(0);
6723 if (list == NULL) {
6724 return NULL;
6725 }
6726#ifdef MS_WINDOWS
6727 PMIB_IF_TABLE2 tbl;
6728 int ret;
6729 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6730 Py_DECREF(list);
6731 // ret is used instead of GetLastError()
6732 return PyErr_SetFromWindowsErr(ret);
6733 }
6734 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6735 MIB_IF_ROW2 r = tbl->Table[i];
6736 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6737 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6738 Py_ARRAY_LENGTH(buf)))) {
6739 Py_DECREF(list);
6740 FreeMibTable(tbl);
6741 // ret is used instead of GetLastError()
6742 return PyErr_SetFromWindowsErr(ret);
6743 }
6744 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6745 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6746 Py_XDECREF(tuple);
6747 Py_DECREF(list);
6748 FreeMibTable(tbl);
6749 return NULL;
6750 }
6751 Py_DECREF(tuple);
6752 }
6753 FreeMibTable(tbl);
6754 return list;
6755#else
Charles-François Natali60713592011-05-20 16:55:06 +02006756 int i;
6757 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006758
Charles-François Natali60713592011-05-20 16:55:06 +02006759 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006760 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006761 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006762 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006763 return NULL;
6764 }
6765
Gregory P. Smithb474e672018-12-30 17:05:36 -08006766#ifdef _Py_MEMORY_SANITIZER
6767 __msan_unpoison(ni, sizeof(ni));
6768 __msan_unpoison(&ni[0], sizeof(ni[0]));
6769#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006770 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006771#ifdef _Py_MEMORY_SANITIZER
6772 /* This one isn't the end sentinel, the next one must exist. */
6773 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6774 /* Otherwise Py_BuildValue internals are flagged by MSan when
6775 they access the not-msan-tracked if_name string data. */
6776 {
6777 char *to_sanitize = ni[i].if_name;
6778 do {
6779 __msan_unpoison(to_sanitize, 1);
6780 } while (*to_sanitize++ != '\0');
6781 }
6782#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006783 PyObject *ni_tuple = Py_BuildValue("IO&",
6784 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006785
6786 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6787 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006788 Py_DECREF(list);
6789 if_freenameindex(ni);
6790 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006791 }
6792 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006793 }
6794
6795 if_freenameindex(ni);
6796 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006797#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006798}
6799
6800PyDoc_STRVAR(if_nameindex_doc,
6801"if_nameindex()\n\
6802\n\
6803Returns a list of network interface information (index, name) tuples.");
6804
Charles-François Natali60713592011-05-20 16:55:06 +02006805static PyObject *
6806socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006807{
Charles-François Natali60713592011-05-20 16:55:06 +02006808 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006809#ifdef MS_WINDOWS
6810 NET_IFINDEX index;
6811#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006812 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006813#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006814 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6815 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006816 return NULL;
6817
Charles-François Natali60713592011-05-20 16:55:06 +02006818 index = if_nametoindex(PyBytes_AS_STRING(oname));
6819 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006820 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006821 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006822 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006823 return NULL;
6824 }
6825
6826 return PyLong_FromUnsignedLong(index);
6827}
6828
6829PyDoc_STRVAR(if_nametoindex_doc,
6830"if_nametoindex(if_name)\n\
6831\n\
6832Returns the interface index corresponding to the interface name if_name.");
6833
Charles-François Natali60713592011-05-20 16:55:06 +02006834static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006835socket_if_indextoname(PyObject *self, PyObject *arg)
6836{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006837#ifdef MS_WINDOWS
6838 NET_IFINDEX index;
6839#else
Charles-François Natali60713592011-05-20 16:55:06 +02006840 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006841#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006842 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006843
Charles-François Natali60713592011-05-20 16:55:06 +02006844 index = PyLong_AsUnsignedLong(arg);
6845 if (index == (unsigned long) -1)
6846 return NULL;
6847
6848 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006849 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006850 return NULL;
6851 }
6852
Charles-François Natali60713592011-05-20 16:55:06 +02006853 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006854}
6855
6856PyDoc_STRVAR(if_indextoname_doc,
6857"if_indextoname(if_index)\n\
6858\n\
6859Returns the interface name corresponding to the interface index if_index.");
6860
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006861#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006862
6863
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006864#ifdef CMSG_LEN
6865/* Python interface to CMSG_LEN(length). */
6866
6867static PyObject *
6868socket_CMSG_LEN(PyObject *self, PyObject *args)
6869{
6870 Py_ssize_t length;
6871 size_t result;
6872
6873 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6874 return NULL;
6875 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6876 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6877 return NULL;
6878 }
6879 return PyLong_FromSize_t(result);
6880}
6881
6882PyDoc_STRVAR(CMSG_LEN_doc,
6883"CMSG_LEN(length) -> control message length\n\
6884\n\
6885Return the total length, without trailing padding, of an ancillary\n\
6886data item with associated data of the given length. This value can\n\
6887often be used as the buffer size for recvmsg() to receive a single\n\
6888item of ancillary data, but RFC 3542 requires portable applications to\n\
6889use CMSG_SPACE() and thus include space for padding, even when the\n\
6890item will be the last in the buffer. Raises OverflowError if length\n\
6891is outside the permissible range of values.");
6892
6893
6894#ifdef CMSG_SPACE
6895/* Python interface to CMSG_SPACE(length). */
6896
6897static PyObject *
6898socket_CMSG_SPACE(PyObject *self, PyObject *args)
6899{
6900 Py_ssize_t length;
6901 size_t result;
6902
6903 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6904 return NULL;
6905 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6906 PyErr_SetString(PyExc_OverflowError,
6907 "CMSG_SPACE() argument out of range");
6908 return NULL;
6909 }
6910 return PyLong_FromSize_t(result);
6911}
6912
6913PyDoc_STRVAR(CMSG_SPACE_doc,
6914"CMSG_SPACE(length) -> buffer size\n\
6915\n\
6916Return the buffer size needed for recvmsg() to receive an ancillary\n\
6917data item with associated data of the given length, along with any\n\
6918trailing padding. The buffer space needed to receive multiple items\n\
6919is the sum of the CMSG_SPACE() values for their associated data\n\
6920lengths. Raises OverflowError if length is outside the permissible\n\
6921range of values.");
6922#endif /* CMSG_SPACE */
6923#endif /* CMSG_LEN */
6924
6925
Guido van Rossum30a685f1991-06-27 15:51:29 +00006926/* List of functions exported by this module. */
6927
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006928static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 {"gethostbyname", socket_gethostbyname,
6930 METH_VARARGS, gethostbyname_doc},
6931 {"gethostbyname_ex", socket_gethostbyname_ex,
6932 METH_VARARGS, ghbn_ex_doc},
6933 {"gethostbyaddr", socket_gethostbyaddr,
6934 METH_VARARGS, gethostbyaddr_doc},
6935 {"gethostname", socket_gethostname,
6936 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006937#ifdef HAVE_SETHOSTNAME
6938 {"sethostname", socket_sethostname,
6939 METH_VARARGS, sethostname_doc},
6940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 {"getservbyname", socket_getservbyname,
6942 METH_VARARGS, getservbyname_doc},
6943 {"getservbyport", socket_getservbyport,
6944 METH_VARARGS, getservbyport_doc},
6945 {"getprotobyname", socket_getprotobyname,
6946 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006947 {"close", socket_close,
6948 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006949#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 {"dup", socket_dup,
6951 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006952#endif
Dave Cole331708b2004-08-09 04:51:41 +00006953#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954 {"socketpair", socket_socketpair,
6955 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957 {"ntohs", socket_ntohs,
6958 METH_VARARGS, ntohs_doc},
6959 {"ntohl", socket_ntohl,
6960 METH_O, ntohl_doc},
6961 {"htons", socket_htons,
6962 METH_VARARGS, htons_doc},
6963 {"htonl", socket_htonl,
6964 METH_O, htonl_doc},
6965 {"inet_aton", socket_inet_aton,
6966 METH_VARARGS, inet_aton_doc},
6967 {"inet_ntoa", socket_inet_ntoa,
6968 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006969#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970 {"inet_pton", socket_inet_pton,
6971 METH_VARARGS, inet_pton_doc},
6972 {"inet_ntop", socket_inet_ntop,
6973 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006974#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006975 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006976 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 {"getnameinfo", socket_getnameinfo,
6978 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306979 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 METH_NOARGS, getdefaulttimeout_doc},
6981 {"setdefaulttimeout", socket_setdefaulttimeout,
6982 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006983#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006984 {"if_nameindex", socket_if_nameindex,
6985 METH_NOARGS, if_nameindex_doc},
6986 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006987 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006988 {"if_indextoname", socket_if_indextoname,
6989 METH_O, if_indextoname_doc},
6990#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006991#ifdef CMSG_LEN
6992 {"CMSG_LEN", socket_CMSG_LEN,
6993 METH_VARARGS, CMSG_LEN_doc},
6994#ifdef CMSG_SPACE
6995 {"CMSG_SPACE", socket_CMSG_SPACE,
6996 METH_VARARGS, CMSG_SPACE_doc},
6997#endif
6998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006999 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007000};
7001
Guido van Rossum30a685f1991-06-27 15:51:29 +00007002
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007003#ifdef MS_WINDOWS
7004#define OS_INIT_DEFINED
7005
7006/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007007
7008static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007009os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007012}
7013
7014static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007015os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017 WSADATA WSAData;
7018 int ret;
7019 ret = WSAStartup(0x0101, &WSAData);
7020 switch (ret) {
7021 case 0: /* No error */
7022 Py_AtExit(os_cleanup);
7023 return 1; /* Success */
7024 case WSASYSNOTREADY:
7025 PyErr_SetString(PyExc_ImportError,
7026 "WSAStartup failed: network not ready");
7027 break;
7028 case WSAVERNOTSUPPORTED:
7029 case WSAEINVAL:
7030 PyErr_SetString(
7031 PyExc_ImportError,
7032 "WSAStartup failed: requested version not supported");
7033 break;
7034 default:
7035 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7036 break;
7037 }
7038 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007039}
7040
Guido van Rossum8d665e61996-06-26 18:22:49 +00007041#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007042
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007043
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007044
7045#ifndef OS_INIT_DEFINED
7046static int
7047os_init(void)
7048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007050}
7051#endif
7052
7053
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007054/* C API table - always add new things to the end for binary
7055 compatibility. */
7056static
7057PySocketModule_APIObject PySocketModuleAPI =
7058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007060 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007062};
7063
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007064
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007065/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007066
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007067 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007068 "socket.py" which implements some additional functionality.
7069 The import of "_socket" may fail with an ImportError exception if
7070 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007071 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007072 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007073*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007074
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007075PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007076"Implementation module for socket operations.\n\
7077\n\
7078See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007079
Martin v. Löwis1a214512008-06-11 05:26:20 +00007080static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007081 PyModuleDef_HEAD_INIT,
7082 PySocket_MODULE_NAME,
7083 socket_doc,
7084 -1,
7085 socket_methods,
7086 NULL,
7087 NULL,
7088 NULL,
7089 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007090};
7091
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007092PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007093PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097 if (!os_init())
7098 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007099
Victor Stinnerdaf45552013-08-28 00:53:59 +02007100#ifdef MS_WINDOWS
7101 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007102 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007103 }
7104#endif
7105
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007106 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 m = PyModule_Create(&socketmodule);
7108 if (m == NULL)
7109 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007110
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007111 Py_INCREF(PyExc_OSError);
7112 PySocketModuleAPI.error = PyExc_OSError;
7113 Py_INCREF(PyExc_OSError);
7114 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007116 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007117 if (socket_herror == NULL)
7118 return NULL;
7119 Py_INCREF(socket_herror);
7120 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007121 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 NULL);
7123 if (socket_gaierror == NULL)
7124 return NULL;
7125 Py_INCREF(socket_gaierror);
7126 PyModule_AddObject(m, "gaierror", socket_gaierror);
7127 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007128 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 if (socket_timeout == NULL)
7130 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007131 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132 Py_INCREF(socket_timeout);
7133 PyModule_AddObject(m, "timeout", socket_timeout);
7134 Py_INCREF((PyObject *)&sock_type);
7135 if (PyModule_AddObject(m, "SocketType",
7136 (PyObject *)&sock_type) != 0)
7137 return NULL;
7138 Py_INCREF((PyObject *)&sock_type);
7139 if (PyModule_AddObject(m, "socket",
7140 (PyObject *)&sock_type) != 0)
7141 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007142
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007143#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007145#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 Py_INCREF(has_ipv6);
7149 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151 /* Export C API */
7152 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7153 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7154 ) != 0)
7155 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007158#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007160#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007162#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007164#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007165#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007168#endif
7169#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007171#endif
7172#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007173 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007175#endif
7176#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007179#endif
7180#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007183#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007184#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007187#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007188#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007191#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007192#ifdef HAVE_SOCKADDR_ALG
7193 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7194#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007195#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007198#endif
7199#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007201#endif
7202#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007205#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007206#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007209#endif
7210#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007213#endif
7214#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007215 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007217#endif
7218#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007219 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007221#endif
7222#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, AF_NETLINK);
7225 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007226#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007228#endif
7229#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007231#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7233 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007234#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007236#endif
7237#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007239#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007240#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007242#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007243#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007245#endif
7246#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007248#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007250#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007252#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007253#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007255#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007256#ifdef NETLINK_CRYPTO
7257 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7258#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007259#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007260
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007261#ifdef AF_QIPCRTR
7262 /* Qualcomm IPCROUTER */
7263 PyModule_AddIntMacro(m, AF_QIPCRTR);
7264#endif
7265
caaveryeffc12f2017-09-06 18:18:10 -04007266#ifdef AF_VSOCK
7267 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7268 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7269 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7270 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7271 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7272 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7273 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7274 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7275 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7276#endif
7277
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007278#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007281#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007282#ifdef AF_LINK
7283 PyModule_AddIntMacro(m, AF_LINK);
7284#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007285#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007286 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007288#endif
7289#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007292#endif
7293#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007296#endif
7297#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007298 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007300#endif
7301#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007304#endif
7305#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007307 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007308#endif
7309#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007312#endif
7313#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007316#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007317
Hye-Shik Chang81268602004-02-02 06:05:24 +00007318#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007320#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007322#endif /* BTPROTO_L2CAP */
7323#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, BTPROTO_HCI);
7325 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007326#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007328#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007331#endif /* !__FreeBSD__ */
7332#endif /* !__NetBSD__ && !__DragonFly__ */
7333#endif /* BTPROTO_HCI */
7334#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007336#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7338 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007339#ifdef BTPROTO_SCO
7340 PyModule_AddIntMacro(m, BTPROTO_SCO);
7341#endif /* BTPROTO_SCO */
7342#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007343
Charles-François Natali47413c12011-10-06 19:47:44 +02007344#ifdef AF_CAN
7345 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007347#endif
7348#ifdef PF_CAN
7349 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007351#endif
7352
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007353/* Reliable Datagram Sockets */
7354#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007356#endif
7357#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007359#endif
7360
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007361/* Kernel event messages */
7362#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007364#endif
7365#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007367#endif
7368
Antoine Pitroub156a462010-10-27 20:13:57 +00007369#ifdef AF_PACKET
7370 PyModule_AddIntMacro(m, AF_PACKET);
7371#endif
7372#ifdef PF_PACKET
7373 PyModule_AddIntMacro(m, PF_PACKET);
7374#endif
7375#ifdef PACKET_HOST
7376 PyModule_AddIntMacro(m, PACKET_HOST);
7377#endif
7378#ifdef PACKET_BROADCAST
7379 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7380#endif
7381#ifdef PACKET_MULTICAST
7382 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7383#endif
7384#ifdef PACKET_OTHERHOST
7385 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7386#endif
7387#ifdef PACKET_OUTGOING
7388 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7389#endif
7390#ifdef PACKET_LOOPBACK
7391 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7392#endif
7393#ifdef PACKET_FASTROUTE
7394 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007395#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007396
Christian Heimes043d6f62008-01-07 17:19:16 +00007397#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7402 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7403 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007404
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7406 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7407 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, SOL_TIPC);
7411 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7412 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7413 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7414 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007415
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7417 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7418 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7419 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7423 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007424#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007425 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007426 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007427#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7429 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7430 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7431 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7432 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7433 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007434#endif
7435
Christian Heimesdffa3942016-09-05 23:54:41 +02007436#ifdef HAVE_SOCKADDR_ALG
7437 /* Socket options */
7438 PyModule_AddIntMacro(m, ALG_SET_KEY);
7439 PyModule_AddIntMacro(m, ALG_SET_IV);
7440 PyModule_AddIntMacro(m, ALG_SET_OP);
7441 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7442 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7443 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7444
7445 /* Operations */
7446 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7447 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7448 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7449 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7450#endif
7451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, SOCK_STREAM);
7454 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007455/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007456#ifdef SOCK_RAW
7457 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007459#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007461#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007463#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007464#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007466#endif
7467#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007469#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007474#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007477#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007479#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007480#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007482#endif
7483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007501#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007502#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007533#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007534#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007536#endif
7537#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007539#endif
7540#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007542#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007543#ifdef SO_PASSSEC
7544 PyModule_AddIntMacro(m, SO_PASSSEC);
7545#endif
7546#ifdef SO_PEERSEC
7547 PyModule_AddIntMacro(m, SO_PEERSEC);
7548#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007549#ifdef SO_BINDTODEVICE
7550 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7551#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007552#ifdef SO_PRIORITY
7553 PyModule_AddIntMacro(m, SO_PRIORITY);
7554#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007555#ifdef SO_MARK
7556 PyModule_AddIntMacro(m, SO_MARK);
7557#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007558#ifdef SO_DOMAIN
7559 PyModule_AddIntMacro(m, SO_DOMAIN);
7560#endif
7561#ifdef SO_PROTOCOL
7562 PyModule_AddIntMacro(m, SO_PROTOCOL);
7563#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565 /* Maximum number of connections for "listen" */
7566#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007569 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007570#endif
7571
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007572 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007573#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007575#endif
7576#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007578#endif
7579#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007581#endif
7582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583 /* Flags for send, recv */
7584#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007587#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007590#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007593#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007596#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007599#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007605#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007608#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007611#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007613#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007614#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007616#endif
7617#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007619#endif
7620#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007622#endif
7623#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007625#endif
7626#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007628#endif
7629#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007631#endif
7632#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007634#endif
7635#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007637#endif
7638#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007640#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007641#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007643#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645 /* Protocol level and numbers, usable for [gs]etsockopt */
7646#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007648#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007649#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007651#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007652 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007654#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007660#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007663#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007666#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007669#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007671#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007672 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007678#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007679#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007681#endif
7682#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7684 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007685#endif
7686#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7688 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7689 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007690
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7692 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7693 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007694#ifdef CAN_ISOTP
7695 PyModule_AddIntMacro(m, CAN_ISOTP);
7696#endif
karl ding360371f2020-04-29 15:31:19 -07007697#ifdef CAN_J1939
7698 PyModule_AddIntMacro(m, CAN_J1939);
7699#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007700#endif
7701#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007702 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7703 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7704 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7705 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007706#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007707#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7708 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7709#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007710#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7711 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7712#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007713#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007714 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007715
7716 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007717 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7718 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7719 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7720 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7721 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7722 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7723 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7724 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7725 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7726 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7727 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7728 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007729
7730 /* BCM flags */
7731 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7732 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7733 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7734 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7735 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7736 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7737 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7738 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7739 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7740 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7741 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7742#ifdef CAN_FD_FRAME
7743 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7744 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7745#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007746#endif
karl ding360371f2020-04-29 15:31:19 -07007747#ifdef HAVE_LINUX_CAN_J1939_H
7748 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7749 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7750 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7751 PyModule_AddIntMacro(m, J1939_NO_NAME);
7752 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7753 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7754 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7755 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7756 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7757 PyModule_AddIntMacro(m, J1939_NO_PGN);
7758
7759 /* J1939 socket options */
7760 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7761 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7762 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7763 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7764
7765 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7766 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7767 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7768 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7769
7770 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7771 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7772
7773 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7774 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7775
7776 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7777#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007778#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007780#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007781#ifdef HAVE_SOCKADDR_ALG
7782 PyModule_AddIntMacro(m, SOL_ALG);
7783#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007784#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007786#endif
7787#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007789#endif
7790#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007792#endif
7793#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007795#endif
7796#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007798#endif
7799#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007802#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007804#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007805 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007807#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007810#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007812#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007813 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007815#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007816 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007818#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007819 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007821#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007822 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007824#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007825 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007827#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007828 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007830#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007831 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007832#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007833 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007835#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007838#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007839 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007841#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007842 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007843#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007844 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007845#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007846#ifdef IPPROTO_UDPLITE
7847 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7848 #ifndef UDPLITE_SEND_CSCOV
7849 #define UDPLITE_SEND_CSCOV 10
7850 #endif
7851 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7852 #ifndef UDPLITE_RECV_CSCOV
7853 #define UDPLITE_RECV_CSCOV 11
7854 #endif
7855 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007857#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007858 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007860#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007861 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007863#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007864 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007866#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007867 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007869#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007872#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007875#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007876 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007878#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007884#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007885 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007887#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007890#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007893#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007894 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007896#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007897 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007899#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007900 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007902#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007903 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007905#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007906 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007908#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007909 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007912 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007913#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007914#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007915 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007918 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007919#endif
7920/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007923#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007924 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007926#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007927 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007928#endif
7929
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007930#ifdef MS_WINDOWS
7931 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7932 PyModule_AddIntMacro(m, IPPROTO_ST);
7933 PyModule_AddIntMacro(m, IPPROTO_CBT);
7934 PyModule_AddIntMacro(m, IPPROTO_IGP);
7935 PyModule_AddIntMacro(m, IPPROTO_RDP);
7936 PyModule_AddIntMacro(m, IPPROTO_PGM);
7937 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7938 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7939#endif
7940
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007941#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007942 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007943#endif
7944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007945 /* Some port configuration */
7946#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007947 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007948#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007951#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007953#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007954 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007955#endif
7956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007957 /* Some reserved IP v.4 addresses */
7958#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007960#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007963#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007965#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978#ifdef INADDR_ALLHOSTS_GROUP
7979 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7980 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007981#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007982 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007984#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007985 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007987 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007989#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007990 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007991#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007992 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007993#endif
7994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007995 /* IPv4 [gs]etsockopt options */
7996#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007997 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007999#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008000 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008002#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008003 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008005#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008006 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008008#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008009 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008011#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008012 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008014#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008015 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008017#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008018 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008020#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008021 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008023#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008024 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008026#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008027 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008029#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008030 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008032#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008033 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008035#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008036 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008038#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008039 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008041#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008042 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008043#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008044#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008045 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008046#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008048 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8049#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008050 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008052#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008055#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008056 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008058#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008059 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008061#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008062 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008064#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008065 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008067 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008068#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008071 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008072#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008073 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008074#endif
8075#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008076 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008077#endif
8078#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008079 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008080#endif
8081#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008082 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008083#endif
8084#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008085 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008086#endif
8087#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008088 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008089#endif
8090#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008091 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008092#endif
8093#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008094 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008095#endif
8096#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008097 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008098#endif
8099#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008100 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008101#endif
8102#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008103 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008104#endif
8105#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008106 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008107#endif
8108#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008109 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008110#endif
8111#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008112 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008113#endif
8114#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008115 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008116#endif
8117#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008118 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008119#endif
8120#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008121 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008122#endif
8123#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008124 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008125#endif
8126#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008127 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008128#endif
8129#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008130 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008131#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008133 /* TCP options */
8134#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008135 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008137#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008138 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008140#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008141 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008143#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008144 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008146#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008147 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008149#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008150 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008152#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008153 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008155#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008156 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008158#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008159 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008161#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008162 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008163#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008164#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008165 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008167#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008168 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008169#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008170#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008171 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008172#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008173#ifdef TCP_CONGESTION
8174 PyModule_AddIntMacro(m, TCP_CONGESTION);
8175#endif
8176#ifdef TCP_USER_TIMEOUT
8177 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8178#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008179#ifdef TCP_NOTSENT_LOWAT
8180 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8181#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008183 /* IPX options */
8184#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008185 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008186#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008187
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008188/* Reliable Datagram Sockets */
8189#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008190 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008191#endif
8192#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008193 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008194#endif
8195#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008196 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008197#endif
8198#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008199 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008200#endif
8201#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008202 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008203#endif
8204#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008205 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008206#endif
8207#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008208 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008209#endif
8210#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008211 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008212#endif
8213#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008215#endif
8216#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008217 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008218#endif
8219#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008221#endif
8222#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008224#endif
8225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008226 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008227#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008228 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008229#endif
8230#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008231 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008232#endif
8233#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008234 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008235#endif
8236#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008237 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008238#endif
8239#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008240 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008241#endif
8242#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008243 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008244#endif
8245#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008246 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008247#endif
8248#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008249 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008250#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008251#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008252 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008253#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008254#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008255 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008256#endif
8257#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008258 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008259#endif
8260#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008261 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008262#endif
8263#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008264 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008265#endif
8266#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008267 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008268#endif
8269#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008270 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008271#endif
8272#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008273 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008274#endif
8275#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008276 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008277#endif
8278#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008279 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008280#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008281#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008282 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008283#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008284#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008285 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008286#endif
8287#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008288 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008289#endif
8290#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008291 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008292#endif
8293#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008294 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008295#endif
8296#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008297 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008298#endif
8299#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008300 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008301#endif
8302#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008303 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008304#endif
8305#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008306 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008307#endif
8308#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008309 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008310#endif
8311#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008312 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008313#endif
8314#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008315 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008316#endif
8317#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008318 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008319#endif
8320#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008321 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008322#endif
8323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008324 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008325#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008326 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008327#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008328 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008329#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008330 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008331#endif
8332#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008333 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008334#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008335 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008337 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008338#endif
8339#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008340 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008341#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008342 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008343#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008344 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008345#endif
8346
Christian Heimesfaf2f632008-01-06 16:59:19 +00008347#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008348 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008349 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8350#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008351 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008352#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008353 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008354 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8355#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008356 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008357#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008358 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008359 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008360 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008361 PyObject *tmp;
8362 tmp = PyLong_FromUnsignedLong(codes[i]);
8363 if (tmp == NULL)
8364 return NULL;
8365 PyModule_AddObject(m, names[i], tmp);
8366 }
8367 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008368 PyModule_AddIntMacro(m, RCVALL_OFF);
8369 PyModule_AddIntMacro(m, RCVALL_ON);
8370 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008371#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008372 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008373#endif
8374#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008375 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008376#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008377#endif /* _MSTCPIP_ */
8378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008379 /* Initialize gethostbyname lock */
Victor Stinner0de437d2020-05-28 17:23:39 +02008380#if defined(USE_GETHOSTBYNAME_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008381 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008382#endif
animalize19e7d482018-02-27 02:10:36 +08008383
8384#ifdef MS_WINDOWS
8385 /* remove some flags on older version Windows during run-time */
8386 remove_unusable_flags(m);
8387#endif
8388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008389 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008390}