blob: ab8618b341544756dba217255556941f66b43366 [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
Miss Islington (bot)6fc1efa2021-07-26 15:34:32 -070048- an internet socket address is a pair (hostname, port)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000049 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\
154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000155 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000156
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000157/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000158 I hope some day someone can clean this up please... */
159
Guido van Rossum9376b741999-09-15 22:01:40 +0000160/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
161 script doesn't get this right, so we hardcode some platform checks below.
162 On the other hand, not all Linux versions agree, so there the settings
163 computed by the configure script are needed! */
164
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700165#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166# undef HAVE_GETHOSTBYNAME_R_3_ARG
167# undef HAVE_GETHOSTBYNAME_R_5_ARG
168# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000169#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000170
Victor Stinner710d27e2011-08-23 10:57:32 +0200171#if defined(__OpenBSD__)
172# include <sys/uio.h>
173#endif
174
Stefan Krah1f9eb872016-05-22 17:35:34 +0200175#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000177#endif
178
Guido van Rossume7de2061999-03-24 17:24:33 +0000179#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000180# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define HAVE_GETHOSTBYNAME_R_3_ARG
182# elif defined(__sun) || defined(__sgi)
183# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700184# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000185/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000186# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
187# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# else
189# undef HAVE_GETHOSTBYNAME_R
190# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000191#endif
192
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200193#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000194# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000195#endif
196
Serhiy Storchakad3187152017-11-09 18:00:38 +0200197#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Victor Stinner62183b82020-04-15 02:04:42 +0200198# include <sys/ioctl.h>
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100199#endif
200
201
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000202#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000203/* make sure that the reentrant (gethostbyaddr_r etc)
204 functions are declared correctly if compiling with
205 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000206
Thomas Wouters477c8d52006-05-27 19:21:47 +0000207/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000208 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000209#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000210#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000211
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000212#undef _XOPEN_SOURCE
213#include <sys/socket.h>
214#include <sys/types.h>
215#include <netinet/in.h>
216#ifdef _SS_ALIGNSIZE
217#define HAVE_GETADDRINFO 1
218#define HAVE_GETNAMEINFO 1
219#endif
220
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000221#define HAVE_INET_PTON
222#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000223#endif
224
Benjamin Peterson06930632017-09-04 16:36:05 -0700225/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100226#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000227#define INET_ADDRSTRLEN 16
228#endif
229
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000231#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000233#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700235#ifdef HAVE_SYS_SOCKET_H
236#include <sys/socket.h>
237#endif
238
239#ifdef HAVE_NET_IF_H
240#include <net/if.h>
241#endif
242
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000243/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000245#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000246
247/* Addressing includes */
248
Guido van Rossum6f489d91996-06-28 20:15:15 +0000249#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250
251/* Non-MS WINDOWS includes */
252# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000253# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000254
Guido van Rossum9376b741999-09-15 22:01:40 +0000255/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000260#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000261
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000263# ifdef HAVE_FCNTL_H
264# include <fcntl.h>
265# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000266
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100267/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
268#ifdef MS_WINDOWS
269#define IPPROTO_ICMP IPPROTO_ICMP
270#define IPPROTO_IGMP IPPROTO_IGMP
271#define IPPROTO_GGP IPPROTO_GGP
272#define IPPROTO_TCP IPPROTO_TCP
273#define IPPROTO_PUP IPPROTO_PUP
274#define IPPROTO_UDP IPPROTO_UDP
275#define IPPROTO_IDP IPPROTO_IDP
276#define IPPROTO_ND IPPROTO_ND
277#define IPPROTO_RAW IPPROTO_RAW
278#define IPPROTO_MAX IPPROTO_MAX
279#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
280#define IPPROTO_IPV4 IPPROTO_IPV4
281#define IPPROTO_IPV6 IPPROTO_IPV6
282#define IPPROTO_ROUTING IPPROTO_ROUTING
283#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
284#define IPPROTO_ESP IPPROTO_ESP
285#define IPPROTO_AH IPPROTO_AH
286#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
287#define IPPROTO_NONE IPPROTO_NONE
288#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
289#define IPPROTO_EGP IPPROTO_EGP
290#define IPPROTO_PIM IPPROTO_PIM
291#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
292#define IPPROTO_ST IPPROTO_ST // WinSock2 only
293#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
294#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
295#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
296#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
297#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
298#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
299#endif /* MS_WINDOWS */
300
Steve Dower65e4cb12014-11-22 12:54:57 -0800301/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200302#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600303// For if_nametoindex() and if_indextoname()
304#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800305
animalize19e7d482018-02-27 02:10:36 +0800306/* remove some flags on older version Windows during run-time.
307 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
308typedef struct {
309 DWORD build_number; /* available starting with this Win10 BuildNumber */
310 const char flag_name[20];
311} FlagRuntimeInfo;
312
313/* IMPORTANT: make sure the list ordered by descending build_number */
314static FlagRuntimeInfo win_runtime_flags[] = {
315 /* available starting with Windows 10 1709 */
316 {16299, "TCP_KEEPIDLE"},
317 {16299, "TCP_KEEPINTVL"},
318 /* available starting with Windows 10 1703 */
319 {15063, "TCP_KEEPCNT"},
320 /* available starting with Windows 10 1607 */
321 {14393, "TCP_FASTOPEN"}
322};
323
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200324static int
animalize19e7d482018-02-27 02:10:36 +0800325remove_unusable_flags(PyObject *m)
326{
327 PyObject *dict;
328 OSVERSIONINFOEX info;
329 DWORDLONG dwlConditionMask;
330
331 dict = PyModule_GetDict(m);
332 if (dict == NULL) {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200333 return -1;
animalize19e7d482018-02-27 02:10:36 +0800334 }
335
336 /* set to Windows 10, except BuildNumber. */
337 memset(&info, 0, sizeof(info));
338 info.dwOSVersionInfoSize = sizeof(info);
339 info.dwMajorVersion = 10;
340 info.dwMinorVersion = 0;
341
342 /* set Condition Mask */
343 dwlConditionMask = 0;
344 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
345 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
346 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
347
348 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
349 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100350 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800351 Compatibility Mode will not cheat VerifyVersionInfo(...) */
352 if (VerifyVersionInfo(
353 &info,
354 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
355 dwlConditionMask)) {
356 break;
357 }
358 else {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200359 PyObject *flag_name = PyUnicode_FromString(win_runtime_flags[i].flag_name);
360 if (flag_name == NULL) {
361 return -1;
animalize19e7d482018-02-27 02:10:36 +0800362 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200363 PyObject *v = _PyDict_Pop(dict, flag_name, Py_None);
364 Py_DECREF(flag_name);
365 if (v == NULL) {
366 return -1;
367 }
368 Py_DECREF(v);
animalize19e7d482018-02-27 02:10:36 +0800369 }
370 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200371 return 0;
animalize19e7d482018-02-27 02:10:36 +0800372}
373
Jeremy Hylton22308652001-02-02 03:23:09 +0000374#endif
375
Skip Montanaro7befb992004-02-10 16:50:21 +0000376#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000377
Neal Norwitz39d22e52002-11-02 19:55:21 +0000378#ifndef O_NONBLOCK
379# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380#endif
381
Trent Micka708d6e2004-09-07 17:48:26 +0000382/* include Python's addrinfo.h unless it causes trouble */
383#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
384 /* Do not include addinfo.h on some newer IRIX versions.
385 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
386 * for example, but not by 6.5.10.
387 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000389 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
390 * EAI_* constants are defined in (the already included) ws2tcpip.h.
391 */
392#else
393# include "addrinfo.h"
394#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000395
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000396#ifdef __APPLE__
397/* On OS X, getaddrinfo returns no error indication of lookup
398 failure, so we must use the emulation instead of the libinfo
399 implementation. Unfortunately, performing an autoconf test
400 for this bug would require DNS access for the machine performing
401 the configuration, which is not acceptable. Therefore, we
402 determine the bug just by checking for __APPLE__. If this bug
403 gets ever fixed, perhaps checking for sys/version.h would be
404 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000405#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600406/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000407 Find to check for Jaguar is that it has getnameinfo(), which
408 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000409#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000410#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000411
412#ifdef HAVE_INET_ATON
413#define USE_INET_ATON_WEAKLINK
414#endif
415
Jack Jansen84262fb2002-07-02 14:40:42 +0000416#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000418/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000419#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000420/* avoid clashes with the C library definition of the symbol. */
421#define getaddrinfo fake_getaddrinfo
422#define gai_strerror fake_gai_strerror
423#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000424#include "getaddrinfo.c"
425#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000426#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000427#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000428#include "getnameinfo.c"
429#endif
430
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000431#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000432#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000433#endif
434
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435#ifdef MS_WIN32
Victor Stinnere822e372020-06-15 21:59:47 +0200436# undef EAFNOSUPPORT
437# define EAFNOSUPPORT WSAEAFNOSUPPORT
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000438#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000439
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000440#ifndef SOCKETCLOSE
Victor Stinnere822e372020-06-15 21:59:47 +0200441# define SOCKETCLOSE close
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000442#endif
443
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000444#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000445#define USE_BLUETOOTH 1
446#if defined(__FreeBSD__)
447#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
448#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000449#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000450#define SOL_HCI SOL_HCI_RAW
451#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000452#define sockaddr_l2 sockaddr_l2cap
453#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000454#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000455#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
456#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000457#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000458#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000459#define sockaddr_l2 sockaddr_bt
460#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000461#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000463#define SOL_HCI BTPROTO_HCI
464#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
466#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000467#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000468#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000469#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000470#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
471#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000472#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000473#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
474#endif
475#endif
476
Greg Bowser8fbece12019-08-02 16:29:52 -0400477#ifdef MS_WINDOWS
478#define sockaddr_rc SOCKADDR_BTH_REDEF
479
480#define USE_BLUETOOTH 1
481#define AF_BLUETOOTH AF_BTH
482#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
483#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
484#endif
485
Charles-François Natali8b759652011-12-23 16:44:51 +0100486/* Convert "sock_addr_t *" to "struct sockaddr *". */
487#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488
Martin v. Löwise9416172003-05-03 10:12:45 +0000489/*
490 * Constants for getnameinfo()
491 */
492#if !defined(NI_MAXHOST)
493#define NI_MAXHOST 1025
494#endif
495#if !defined(NI_MAXSERV)
496#define NI_MAXSERV 32
497#endif
498
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000499#ifndef INVALID_SOCKET /* MS defines this */
500#define INVALID_SOCKET (-1)
501#endif
502
Charles-François Natali0cc86852013-09-13 19:53:08 +0200503#ifndef INADDR_NONE
504#define INADDR_NONE (-1)
505#endif
506
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000507/* XXX There's a problem here: *static* functions are not supposed to have
508 a Py prefix (or use CapitalizedWords). Later... */
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510/* Global variable holding the exception type for errors detected
511 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512static PyObject *socket_herror;
513static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514
Tim Peters643a7fc2002-02-17 04:13:21 +0000515/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000516 The sock_type variable contains pointers to various functions,
517 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000518 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000519static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000520
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000521#if defined(HAVE_POLL_H)
522#include <poll.h>
523#elif defined(HAVE_SYS_POLL_H)
524#include <sys/poll.h>
525#endif
526
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000527/* Largest value to try to store in a socklen_t (used when handling
528 ancillary data). POSIX requires socklen_t to hold at least
529 (2**31)-1 and recommends against storing larger values, but
530 socklen_t was originally int in the BSD interface, so to be on the
531 safe side we use the smaller of (2**31)-1 and INT_MAX. */
532#if INT_MAX > 0x7fffffff
533#define SOCKLEN_T_LIMIT 0x7fffffff
534#else
535#define SOCKLEN_T_LIMIT INT_MAX
536#endif
537
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200538#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000539/* Instead of select(), we'll use poll() since poll() works on any fd. */
540#define IS_SELECTABLE(s) 1
541/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000542#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200543/* If there's no timeout left, we don't have to call select, so it's a safe,
544 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100545#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000546#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000547
548static PyObject*
549select_error(void)
550{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200551 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000553}
554
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000555#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000556#ifndef WSAEAGAIN
557#define WSAEAGAIN WSAEWOULDBLOCK
558#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000559#define CHECK_ERRNO(expected) \
560 (WSAGetLastError() == WSA ## expected)
561#else
562#define CHECK_ERRNO(expected) \
563 (errno == expected)
564#endif
565
Victor Stinnerdaf45552013-08-28 00:53:59 +0200566#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200567# define GET_SOCK_ERROR WSAGetLastError()
568# define SET_SOCK_ERROR(err) WSASetLastError(err)
569# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
570# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
571#else
572# define GET_SOCK_ERROR errno
573# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
574# define SOCK_TIMEOUT_ERR EWOULDBLOCK
575# define SOCK_INPROGRESS_ERR EINPROGRESS
576#endif
577
Erik Janssens874809e2018-09-05 08:29:42 +0200578#ifdef _MSC_VER
579# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
580#else
581# define SUPPRESS_DEPRECATED_CALL
582#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200583
584#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200585/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
586static int support_wsa_no_inherit = -1;
587#endif
588
Guido van Rossum30a685f1991-06-27 15:51:29 +0000589/* Convenience function to raise an error according to errno
590 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591
Guido van Rossum73624e91994-10-10 17:59:00 +0000592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000593set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000595#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 int err_no = WSAGetLastError();
597 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
598 recognizes the error codes used by both GetLastError() and
599 WSAGetLastError */
600 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200601 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000602#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000603
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200604 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605}
606
Guido van Rossum30a685f1991-06-27 15:51:29 +0000607
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000608static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000609set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000612
613#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600614 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 if (v != NULL) {
619 PyErr_SetObject(socket_herror, v);
620 Py_DECREF(v);
621 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624}
625
626
627static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000628set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000631
Martin v. Löwis272cb402002-03-01 08:31:07 +0000632#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 /* EAI_SYSTEM is not available on Windows XP. */
634 if (error == EAI_SYSTEM)
635 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000636#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000638#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000640#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 if (v != NULL) {
644 PyErr_SetObject(socket_gaierror, v);
645 Py_DECREF(v);
646 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649}
650
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000651/* Function to perform the setting of socket blocking mode
652 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653static int
654internal_setblocking(PySocketSockObject *s, int block)
655{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400656 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200657#ifdef MS_WINDOWS
658 u_long arg;
659#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100660#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100661 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100662 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000663#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100667#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200669 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400670 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100671#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200673 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400674 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100676 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 else
Victor Stinner9a954832013-12-04 00:41:24 +0100678 new_delay_flag = delay_flag | O_NONBLOCK;
679 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200680 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400681 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100682#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000683#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200684 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200685 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400686 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400688
689 result = 0;
690
691 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000693
Yury Selivanovfa22b292016-10-18 16:03:52 -0400694 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200695#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400696 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200697#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400698 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200699#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400700 }
701
702 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000703}
704
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000705static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200706internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
707 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100710#ifdef HAVE_POLL
711 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200712 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100713#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200714 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200715 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100716#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000717
Victor Stinnerb7df3142015-03-27 22:59:32 +0100718 /* must be called with the GIL held */
719 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100720
Victor Stinner416f2e62015-03-31 13:56:29 +0200721 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200725 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 /* Prefer poll, if available, since you can poll() any fd
729 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000730#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100731 pollfd.fd = s->sock_fd;
732 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200733 if (connect) {
734 /* On Windows, the socket becomes writable on connection success,
735 but a connection failure is notified as an error. On POSIX, the
736 socket becomes writable on connection success or on connection
737 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200738 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200739 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000740
Victor Stinner71694d52015-03-28 01:18:54 +0100741 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200742 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200743 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000744
Artem Khramov28146202019-08-15 03:21:48 +0600745 /* On some OSes, typically BSD-based ones, the timeout parameter of the
746 poll() syscall, when negative, must be exactly INFTIM, where defined,
747 or -1. See issue 37811. */
748 if (ms < 0) {
749#ifdef INFTIM
750 ms = INFTIM;
751#else
752 ms = -1;
753#endif
754 }
755
Victor Stinner71694d52015-03-28 01:18:54 +0100756 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200757 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100758 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000759#else
Victor Stinnerced11742015-04-09 10:27:25 +0200760 if (interval >= 0) {
761 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
762 tvp = &tv;
763 }
764 else
765 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000766
Victor Stinner71694d52015-03-28 01:18:54 +0100767 FD_ZERO(&fds);
768 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200769 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200770 if (connect) {
771 /* On Windows, the socket becomes writable on connection success,
772 but a connection failure is notified as an error. On POSIX, the
773 socket becomes writable on connection success or on connection
774 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200775 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200776 }
Victor Stinner71694d52015-03-28 01:18:54 +0100777
778 /* See if the socket is ready */
779 Py_BEGIN_ALLOW_THREADS;
780 if (writing)
781 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200782 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100783 else
784 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200785 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100786 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000787#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 if (n < 0)
790 return -1;
791 if (n == 0)
792 return 1;
793 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000794}
795
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000797
Victor Stinner81c41db2015-04-02 11:50:57 +0200798 On error, raise an exception and return -1 if err is set, or fill err and
799 return -1 otherwise. If a signal was received and the signal handler raised
800 an exception, return -1, and set err to -1 if err is set.
801
802 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100803
Victor Stinner31bf2d52015-04-01 21:57:09 +0200804 If the socket has a timeout, wait until the socket is ready before calling
805 the function: wait until the socket is writable if writing is nonzero, wait
806 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100807
Victor Stinner81c41db2015-04-02 11:50:57 +0200808 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200809 the function, except if the signal handler raised an exception (PEP 475).
810
811 When the function is retried, recompute the timeout using a monotonic clock.
812
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 sock_call_ex() must be called with the GIL held. The socket function is
814 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200815static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200816sock_call_ex(PySocketSockObject *s,
817 int writing,
818 int (*sock_func) (PySocketSockObject *s, void *data),
819 void *data,
820 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200821 int *err,
822 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200823{
Victor Stinner8912d142015-04-06 23:16:34 +0200824 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200825 _PyTime_t deadline = 0;
826 int deadline_initialized = 0;
827 int res;
828
829 /* sock_call() must be called with the GIL held. */
830 assert(PyGILState_Check());
831
832 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 /* For connect(), poll even for blocking socket. The connection
836 runs asynchronously. */
837 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200839 _PyTime_t interval;
840
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 if (deadline_initialized) {
842 /* recompute the timeout */
843 interval = deadline - _PyTime_GetMonotonicClock();
844 }
845 else {
846 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200847 deadline = _PyTime_GetMonotonicClock() + timeout;
848 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200849 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850
Victor Stinner10550cd2015-04-03 13:22:27 +0200851 if (interval >= 0)
852 res = internal_select(s, writing, interval, connect);
853 else
854 res = 1;
855 }
856 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200857 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200858 }
859
Victor Stinner31bf2d52015-04-01 21:57:09 +0200860 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200861 if (err)
862 *err = GET_SOCK_ERROR;
863
Victor Stinner31bf2d52015-04-01 21:57:09 +0200864 if (CHECK_ERRNO(EINTR)) {
865 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200866 if (PyErr_CheckSignals()) {
867 if (err)
868 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200869 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200870 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200871
872 /* retry select() */
873 continue;
874 }
875
876 /* select() failed */
877 s->errorhandler();
878 return -1;
879 }
880
881 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200882 if (err)
883 *err = SOCK_TIMEOUT_ERR;
884 else
Christian Heimes03c8ddd2020-11-20 09:26:07 +0100885 PyErr_SetString(PyExc_TimeoutError, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200886 return -1;
887 }
888
889 /* the socket is ready */
890 }
891
Victor Stinner81c41db2015-04-02 11:50:57 +0200892 /* inner loop to retry sock_func() when sock_func() is interrupted
893 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200894 while (1) {
895 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200896 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200897 Py_END_ALLOW_THREADS
898
899 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200900 /* sock_func() succeeded */
901 if (err)
902 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200903 return 0;
904 }
905
Victor Stinner81c41db2015-04-02 11:50:57 +0200906 if (err)
907 *err = GET_SOCK_ERROR;
908
Victor Stinner31bf2d52015-04-01 21:57:09 +0200909 if (!CHECK_ERRNO(EINTR))
910 break;
911
Victor Stinner81c41db2015-04-02 11:50:57 +0200912 /* sock_func() was interrupted by a signal */
913 if (PyErr_CheckSignals()) {
914 if (err)
915 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200916 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200917 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200918
Victor Stinner81c41db2015-04-02 11:50:57 +0200919 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200920 }
921
922 if (s->sock_timeout > 0
923 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200924 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200925
926 For example, select() could indicate a socket is ready for
927 reading, but the data then discarded by the OS because of a
928 wrong checksum.
929
Miss Islington (bot)5afc5bb2021-10-07 01:55:18 -0700930 Loop on select() to recheck for socket readiness. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200931 continue;
932 }
933
Victor Stinner81c41db2015-04-02 11:50:57 +0200934 /* sock_func() failed */
935 if (!err)
936 s->errorhandler();
937 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000938 return -1;
939 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200940}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000941
Victor Stinner81c41db2015-04-02 11:50:57 +0200942static int
943sock_call(PySocketSockObject *s,
944 int writing,
945 int (*func) (PySocketSockObject *s, void *data),
946 void *data)
947{
Victor Stinner8912d142015-04-06 23:16:34 +0200948 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200949}
950
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000951
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000952/* Initialize a new socket object. */
953
Victor Stinner88ed6402015-04-09 10:23:12 +0200954/* Default timeout for new sockets */
955static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000956
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200957static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000958init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 s->sock_fd = fd;
962 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500965
966 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
967 on some OSes as part of socket.type. We want to reset them here,
968 to make socket.type be set to the same value on all platforms.
969 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
970 not portable.
971 */
972#ifdef SOCK_NONBLOCK
973 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
974#endif
975#ifdef SOCK_CLOEXEC
976 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
977#endif
978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000982#ifdef SOCK_NONBLOCK
983 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100984 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000985 else
986#endif
987 {
988 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200989 if (defaulttimeout >= 0) {
990 if (internal_setblocking(s, 0) == -1) {
991 return -1;
992 }
993 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000994 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200995 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000996}
997
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999/* Create a new socket object.
1000 This just creates the object and initializes it.
1001 If the creation fails, return NULL and set an exception (implicit
1002 in NEWOBJ()). */
1003
Guido van Rossum73624e91994-10-10 17:59:00 +00001004static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001005new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 PySocketSockObject *s;
1008 s = (PySocketSockObject *)
1009 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001010 if (s == NULL)
1011 return NULL;
1012 if (init_sockobject(s, fd, family, type, proto) == -1) {
1013 Py_DECREF(s);
1014 return NULL;
1015 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017}
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019
Guido van Rossum48a680c2001-03-02 06:34:14 +00001020/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001021 thread to be in gethostbyname or getaddrinfo */
Victor Stinner0de437d2020-05-28 17:23:39 +02001022#if defined(USE_GETHOSTBYNAME_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001023static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001024#endif
1025
1026
Guido van Rossum30a685f1991-06-27 15:51:29 +00001027/* Convert a string specifying a host name or one of a few symbolic
1028 names to a numeric IP address. This usually calls gethostbyname()
1029 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001030 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031 an error occurred; then an exception is raised. */
1032
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001033static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001034setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 struct addrinfo hints, *res;
1037 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1040 if (name[0] == '\0') {
1041 int siz;
1042 memset(&hints, 0, sizeof(hints));
1043 hints.ai_family = af;
1044 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1045 hints.ai_flags = AI_PASSIVE;
1046 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 error = getaddrinfo(NULL, "0", &hints, &res);
1048 Py_END_ALLOW_THREADS
1049 /* We assume that those thread-unsafe getaddrinfo() versions
1050 *are* safe regarding their return value, ie. that a
1051 subsequent call to getaddrinfo() does not destroy the
1052 outcome of the first call. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 if (error) {
1054 set_gaierror(error);
1055 return -1;
1056 }
1057 switch (res->ai_family) {
1058 case AF_INET:
1059 siz = 4;
1060 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001061#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 case AF_INET6:
1063 siz = 16;
1064 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 default:
1067 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001068 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 "unsupported address family");
1070 return -1;
1071 }
1072 if (res->ai_next) {
1073 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 "wildcard resolved to multiple address");
1076 return -1;
1077 }
1078 if (res->ai_addrlen < addr_ret_size)
1079 addr_ret_size = res->ai_addrlen;
1080 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1081 freeaddrinfo(res);
1082 return siz;
1083 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001084 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001085 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001086 if (strcmp(name, "255.255.255.255") == 0 ||
1087 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 struct sockaddr_in *sin;
1089 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001090 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 "address family mismatched");
1092 return -1;
1093 }
1094 sin = (struct sockaddr_in *)addr_ret;
1095 memset((void *) sin, '\0', sizeof(*sin));
1096 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001097#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 sin->sin_addr.s_addr = INADDR_BROADCAST;
1101 return sizeof(sin->sin_addr);
1102 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001103
1104 /* avoid a name resolution in case of numeric address */
1105#ifdef HAVE_INET_PTON
1106 /* check for an IPv4 address */
1107 if (af == AF_UNSPEC || af == AF_INET) {
1108 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1109 memset(sin, 0, sizeof(*sin));
1110 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1111 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001112#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001113 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001114#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001115 return 4;
1116 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001118#ifdef ENABLE_IPV6
1119 /* check for an IPv6 address - if the address contains a scope ID, we
1120 * fallback to getaddrinfo(), which can handle translation from interface
1121 * name to interface index */
1122 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1123 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1124 memset(sin, 0, sizeof(*sin));
1125 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1126 sin->sin6_family = AF_INET6;
1127#ifdef HAVE_SOCKADDR_SA_LEN
1128 sin->sin6_len = sizeof(*sin);
1129#endif
1130 return 16;
1131 }
1132 }
1133#endif /* ENABLE_IPV6 */
1134#else /* HAVE_INET_PTON */
1135 /* check for an IPv4 address */
1136 if (af == AF_INET || af == AF_UNSPEC) {
1137 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1138 memset(sin, 0, sizeof(*sin));
1139 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1140 sin->sin_family = AF_INET;
1141#ifdef HAVE_SOCKADDR_SA_LEN
1142 sin->sin_len = sizeof(*sin);
1143#endif
1144 return 4;
1145 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001146 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001147#endif /* HAVE_INET_PTON */
1148
1149 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 memset(&hints, 0, sizeof(hints));
1151 hints.ai_family = af;
1152 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001154#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 if (error == EAI_NONAME && af == AF_UNSPEC) {
1156 /* On Tru64 V5.1, numeric-to-addr conversion fails
1157 if no address family is given. Assume IPv4 for now.*/
1158 hints.ai_family = AF_INET;
1159 error = getaddrinfo(name, NULL, &hints, &res);
1160 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (error) {
1164 set_gaierror(error);
1165 return -1;
1166 }
1167 if (res->ai_addrlen < addr_ret_size)
1168 addr_ret_size = res->ai_addrlen;
1169 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1170 freeaddrinfo(res);
1171 switch (addr_ret->sa_family) {
1172 case AF_INET:
1173 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001174#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 case AF_INET6:
1176 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001179 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return -1;
1181 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182}
1183
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
Коренберг Марк7766b962018-02-13 00:47:42 +05001185/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
Guido van Rossum73624e91994-10-10 17:59:00 +00001187static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001188make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001189{
Коренберг Марк7766b962018-02-13 00:47:42 +05001190 char buf[INET_ADDRSTRLEN];
1191 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1192 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 return NULL;
1194 }
1195 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001196}
1197
Коренберг Марк7766b962018-02-13 00:47:42 +05001198#ifdef ENABLE_IPV6
1199/* Convert IPv6 sockaddr to a Python str. */
1200
1201static PyObject *
1202make_ipv6_addr(const struct sockaddr_in6 *addr)
1203{
1204 char buf[INET6_ADDRSTRLEN];
1205 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1206 PyErr_SetFromErrno(PyExc_OSError);
1207 return NULL;
1208 }
1209 return PyUnicode_FromString(buf);
1210}
1211#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001212
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001213#ifdef USE_BLUETOOTH
1214/* Convert a string representation of a Bluetooth address into a numeric
1215 address. Returns the length (6), or raises an exception and returns -1 if
1216 an error occurred. */
1217
1218static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001219setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 unsigned int b0, b1, b2, b3, b4, b5;
1222 char ch;
1223 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1226 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1227 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001228
1229#ifdef MS_WINDOWS
1230 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1231 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1232 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1233 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1234 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1235 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1236#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 bdaddr->b[0] = b0;
1238 bdaddr->b[1] = b1;
1239 bdaddr->b[2] = b2;
1240 bdaddr->b[3] = b3;
1241 bdaddr->b[4] = b4;
1242 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001243#endif
1244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 return 6;
1246 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001247 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 return -1;
1249 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001250}
1251
1252/* Create a string representation of the Bluetooth address. This is always a
1253 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1254 value (zero padded if necessary). */
1255
1256static PyObject *
1257makebdaddr(bdaddr_t *bdaddr)
1258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001260
Greg Bowser8fbece12019-08-02 16:29:52 -04001261#ifdef MS_WINDOWS
1262 int i;
1263 unsigned int octets[6];
1264
1265 for (i = 0; i < 6; ++i) {
1266 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1267 }
1268
1269 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1270 octets[5], octets[4], octets[3],
1271 octets[2], octets[1], octets[0]);
1272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1274 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1275 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001276#endif
1277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001279}
1280#endif
1281
1282
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283/* Create an object representing the given socket address,
1284 suitable for passing it back to bind(), connect() etc.
1285 The family field of the sockaddr structure is inspected
1286 to determine what kind of address it really is. */
1287
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001290makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 if (addrlen == 0) {
1293 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001294 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 case AF_INET:
1300 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001301 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1302 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 PyObject *ret = NULL;
1304 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1306 Py_DECREF(addrobj);
1307 }
1308 return ret;
1309 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001310
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001311#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 case AF_UNIX:
1313 {
1314 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001315#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001316 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1317 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1318 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 }
1320 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001321#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 {
1323 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001324 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 }
1326 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001327#endif /* AF_UNIX */
1328
Martin v. Löwis11017b12006-01-14 18:12:57 +00001329#if defined(AF_NETLINK)
1330 case AF_NETLINK:
1331 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1333 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001334 }
1335#endif /* AF_NETLINK */
1336
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001337#if defined(AF_QIPCRTR)
1338 case AF_QIPCRTR:
1339 {
1340 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1341 return Py_BuildValue("II", a->sq_node, a->sq_port);
1342 }
1343#endif /* AF_QIPCRTR */
1344
caaveryeffc12f2017-09-06 18:18:10 -04001345#if defined(AF_VSOCK)
1346 case AF_VSOCK:
1347 {
1348 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1349 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1350 }
1351#endif /* AF_VSOCK */
1352
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001353#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 case AF_INET6:
1355 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001356 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1357 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 PyObject *ret = NULL;
1359 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001360 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 addrobj,
1362 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001363 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 a->sin6_scope_id);
1365 Py_DECREF(addrobj);
1366 }
1367 return ret;
1368 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001369#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001371#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 case AF_BLUETOOTH:
1373 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001374
Greg Bowser8fbece12019-08-02 16:29:52 -04001375#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 case BTPROTO_L2CAP:
1377 {
1378 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1379 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1380 PyObject *ret = NULL;
1381 if (addrobj) {
1382 ret = Py_BuildValue("Oi",
1383 addrobj,
1384 _BT_L2_MEMB(a, psm));
1385 Py_DECREF(addrobj);
1386 }
1387 return ret;
1388 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001389
Greg Bowser8fbece12019-08-02 16:29:52 -04001390#endif /* BTPROTO_L2CAP */
1391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 case BTPROTO_RFCOMM:
1393 {
1394 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1395 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1396 PyObject *ret = NULL;
1397 if (addrobj) {
1398 ret = Py_BuildValue("Oi",
1399 addrobj,
1400 _BT_RC_MEMB(a, channel));
1401 Py_DECREF(addrobj);
1402 }
1403 return ret;
1404 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001405
Greg Bowser8fbece12019-08-02 16:29:52 -04001406#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 case BTPROTO_HCI:
1408 {
1409 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001410#if defined(__NetBSD__) || defined(__DragonFly__)
1411 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001412#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 PyObject *ret = NULL;
1414 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1415 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001416#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001418
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001419#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 case BTPROTO_SCO:
1421 {
1422 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1423 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1424 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001425#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001426#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 default:
1429 PyErr_SetString(PyExc_ValueError,
1430 "Unknown Bluetooth protocol");
1431 return NULL;
1432 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001433#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Antoine Pitroub156a462010-10-27 20:13:57 +00001435#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 case AF_PACKET:
1437 {
1438 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001439 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 struct ifreq ifr;
1441 /* need to look up interface name give index */
1442 if (a->sll_ifindex) {
1443 ifr.ifr_ifindex = a->sll_ifindex;
1444 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1445 ifname = ifr.ifr_name;
1446 }
1447 return Py_BuildValue("shbhy#",
1448 ifname,
1449 ntohs(a->sll_protocol),
1450 a->sll_pkttype,
1451 a->sll_hatype,
1452 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001453 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001455#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001456
Christian Heimes043d6f62008-01-07 17:19:16 +00001457#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 case AF_TIPC:
1459 {
1460 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1461 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1462 return Py_BuildValue("IIIII",
1463 a->addrtype,
1464 a->addr.nameseq.type,
1465 a->addr.nameseq.lower,
1466 a->addr.nameseq.upper,
1467 a->scope);
1468 } else if (a->addrtype == TIPC_ADDR_NAME) {
1469 return Py_BuildValue("IIIII",
1470 a->addrtype,
1471 a->addr.name.name.type,
1472 a->addr.name.name.instance,
1473 a->addr.name.name.instance,
1474 a->scope);
1475 } else if (a->addrtype == TIPC_ADDR_ID) {
1476 return Py_BuildValue("IIIII",
1477 a->addrtype,
1478 a->addr.id.node,
1479 a->addr.id.ref,
1480 0,
1481 a->scope);
1482 } else {
1483 PyErr_SetString(PyExc_ValueError,
1484 "Invalid address type");
1485 return NULL;
1486 }
1487 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001488#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001489
Serhiy Storchakad3187152017-11-09 18:00:38 +02001490#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001491 case AF_CAN:
1492 {
1493 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001494 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001495 struct ifreq ifr;
1496 /* need to look up interface name given index */
1497 if (a->can_ifindex) {
1498 ifr.ifr_ifindex = a->can_ifindex;
1499 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1500 ifname = ifr.ifr_name;
1501 }
1502
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001503 switch (proto) {
1504#ifdef CAN_ISOTP
1505 case CAN_ISOTP:
1506 {
1507 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1508 ifname,
1509 a->can_addr.tp.rx_id,
1510 a->can_addr.tp.tx_id);
1511 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001512#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07001513#ifdef CAN_J1939
1514 case CAN_J1939:
1515 {
Miss Islington (bot)62c74f32021-09-17 02:09:29 -07001516 return Py_BuildValue("O&KIB", PyUnicode_DecodeFSDefault,
karl ding360371f2020-04-29 15:31:19 -07001517 ifname,
Miss Islington (bot)62c74f32021-09-17 02:09:29 -07001518 (unsigned long long)a->can_addr.j1939.name,
1519 (unsigned int)a->can_addr.j1939.pgn,
karl ding360371f2020-04-29 15:31:19 -07001520 a->can_addr.j1939.addr);
1521 }
1522#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001523 default:
1524 {
bggardner954900a2019-09-12 06:02:48 -04001525 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001526 ifname);
1527 }
1528 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001529 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001530#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001531
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001532#ifdef PF_SYSTEM
1533 case PF_SYSTEM:
1534 switch(proto) {
1535#ifdef SYSPROTO_CONTROL
1536 case SYSPROTO_CONTROL:
1537 {
1538 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1539 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1540 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001541#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001542 default:
1543 PyErr_SetString(PyExc_ValueError,
1544 "Invalid address type");
1545 return 0;
1546 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001547#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001548
Christian Heimesdffa3942016-09-05 23:54:41 +02001549#ifdef HAVE_SOCKADDR_ALG
1550 case AF_ALG:
1551 {
1552 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1553 return Py_BuildValue("s#s#HH",
1554 a->salg_type,
1555 strnlen((const char*)a->salg_type,
1556 sizeof(a->salg_type)),
1557 a->salg_name,
1558 strnlen((const char*)a->salg_name,
1559 sizeof(a->salg_name)),
1560 a->salg_feat,
1561 a->salg_mask);
1562 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001563#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 default:
1568 /* If we don't know the address family, don't raise an
1569 exception -- return it as an (int, bytes) tuple. */
1570 return Py_BuildValue("iy#",
1571 addr->sa_family,
1572 addr->sa_data,
1573 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001576}
1577
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001578/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1579 (in particular, numeric IP addresses). */
1580struct maybe_idna {
1581 PyObject *obj;
1582 char *buf;
1583};
1584
1585static void
1586idna_cleanup(struct maybe_idna *data)
1587{
1588 Py_CLEAR(data->obj);
1589}
1590
1591static int
1592idna_converter(PyObject *obj, struct maybe_idna *data)
1593{
1594 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001595 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001596 if (obj == NULL) {
1597 idna_cleanup(data);
1598 return 1;
1599 }
1600 data->obj = NULL;
1601 len = -1;
1602 if (PyBytes_Check(obj)) {
1603 data->buf = PyBytes_AsString(obj);
1604 len = PyBytes_Size(obj);
1605 }
1606 else if (PyByteArray_Check(obj)) {
1607 data->buf = PyByteArray_AsString(obj);
1608 len = PyByteArray_Size(obj);
1609 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001610 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001611 if (PyUnicode_READY(obj) == -1) {
1612 return 0;
1613 }
1614 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001615 data->buf = PyUnicode_DATA(obj);
1616 len = PyUnicode_GET_LENGTH(obj);
1617 }
1618 else {
1619 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1620 if (!obj2) {
1621 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1622 return 0;
1623 }
1624 assert(PyBytes_Check(obj2));
1625 data->obj = obj2;
1626 data->buf = PyBytes_AS_STRING(obj2);
1627 len = PyBytes_GET_SIZE(obj2);
1628 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001629 }
1630 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001631 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001632 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001633 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 }
1635 if (strlen(data->buf) != len) {
1636 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001637 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 return 0;
1639 }
1640 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001641}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642
1643/* Parse a socket address argument according to the socket object's
1644 address family. Return 1 if the address was in the proper format,
1645 0 of not. The address is returned through addr_ret, its length
1646 through len_ret. */
1647
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001648static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001649getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001650 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001653
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001654#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 case AF_UNIX:
1656 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001657 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001658 int retval = 0;
1659
1660 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1661 allow embedded nulls on Linux. */
1662 if (PyUnicode_Check(args)) {
1663 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1664 return 0;
1665 }
1666 else
1667 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001668 if (!PyArg_Parse(args, "y*", &path)) {
1669 Py_DECREF(args);
1670 return retval;
1671 }
1672 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001673
Victor Stinnerd565fb92019-10-10 21:30:20 +02001674 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001675#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001676 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001678 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001679 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001681 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 }
1683 }
1684 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001685#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 {
1687 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001688 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001689 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001691 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001693 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 }
1695 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001696 memcpy(addr->sun_path, path.buf, path.len);
1697 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001698 retval = 1;
1699 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001700 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001701 Py_DECREF(args);
1702 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001704#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001705
Martin v. Löwis11017b12006-01-14 18:12:57 +00001706#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 case AF_NETLINK:
1708 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001710 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (!PyTuple_Check(args)) {
1712 PyErr_Format(
1713 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001714 "%s(): AF_NETLINK address must be tuple, not %.500s",
1715 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 return 0;
1717 }
Oren Milman735171e2018-09-11 19:51:29 +03001718 if (!PyArg_ParseTuple(args,
1719 "II;AF_NETLINK address must be a pair "
1720 "(pid, groups)",
1721 &pid, &groups))
1722 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001724 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 addr->nl_family = AF_NETLINK;
1726 addr->nl_pid = pid;
1727 addr->nl_groups = groups;
1728 *len_ret = sizeof(*addr);
1729 return 1;
1730 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001731#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001732
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001733#if defined(AF_QIPCRTR)
1734 case AF_QIPCRTR:
1735 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001736 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001737 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001738 if (!PyTuple_Check(args)) {
1739 PyErr_Format(
1740 PyExc_TypeError,
1741 "getsockaddrarg: "
1742 "AF_QIPCRTR address must be tuple, not %.500s",
1743 Py_TYPE(args)->tp_name);
1744 return 0;
1745 }
1746 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1747 return 0;
1748 addr->sq_family = AF_QIPCRTR;
1749 addr->sq_node = node;
1750 addr->sq_port = port;
1751 *len_ret = sizeof(*addr);
1752 return 1;
1753 }
1754#endif /* AF_QIPCRTR */
1755
caaveryeffc12f2017-09-06 18:18:10 -04001756#if defined(AF_VSOCK)
1757 case AF_VSOCK:
1758 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001759 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001760 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001761 memset(addr, 0, sizeof(struct sockaddr_vm));
1762 if (!PyTuple_Check(args)) {
1763 PyErr_Format(
1764 PyExc_TypeError,
1765 "getsockaddrarg: "
1766 "AF_VSOCK address must be tuple, not %.500s",
1767 Py_TYPE(args)->tp_name);
1768 return 0;
1769 }
1770 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1771 return 0;
1772 addr->svm_family = s->sock_family;
1773 addr->svm_port = port;
1774 addr->svm_cid = cid;
1775 *len_ret = sizeof(*addr);
1776 return 1;
1777 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001778#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001779
1780
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001781#ifdef AF_RDS
1782 case AF_RDS:
1783 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001784#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_INET:
1787 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001788 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 int port, result;
1790 if (!PyTuple_Check(args)) {
1791 PyErr_Format(
1792 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001793 "%s(): AF_INET address must be tuple, not %.500s",
1794 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 return 0;
1796 }
Oren Milman735171e2018-09-11 19:51:29 +03001797 if (!PyArg_ParseTuple(args,
1798 "O&i;AF_INET address must be a pair "
1799 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001800 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001801 {
1802 assert(PyErr_Occurred());
1803 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1804 PyErr_Format(PyExc_OverflowError,
1805 "%s(): port must be 0-65535.", caller);
1806 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001808 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001809 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001810 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001812 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (result < 0)
1814 return 0;
1815 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001816 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001818 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return 0;
1820 }
1821 addr->sin_family = AF_INET;
1822 addr->sin_port = htons((short)port);
1823 *len_ret = sizeof *addr;
1824 return 1;
1825 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001826
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001827#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 case AF_INET6:
1829 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001830 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001831 int port, result;
1832 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 flowinfo = scope_id = 0;
1834 if (!PyTuple_Check(args)) {
1835 PyErr_Format(
1836 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001837 "%s(): AF_INET6 address must be tuple, not %.500s",
1838 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return 0;
1840 }
Oren Milman735171e2018-09-11 19:51:29 +03001841 if (!PyArg_ParseTuple(args,
1842 "O&i|II;AF_INET6 address must be a tuple "
1843 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001844 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001845 &scope_id))
1846 {
1847 assert(PyErr_Occurred());
1848 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1849 PyErr_Format(PyExc_OverflowError,
1850 "%s(): port must be 0-65535.", caller);
1851 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 return 0;
1853 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001854 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001855 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001857 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 if (result < 0)
1859 return 0;
1860 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001861 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001863 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 return 0;
1865 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001866 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001867 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001868 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001869 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001870 return 0;
1871 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 addr->sin6_family = s->sock_family;
1873 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001874 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 addr->sin6_scope_id = scope_id;
1876 *len_ret = sizeof *addr;
1877 return 1;
1878 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001879#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001880
Hye-Shik Chang81268602004-02-02 06:05:24 +00001881#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 case AF_BLUETOOTH:
1883 {
1884 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001885#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 case BTPROTO_L2CAP:
1887 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001888 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001889
Victor Stinnerd565fb92019-10-10 21:30:20 +02001890 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 memset(addr, 0, sizeof(struct sockaddr_l2));
1892 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1893 if (!PyArg_ParseTuple(args, "si", &straddr,
1894 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001895 PyErr_Format(PyExc_OSError,
1896 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 return 0;
1898 }
1899 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1900 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 *len_ret = sizeof *addr;
1903 return 1;
1904 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001905#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 case BTPROTO_RFCOMM:
1907 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001908 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001909 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1911 if (!PyArg_ParseTuple(args, "si", &straddr,
1912 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001913 PyErr_Format(PyExc_OSError,
1914 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 return 0;
1916 }
1917 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1918 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 *len_ret = sizeof *addr;
1921 return 1;
1922 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001923#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 case BTPROTO_HCI:
1925 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001926 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001927#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001928 const char *straddr;
1929 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1930 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001931 PyErr_Format(PyExc_OSError, "%s: "
1932 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001933 return 0;
1934 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001935 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001936 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1937 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001938#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1940 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001941 PyErr_Format(PyExc_OSError,
1942 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 return 0;
1944 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001945#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 *len_ret = sizeof *addr;
1947 return 1;
1948 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001949#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 case BTPROTO_SCO:
1951 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001952 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001953
Victor Stinnerd565fb92019-10-10 21:30:20 +02001954 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1956 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001957 PyErr_Format(PyExc_OSError,
1958 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 return 0;
1960 }
1961 straddr = PyBytes_AS_STRING(args);
1962 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1963 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 *len_ret = sizeof *addr;
1966 return 1;
1967 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001968#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001969#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 default:
Oren Milman735171e2018-09-11 19:51:29 +03001971 PyErr_Format(PyExc_OSError,
1972 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 return 0;
1974 }
1975 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001976#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001977
Antoine Pitroub156a462010-10-27 20:13:57 +00001978#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 case AF_PACKET:
1980 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001982 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 int protoNumber;
1984 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001985 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001986 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 if (!PyTuple_Check(args)) {
1989 PyErr_Format(
1990 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001991 "%s(): AF_PACKET address must be tuple, not %.500s",
1992 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 return 0;
1994 }
Oren Milman735171e2018-09-11 19:51:29 +03001995 /* XXX: improve the default error message according to the
1996 documentation of AF_PACKET, which would be added as part
1997 of bpo-25041. */
1998 if (!PyArg_ParseTuple(args,
1999 "si|iiy*;AF_PACKET address must be a tuple of "
2000 "two to five elements",
2001 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002002 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002003 {
2004 assert(PyErr_Occurred());
2005 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2006 PyErr_Format(PyExc_OverflowError,
2007 "%s(): address argument out of range", caller);
2008 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002010 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2012 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2013 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2014 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002015 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 return 0;
2017 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002018 if (haddr.buf && haddr.len > 8) {
2019 PyErr_SetString(PyExc_ValueError,
2020 "Hardware address must be 8 bytes or less");
2021 PyBuffer_Release(&haddr);
2022 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 }
2024 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002025 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002027 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002028 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 return 0;
2030 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002031 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 addr->sll_family = AF_PACKET;
2033 addr->sll_protocol = htons((short)protoNumber);
2034 addr->sll_ifindex = ifr.ifr_ifindex;
2035 addr->sll_pkttype = pkttype;
2036 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002037 if (haddr.buf) {
2038 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2039 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002041 else
2042 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002044 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 return 1;
2046 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002047#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048
Christian Heimes043d6f62008-01-07 17:19:16 +00002049#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 case AF_TIPC:
2051 {
2052 unsigned int atype, v1, v2, v3;
2053 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 if (!PyTuple_Check(args)) {
2056 PyErr_Format(
2057 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002058 "%s(): AF_TIPC address must be tuple, not %.500s",
2059 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return 0;
2061 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002064 "IIII|I;AF_TIPC address must be a tuple "
2065 "(addr_type, v1, v2, v3[, scope])",
2066 &atype, &v1, &v2, &v3, &scope))
2067 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002069 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002070
Victor Stinnerd565fb92019-10-10 21:30:20 +02002071 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 addr->family = AF_TIPC;
2075 addr->scope = scope;
2076 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 if (atype == TIPC_ADDR_NAMESEQ) {
2079 addr->addr.nameseq.type = v1;
2080 addr->addr.nameseq.lower = v2;
2081 addr->addr.nameseq.upper = v3;
2082 } else if (atype == TIPC_ADDR_NAME) {
2083 addr->addr.name.name.type = v1;
2084 addr->addr.name.name.instance = v2;
2085 } else if (atype == TIPC_ADDR_ID) {
2086 addr->addr.id.node = v1;
2087 addr->addr.id.ref = v2;
2088 } else {
2089 /* Shouldn't happen */
2090 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2091 return 0;
2092 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 return 1;
2097 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002098#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002099
Serhiy Storchakad3187152017-11-09 18:00:38 +02002100#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002101 case AF_CAN:
2102 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002103#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002104 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002105 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002106#endif
2107#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002108 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002109#endif
2110#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002111 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002112 PyObject *interfaceName;
2113 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002114 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002115 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002116
Oren Milman735171e2018-09-11 19:51:29 +03002117 if (!PyTuple_Check(args)) {
2118 PyErr_Format(PyExc_TypeError,
2119 "%s(): AF_CAN address must be tuple, not %.500s",
2120 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002121 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002122 }
2123 if (!PyArg_ParseTuple(args,
2124 "O&;AF_CAN address must be a tuple "
2125 "(interface, )",
2126 PyUnicode_FSConverter, &interfaceName))
2127 {
2128 return 0;
2129 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002130
2131 len = PyBytes_GET_SIZE(interfaceName);
2132
2133 if (len == 0) {
2134 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002135 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002136 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2137 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002138 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2139 s->errorhandler();
2140 Py_DECREF(interfaceName);
2141 return 0;
2142 }
2143 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002144 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002145 "AF_CAN interface name too long");
2146 Py_DECREF(interfaceName);
2147 return 0;
2148 }
2149
2150 addr->can_family = AF_CAN;
2151 addr->can_ifindex = ifr.ifr_ifindex;
2152
2153 *len_ret = sizeof(*addr);
2154 Py_DECREF(interfaceName);
2155 return 1;
2156 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002157#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002158
2159#ifdef CAN_ISOTP
2160 case CAN_ISOTP:
2161 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002162 PyObject *interfaceName;
2163 struct ifreq ifr;
2164 Py_ssize_t len;
2165 unsigned long int rx_id, tx_id;
2166
Victor Stinnerd565fb92019-10-10 21:30:20 +02002167 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002168
2169 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2170 &interfaceName,
2171 &rx_id,
2172 &tx_id))
2173 return 0;
2174
2175 len = PyBytes_GET_SIZE(interfaceName);
2176
2177 if (len == 0) {
2178 ifr.ifr_ifindex = 0;
2179 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2180 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2181 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2182 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2183 s->errorhandler();
2184 Py_DECREF(interfaceName);
2185 return 0;
2186 }
2187 } else {
2188 PyErr_SetString(PyExc_OSError,
2189 "AF_CAN interface name too long");
2190 Py_DECREF(interfaceName);
2191 return 0;
2192 }
2193
2194 addr->can_family = AF_CAN;
2195 addr->can_ifindex = ifr.ifr_ifindex;
2196 addr->can_addr.tp.rx_id = rx_id;
2197 addr->can_addr.tp.tx_id = tx_id;
2198
2199 *len_ret = sizeof(*addr);
2200 Py_DECREF(interfaceName);
2201 return 1;
2202 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002203#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002204#ifdef CAN_J1939
2205 case CAN_J1939:
2206 {
2207 PyObject *interfaceName;
2208 struct ifreq ifr;
2209 Py_ssize_t len;
Miss Islington (bot)62c74f32021-09-17 02:09:29 -07002210 unsigned long long j1939_name; /* at least 64 bits */
2211 unsigned int j1939_pgn; /* at least 32 bits */
karl ding360371f2020-04-29 15:31:19 -07002212 uint8_t j1939_addr;
2213
2214 struct sockaddr_can *addr = &addrbuf->can;
2215
Miss Islington (bot)62c74f32021-09-17 02:09:29 -07002216 if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
karl ding360371f2020-04-29 15:31:19 -07002217 &interfaceName,
2218 &j1939_name,
2219 &j1939_pgn,
2220 &j1939_addr))
2221 return 0;
2222
2223 len = PyBytes_GET_SIZE(interfaceName);
2224
2225 if (len == 0) {
2226 ifr.ifr_ifindex = 0;
2227 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2228 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2229 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2230 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2231 s->errorhandler();
2232 Py_DECREF(interfaceName);
2233 return 0;
2234 }
2235 } else {
2236 PyErr_SetString(PyExc_OSError,
2237 "AF_CAN interface name too long");
2238 Py_DECREF(interfaceName);
2239 return 0;
2240 }
2241
2242 addr->can_family = AF_CAN;
2243 addr->can_ifindex = ifr.ifr_ifindex;
Miss Islington (bot)62c74f32021-09-17 02:09:29 -07002244 addr->can_addr.j1939.name = (uint64_t)j1939_name;
2245 addr->can_addr.j1939.pgn = (uint32_t)j1939_pgn;
karl ding360371f2020-04-29 15:31:19 -07002246 addr->can_addr.j1939.addr = j1939_addr;
2247
2248 *len_ret = sizeof(*addr);
2249 Py_DECREF(interfaceName);
2250 return 1;
2251 }
2252#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002253 default:
Oren Milman735171e2018-09-11 19:51:29 +03002254 PyErr_Format(PyExc_OSError,
2255 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002256 return 0;
2257 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002258#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002259
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002260#ifdef PF_SYSTEM
2261 case PF_SYSTEM:
2262 switch (s->sock_proto) {
2263#ifdef SYSPROTO_CONTROL
2264 case SYSPROTO_CONTROL:
2265 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002266 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002267 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002268 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002269
2270 if (PyUnicode_Check(args)) {
2271 struct ctl_info info;
2272 PyObject *ctl_name;
2273
2274 if (!PyArg_Parse(args, "O&",
2275 PyUnicode_FSConverter, &ctl_name)) {
2276 return 0;
2277 }
2278
Victor Stinnerf50e1872015-03-20 11:32:24 +01002279 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002280 PyErr_SetString(PyExc_ValueError,
2281 "provided string is too long");
2282 Py_DECREF(ctl_name);
2283 return 0;
2284 }
2285 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2286 sizeof(info.ctl_name));
2287 Py_DECREF(ctl_name);
2288
2289 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2290 PyErr_SetString(PyExc_OSError,
2291 "cannot find kernel control with provided name");
2292 return 0;
2293 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002294
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002295 addr->sc_id = info.ctl_id;
2296 addr->sc_unit = 0;
2297 } else if (!PyArg_ParseTuple(args, "II",
2298 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002299 PyErr_Format(PyExc_TypeError,
2300 "%s(): PF_SYSTEM address must be a str or "
2301 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002302 return 0;
2303 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002304
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002305 *len_ret = sizeof(*addr);
2306 return 1;
2307 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002308#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002309 default:
Oren Milman735171e2018-09-11 19:51:29 +03002310 PyErr_Format(PyExc_OSError,
2311 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002312 return 0;
2313 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002314#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002315#ifdef HAVE_SOCKADDR_ALG
2316 case AF_ALG:
2317 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002318 const char *type;
2319 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002320 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002321
2322 memset(sa, 0, sizeof(*sa));
2323 sa->salg_family = AF_ALG;
2324
Oren Milman735171e2018-09-11 19:51:29 +03002325 if (!PyTuple_Check(args)) {
2326 PyErr_Format(PyExc_TypeError,
2327 "%s(): AF_ALG address must be tuple, not %.500s",
2328 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002329 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002330 }
2331 if (!PyArg_ParseTuple(args,
2332 "ss|HH;AF_ALG address must be a tuple "
2333 "(type, name[, feat[, mask]])",
2334 &type, &name, &sa->salg_feat, &sa->salg_mask))
2335 {
2336 return 0;
2337 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002338 /* sockaddr_alg has fixed-sized char arrays for type, and name
2339 * both must be NULL terminated.
2340 */
2341 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002342 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2343 return 0;
2344 }
2345 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002346 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002347 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2348 return 0;
2349 }
2350 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2351
2352 *len_ret = sizeof(*sa);
2353 return 1;
2354 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002355#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 default:
Oren Milman735171e2018-09-11 19:51:29 +03002360 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002364}
2365
Guido van Rossum30a685f1991-06-27 15:51:29 +00002366
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002368 Return 1 if the family is known, 0 otherwise. The length is returned
2369 through len_ret. */
2370
2371static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002372getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002375
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002376#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 case AF_UNIX:
2378 {
2379 *len_ret = sizeof (struct sockaddr_un);
2380 return 1;
2381 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002382#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002383
Martin v. Löwis11017b12006-01-14 18:12:57 +00002384#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002385 case AF_NETLINK:
2386 {
2387 *len_ret = sizeof (struct sockaddr_nl);
2388 return 1;
2389 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002390#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002391
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002392#if defined(AF_QIPCRTR)
2393 case AF_QIPCRTR:
2394 {
2395 *len_ret = sizeof (struct sockaddr_qrtr);
2396 return 1;
2397 }
2398#endif /* AF_QIPCRTR */
2399
caaveryeffc12f2017-09-06 18:18:10 -04002400#if defined(AF_VSOCK)
2401 case AF_VSOCK:
2402 {
2403 *len_ret = sizeof (struct sockaddr_vm);
2404 return 1;
2405 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002406#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002407
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002408#ifdef AF_RDS
2409 case AF_RDS:
2410 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002411#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 case AF_INET:
2414 {
2415 *len_ret = sizeof (struct sockaddr_in);
2416 return 1;
2417 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002418
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002419#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 case AF_INET6:
2421 {
2422 *len_ret = sizeof (struct sockaddr_in6);
2423 return 1;
2424 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002425#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002426
Hye-Shik Chang81268602004-02-02 06:05:24 +00002427#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 case AF_BLUETOOTH:
2429 {
2430 switch(s->sock_proto)
2431 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002432
Greg Bowser8fbece12019-08-02 16:29:52 -04002433#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 case BTPROTO_L2CAP:
2435 *len_ret = sizeof (struct sockaddr_l2);
2436 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002437#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 case BTPROTO_RFCOMM:
2439 *len_ret = sizeof (struct sockaddr_rc);
2440 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002441#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 case BTPROTO_HCI:
2443 *len_ret = sizeof (struct sockaddr_hci);
2444 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002445#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 case BTPROTO_SCO:
2447 *len_ret = sizeof (struct sockaddr_sco);
2448 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002449#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002450#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002452 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 "unknown BT protocol");
2454 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 }
2457 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002458#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002459
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002460#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 case AF_PACKET:
2462 {
2463 *len_ret = sizeof (struct sockaddr_ll);
2464 return 1;
2465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002466#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002467
Christian Heimes043d6f62008-01-07 17:19:16 +00002468#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 case AF_TIPC:
2470 {
2471 *len_ret = sizeof (struct sockaddr_tipc);
2472 return 1;
2473 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002474#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002475
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002476#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002477 case AF_CAN:
2478 {
2479 *len_ret = sizeof (struct sockaddr_can);
2480 return 1;
2481 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002482#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002483
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002484#ifdef PF_SYSTEM
2485 case PF_SYSTEM:
2486 switch(s->sock_proto) {
2487#ifdef SYSPROTO_CONTROL
2488 case SYSPROTO_CONTROL:
2489 *len_ret = sizeof (struct sockaddr_ctl);
2490 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002491#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002492 default:
2493 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2494 "unknown PF_SYSTEM protocol");
2495 return 0;
2496 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002497#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002498#ifdef HAVE_SOCKADDR_ALG
2499 case AF_ALG:
2500 {
2501 *len_ret = sizeof (struct sockaddr_alg);
2502 return 1;
2503 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002504#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002509 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002513}
2514
2515
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002516/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2517 Currently, these methods are only compiled if the RFC 2292/3542
2518 CMSG_LEN() macro is available. Older systems seem to have used
2519 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2520 it may be possible to define CMSG_LEN() that way if it's not
2521 provided. Some architectures might need extra padding after the
2522 cmsghdr, however, and CMSG_LEN() would have to take account of
2523 this. */
2524#ifdef CMSG_LEN
2525/* If length is in range, set *result to CMSG_LEN(length) and return
2526 true; otherwise, return false. */
2527static int
2528get_CMSG_LEN(size_t length, size_t *result)
2529{
2530 size_t tmp;
2531
2532 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2533 return 0;
2534 tmp = CMSG_LEN(length);
2535 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2536 return 0;
2537 *result = tmp;
2538 return 1;
2539}
2540
2541#ifdef CMSG_SPACE
2542/* If length is in range, set *result to CMSG_SPACE(length) and return
2543 true; otherwise, return false. */
2544static int
2545get_CMSG_SPACE(size_t length, size_t *result)
2546{
2547 size_t tmp;
2548
2549 /* Use CMSG_SPACE(1) here in order to take account of the padding
2550 necessary before *and* after the data. */
2551 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2552 return 0;
2553 tmp = CMSG_SPACE(length);
2554 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2555 return 0;
2556 *result = tmp;
2557 return 1;
2558}
2559#endif
2560
2561/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2562 pointer in msg->msg_control with at least "space" bytes after it,
2563 and its cmsg_len member inside the buffer. */
2564static int
2565cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2566{
2567 size_t cmsg_offset;
2568 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2569 sizeof(cmsgh->cmsg_len));
2570
Charles-François Natali466517d2011-08-28 18:23:43 +02002571 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002572 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002573 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002574 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2575 annoying under OS X as it's unsigned there and so it triggers a
2576 tautological comparison warning under Clang when compared against 0.
2577 Since the check is valid on other platforms, silence the warning under
2578 Clang. */
2579 #ifdef __clang__
2580 #pragma clang diagnostic push
2581 #pragma clang diagnostic ignored "-Wtautological-compare"
2582 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002583 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002584 #pragma GCC diagnostic push
2585 #pragma GCC diagnostic ignored "-Wtype-limits"
2586 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002587 if (msg->msg_controllen < 0)
2588 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002589 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002590 #pragma GCC diagnostic pop
2591 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002592 #ifdef __clang__
2593 #pragma clang diagnostic pop
2594 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002595 if (space < cmsg_len_end)
2596 space = cmsg_len_end;
2597 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2598 return (cmsg_offset <= (size_t)-1 - space &&
2599 cmsg_offset + space <= msg->msg_controllen);
2600}
2601
2602/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2603 *space to number of bytes following it in the buffer and return
2604 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2605 msg->msg_controllen are valid. */
2606static int
2607get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2608{
2609 size_t data_offset;
2610 char *data_ptr;
2611
2612 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2613 return 0;
2614 data_offset = data_ptr - (char *)msg->msg_control;
2615 if (data_offset > msg->msg_controllen)
2616 return 0;
2617 *space = msg->msg_controllen - data_offset;
2618 return 1;
2619}
2620
2621/* If cmsgh is invalid or not contained in the buffer pointed to by
2622 msg->msg_control, return -1. If cmsgh is valid and its associated
2623 data is entirely contained in the buffer, set *data_len to the
2624 length of the associated data and return 0. If only part of the
2625 associated data is contained in the buffer but cmsgh is otherwise
2626 valid, set *data_len to the length contained in the buffer and
2627 return 1. */
2628static int
2629get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2630{
2631 size_t space, cmsg_data_len;
2632
2633 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2634 cmsgh->cmsg_len < CMSG_LEN(0))
2635 return -1;
2636 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2637 if (!get_cmsg_data_space(msg, cmsgh, &space))
2638 return -1;
2639 if (space >= cmsg_data_len) {
2640 *data_len = cmsg_data_len;
2641 return 0;
2642 }
2643 *data_len = space;
2644 return 1;
2645}
2646#endif /* CMSG_LEN */
2647
2648
Victor Stinner31bf2d52015-04-01 21:57:09 +02002649struct sock_accept {
2650 socklen_t *addrlen;
2651 sock_addr_t *addrbuf;
2652 SOCKET_T result;
2653};
2654
2655#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2656/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2657static int accept4_works = -1;
2658#endif
2659
2660static int
2661sock_accept_impl(PySocketSockObject *s, void *data)
2662{
2663 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002664 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2665 socklen_t *paddrlen = ctx->addrlen;
2666#ifdef HAVE_SOCKADDR_ALG
2667 /* AF_ALG does not support accept() with addr and raises
2668 * ECONNABORTED instead. */
2669 if (s->sock_family == AF_ALG) {
2670 addr = NULL;
2671 paddrlen = NULL;
2672 *ctx->addrlen = 0;
2673 }
2674#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002675
2676#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2677 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002678 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002679 SOCK_CLOEXEC);
2680 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2681 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2682 accept4_works = (errno != ENOSYS);
2683 }
2684 }
2685 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002686 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002687#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002688 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002689#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002690
2691#ifdef MS_WINDOWS
2692 return (ctx->result != INVALID_SOCKET);
2693#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002694 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002695#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002696}
2697
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002698/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002699
Guido van Rossum73624e91994-10-10 17:59:00 +00002700static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302701sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002704 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 socklen_t addrlen;
2706 PyObject *sock = NULL;
2707 PyObject *addr = NULL;
2708 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002709 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 if (!getsockaddrlen(s, &addrlen))
2712 return NULL;
2713 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if (!IS_SELECTABLE(s))
2716 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002717
Victor Stinner31bf2d52015-04-01 21:57:09 +02002718 ctx.addrlen = &addrlen;
2719 ctx.addrbuf = &addrbuf;
2720 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002722 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002723
Victor Stinnerdaf45552013-08-28 00:53:59 +02002724#ifdef MS_WINDOWS
2725 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2726 PyErr_SetFromWindowsErr(0);
2727 SOCKETCLOSE(newfd);
2728 goto finally;
2729 }
2730#else
2731
2732#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2733 if (!accept4_works)
2734#endif
2735 {
2736 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2737 SOCKETCLOSE(newfd);
2738 goto finally;
2739 }
2740 }
2741#endif
2742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 sock = PyLong_FromSocket_t(newfd);
2744 if (sock == NULL) {
2745 SOCKETCLOSE(newfd);
2746 goto finally;
2747 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2750 addrlen, s->sock_proto);
2751 if (addr == NULL)
2752 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002755
Guido van Rossum67f7a382002-06-06 21:08:16 +00002756finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 Py_XDECREF(sock);
2758 Py_XDECREF(addr);
2759 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002760}
2761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002763"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002764\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002765Wait for an incoming connection. Return a new socket file descriptor\n\
2766representing the connection, and the address of the client.\n\
2767For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768
Guido van Rossum11ba0942002-06-13 15:07:44 +00002769/* s.setblocking(flag) method. Argument:
2770 False -- non-blocking mode; same as settimeout(0)
2771 True -- blocking mode; same as settimeout(None)
2772*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002773
Guido van Rossum73624e91994-10-10 17:59:00 +00002774static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002775sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002776{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002777 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 block = PyLong_AsLong(arg);
2780 if (block == -1 && PyErr_Occurred())
2781 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002782
Victor Stinner9001d802015-04-06 23:06:01 +02002783 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002784 if (internal_setblocking(s, block) == -1) {
2785 return NULL;
2786 }
2787 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002788}
Guido van Rossume4485b01994-09-07 14:32:49 +00002789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002790PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002791"setblocking(flag)\n\
2792\n\
2793Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002794setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002795setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002796
Yury Selivanovf11b4602018-01-28 17:27:38 -05002797/* s.getblocking() method.
2798 Returns True if socket is in blocking mode,
2799 False if it is in non-blocking mode.
2800*/
2801static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302802sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002803{
2804 if (s->sock_timeout) {
2805 Py_RETURN_TRUE;
2806 }
2807 else {
2808 Py_RETURN_FALSE;
2809 }
2810}
2811
2812PyDoc_STRVAR(getblocking_doc,
2813"getblocking()\n\
2814\n\
2815Returns True if socket is in blocking mode, or False if it\n\
2816is in non-blocking mode.");
2817
Victor Stinner71694d52015-03-28 01:18:54 +01002818static int
2819socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2820{
2821#ifdef MS_WINDOWS
2822 struct timeval tv;
2823#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002824#ifndef HAVE_POLL
2825 _PyTime_t ms;
2826#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002827 int overflow = 0;
2828
2829 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002830 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002831 return 0;
2832 }
2833
Victor Stinner869e1772015-03-30 03:49:14 +02002834 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002835 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002836 return -1;
2837
2838 if (*timeout < 0) {
2839 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2840 return -1;
2841 }
2842
2843#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002844 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002845#endif
2846#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002847 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002848 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002849#endif
2850 if (overflow) {
2851 PyErr_SetString(PyExc_OverflowError,
2852 "timeout doesn't fit into C timeval");
2853 return -1;
2854 }
2855
2856 return 0;
2857}
2858
Guido van Rossum11ba0942002-06-13 15:07:44 +00002859/* s.settimeout(timeout) method. Argument:
2860 None -- no timeout, blocking mode; same as setblocking(True)
2861 0.0 -- non-blocking mode; same as setblocking(False)
2862 > 0 -- timeout mode; operations time out after timeout seconds
2863 < 0 -- illegal; raises an exception
2864*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002865static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002866sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002867{
Victor Stinner71694d52015-03-28 01:18:54 +01002868 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002869
Victor Stinner71694d52015-03-28 01:18:54 +01002870 if (socket_parse_timeout(&timeout, arg) < 0)
2871 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002874
2875 int block = timeout < 0;
2876 /* Blocking mode for a Python socket object means that operations
2877 like :meth:`recv` or :meth:`sendall` will block the execution of
2878 the current thread until they are complete or aborted with a
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002879 `TimeoutError` or `socket.error` errors. When timeout is `None`,
Yury Selivanovf11b4602018-01-28 17:27:38 -05002880 the underlying FD is in a blocking mode. When timeout is a positive
2881 number, the FD is in a non-blocking mode, and socket ops are
2882 implemented with a `select()` call.
2883
2884 When timeout is 0.0, the FD is in a non-blocking mode.
2885
2886 This table summarizes all states in which the socket object and
2887 its underlying FD can be:
2888
2889 ==================== ===================== ==============
2890 `gettimeout()` `getblocking()` FD
2891 ==================== ===================== ==============
2892 ``None`` ``True`` blocking
2893 ``0.0`` ``False`` non-blocking
2894 ``> 0`` ``True`` non-blocking
2895 */
2896
2897 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002898 return NULL;
2899 }
2900 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002901}
2902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002903PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002904"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002905\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002906Set a timeout on socket operations. 'timeout' can be a float,\n\
2907giving in seconds, or None. Setting a timeout of None disables\n\
2908the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002911/* s.gettimeout() method.
2912 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002913static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302914sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915{
Victor Stinner71694d52015-03-28 01:18:54 +01002916 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002917 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 }
Victor Stinner71694d52015-03-28 01:18:54 +01002919 else {
2920 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2921 return PyFloat_FromDouble(seconds);
2922 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002923}
2924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002925PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002926"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002927\n\
oldkaa0735f2018-02-02 16:52:55 +08002928Returns the timeout in seconds (float) associated with socket\n\
2929operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002931
Guido van Rossumaee08791992-09-08 09:05:33 +00002932/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002933 With an integer third argument, sets an integer optval with optlen=4.
2934 With None as third argument and an integer fourth argument, set
2935 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002936 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002937 use optional built-in module 'struct' to encode the string.
2938*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002939
Guido van Rossum73624e91994-10-10 17:59:00 +00002940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002941sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 int level;
2944 int optname;
2945 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002946 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002948 unsigned int optlen;
2949 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002950
caaveryeffc12f2017-09-06 18:18:10 -04002951#ifdef AF_VSOCK
2952 if (s->sock_family == AF_VSOCK) {
2953 uint64_t vflag; // Must be set width of 64 bits
2954 /* setsockopt(level, opt, flag) */
2955 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2956 &level, &optname, &vflag)) {
2957 // level should always be set to AF_VSOCK
2958 res = setsockopt(s->sock_fd, level, optname,
2959 (void*)&vflag, sizeof vflag);
2960 goto done;
2961 }
2962 return NULL;
2963 }
2964#endif
2965
Christian Heimesdffa3942016-09-05 23:54:41 +02002966 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 if (PyArg_ParseTuple(args, "iii:setsockopt",
2968 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002969 res = setsockopt(s->sock_fd, level, optname,
2970 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002971 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002973
2974 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002975 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002976 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2977 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2978 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002979 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002980 NULL, (socklen_t)optlen);
2981 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002983
2984 PyErr_Clear();
2985 /* setsockopt(level, opt, buffer) */
2986 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2987 &level, &optname, &optval))
2988 return NULL;
2989
2990#ifdef MS_WINDOWS
2991 if (optval.len > INT_MAX) {
2992 PyBuffer_Release(&optval);
2993 PyErr_Format(PyExc_OverflowError,
2994 "socket option is larger than %i bytes",
2995 INT_MAX);
2996 return NULL;
2997 }
2998 res = setsockopt(s->sock_fd, level, optname,
2999 optval.buf, (int)optval.len);
3000#else
3001 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3002#endif
3003 PyBuffer_Release(&optval);
3004
3005done:
Victor Stinnercc739322016-03-23 21:35:29 +01003006 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003008 }
3009
3010 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003011}
3012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003013PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003014"setsockopt(level, option, value: int)\n\
3015setsockopt(level, option, value: buffer)\n\
3016setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003017\n\
3018Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003019The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003020None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003021
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003022
Guido van Rossumaee08791992-09-08 09:05:33 +00003023/* s.getsockopt() method.
3024 With two arguments, retrieves an integer option.
3025 With a third integer argument, retrieves a string buffer of that size;
3026 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003027
Guido van Rossum73624e91994-10-10 17:59:00 +00003028static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003029sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 int level;
3032 int optname;
3033 int res;
3034 PyObject *buf;
3035 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003036 int flag = 0;
3037 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3040 &level, &optname, &buflen))
3041 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003044#ifdef AF_VSOCK
3045 if (s->sock_family == AF_VSOCK) {
3046 uint64_t vflag = 0; // Must be set width of 64 bits
3047 flagsize = sizeof vflag;
3048 res = getsockopt(s->sock_fd, level, optname,
3049 (void *)&vflag, &flagsize);
3050 if (res < 0)
3051 return s->errorhandler();
3052 return PyLong_FromUnsignedLong(vflag);
3053 }
3054#endif
3055 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 res = getsockopt(s->sock_fd, level, optname,
3057 (void *)&flag, &flagsize);
3058 if (res < 0)
3059 return s->errorhandler();
3060 return PyLong_FromLong(flag);
3061 }
caaveryeffc12f2017-09-06 18:18:10 -04003062#ifdef AF_VSOCK
3063 if (s->sock_family == AF_VSOCK) {
3064 PyErr_SetString(PyExc_OSError,
3065 "getsockopt string buffer not allowed");
3066 return NULL;
3067 }
3068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003070 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 "getsockopt buflen out of range");
3072 return NULL;
3073 }
3074 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3075 if (buf == NULL)
3076 return NULL;
3077 res = getsockopt(s->sock_fd, level, optname,
3078 (void *)PyBytes_AS_STRING(buf), &buflen);
3079 if (res < 0) {
3080 Py_DECREF(buf);
3081 return s->errorhandler();
3082 }
3083 _PyBytes_Resize(&buf, buflen);
3084 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003085}
3086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003087PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088"getsockopt(level, option[, buffersize]) -> value\n\
3089\n\
3090Get a socket option. See the Unix manual for level and option.\n\
3091If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003092string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003093
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003094
Fred Drake728819a2000-07-01 03:40:12 +00003095/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003096
Guido van Rossum73624e91994-10-10 17:59:00 +00003097static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003098sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 sock_addr_t addrbuf;
3101 int addrlen;
3102 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003103
Victor Stinnerd565fb92019-10-10 21:30:20 +02003104 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003106 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003107
3108 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3109 return NULL;
3110 }
3111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 Py_BEGIN_ALLOW_THREADS
3113 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3114 Py_END_ALLOW_THREADS
3115 if (res < 0)
3116 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003117 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003118}
3119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003120PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003121"bind(address)\n\
3122\n\
3123Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003124pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003125sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003126
Guido van Rossum30a685f1991-06-27 15:51:29 +00003127
3128/* s.close() method.
3129 Set the file descriptor to -1 so operations tried subsequently
3130 will surely fail. */
3131
Guido van Rossum73624e91994-10-10 17:59:00 +00003132static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303133sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003136 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003137
Victor Stinner19a8e842016-03-21 16:36:48 +01003138 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003139 if (fd != INVALID_SOCKET) {
3140 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003141
3142 /* We do not want to retry upon EINTR: see
3143 http://lwn.net/Articles/576478/ and
3144 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3145 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003147 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003149 /* bpo-30319: The peer can already have closed the connection.
3150 Python ignores ECONNRESET on close(). */
3151 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003152 return s->errorhandler();
3153 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003155 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003156}
3157
Christian Heimesd0e31b92018-01-27 09:54:13 +01003158PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003159"close()\n\
3160\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003161Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003162
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003163static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303164sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003165{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003166 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003167 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003168 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003169}
3170
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003171PyDoc_STRVAR(detach_doc,
3172"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003173\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003174Close the socket object without closing the underlying file descriptor.\n\
3175The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003176can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003177
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003178static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003179sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003180{
Victor Stinner81c41db2015-04-02 11:50:57 +02003181 int err;
3182 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003183
Victor Stinner81c41db2015-04-02 11:50:57 +02003184 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3185 /* getsockopt() failed */
3186 return 0;
3187 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003188
Victor Stinner81c41db2015-04-02 11:50:57 +02003189 if (err == EISCONN)
3190 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003191 if (err != 0) {
3192 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3193 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003194 return 0;
3195 }
3196 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003197}
3198
3199static int
3200internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3201 int raise)
3202{
3203 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003204
3205 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003207 Py_END_ALLOW_THREADS
3208
Victor Stinner70a46f62015-03-31 22:03:59 +02003209 if (!res) {
3210 /* connect() succeeded, the socket is connected */
3211 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003213
Victor Stinner81c41db2015-04-02 11:50:57 +02003214 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003215
Victor Stinner81c41db2015-04-02 11:50:57 +02003216 /* save error, PyErr_CheckSignals() can replace it */
3217 err = GET_SOCK_ERROR;
3218 if (CHECK_ERRNO(EINTR)) {
3219 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003220 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003221
3222 /* Issue #23618: when connect() fails with EINTR, the connection is
3223 running asynchronously.
3224
3225 If the socket is blocking or has a timeout, wait until the
3226 connection completes, fails or timed out using select(), and then
3227 get the connection status using getsockopt(SO_ERROR).
3228
3229 If the socket is non-blocking, raise InterruptedError. The caller is
3230 responsible to wait until the connection completes, fails or timed
3231 out (it's the case in asyncio for example). */
3232 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3233 }
3234 else {
3235 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3236 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003237 }
3238
Victor Stinner81c41db2015-04-02 11:50:57 +02003239 if (!wait_connect) {
3240 if (raise) {
3241 /* restore error, maybe replaced by PyErr_CheckSignals() */
3242 SET_SOCK_ERROR(err);
3243 s->errorhandler();
3244 return -1;
3245 }
3246 else
3247 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003248 }
3249
Victor Stinner81c41db2015-04-02 11:50:57 +02003250 if (raise) {
3251 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003252 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3253 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003254 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003255 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003256 else {
3257 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003258 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3259 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003260 return err;
3261 }
3262 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003263}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003264
Fred Drake728819a2000-07-01 03:40:12 +00003265/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003266
Guido van Rossum73624e91994-10-10 17:59:00 +00003267static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003268sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 sock_addr_t addrbuf;
3271 int addrlen;
3272 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003273
Victor Stinnerd565fb92019-10-10 21:30:20 +02003274 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003276 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003277
Steve Dowerb82e17e2019-05-23 08:45:22 -07003278 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3279 return NULL;
3280 }
3281
Victor Stinner81c41db2015-04-02 11:50:57 +02003282 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003283 if (res < 0)
3284 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003285
Victor Stinneree699e92015-03-31 21:28:42 +02003286 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003287}
3288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003289PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290"connect(address)\n\
3291\n\
3292Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003293is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003294
Guido van Rossum30a685f1991-06-27 15:51:29 +00003295
Fred Drake728819a2000-07-01 03:40:12 +00003296/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003297
3298static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003299sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 sock_addr_t addrbuf;
3302 int addrlen;
3303 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003304
Victor Stinnerd565fb92019-10-10 21:30:20 +02003305 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003307 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003308
Steve Dowerb82e17e2019-05-23 08:45:22 -07003309 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3310 return NULL;
3311 }
3312
Victor Stinner81c41db2015-04-02 11:50:57 +02003313 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003314 if (res < 0)
3315 return NULL;
3316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003318}
3319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003320PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003321"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003322\n\
3323This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003325
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003326
Guido van Rossumed233a51992-06-23 09:07:03 +00003327/* s.fileno() method */
3328
Guido van Rossum73624e91994-10-10 17:59:00 +00003329static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303330sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003333}
3334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003335PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003336"fileno() -> integer\n\
3337\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003338Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003339
Guido van Rossumed233a51992-06-23 09:07:03 +00003340
Guido van Rossumc89705d1992-11-26 08:54:07 +00003341/* s.getsockname() method */
3342
Guido van Rossum73624e91994-10-10 17:59:00 +00003343static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303344sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 sock_addr_t addrbuf;
3347 int res;
3348 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (!getsockaddrlen(s, &addrlen))
3351 return NULL;
3352 memset(&addrbuf, 0, addrlen);
3353 Py_BEGIN_ALLOW_THREADS
3354 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3355 Py_END_ALLOW_THREADS
3356 if (res < 0)
3357 return s->errorhandler();
3358 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3359 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003360}
3361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003362PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003363"getsockname() -> address info\n\
3364\n\
Christian Heimescf3565c2020-12-23 08:25:57 +01003365Return the address of the local endpoint. The format depends on the\n\
3366address family. For IPv4 sockets, the address info is a pair\n\
3367(hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003368
Guido van Rossumc89705d1992-11-26 08:54:07 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003371/* s.getpeername() method */
3372
Guido van Rossum73624e91994-10-10 17:59:00 +00003373static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303374sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 sock_addr_t addrbuf;
3377 int res;
3378 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 if (!getsockaddrlen(s, &addrlen))
3381 return NULL;
3382 memset(&addrbuf, 0, addrlen);
3383 Py_BEGIN_ALLOW_THREADS
3384 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3385 Py_END_ALLOW_THREADS
3386 if (res < 0)
3387 return s->errorhandler();
3388 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3389 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003390}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003392PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003393"getpeername() -> address info\n\
3394\n\
3395Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003396info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003397
Guido van Rossumb6775db1994-08-01 11:34:53 +00003398#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003399
3400
Guido van Rossum30a685f1991-06-27 15:51:29 +00003401/* s.listen(n) method */
3402
Guido van Rossum73624e91994-10-10 17:59:00 +00003403static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003404sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003405{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003406 /* We try to choose a default backlog high enough to avoid connection drops
3407 * for common workloads, yet not too high to limit resource usage. */
3408 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003410
Charles-François Natali644b8f52014-05-22 19:45:39 +01003411 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003415 /* To avoid problems on systems that don't allow a negative backlog
3416 * (which doesn't make sense anyway) we force a minimum value of 0. */
3417 if (backlog < 0)
3418 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 res = listen(s->sock_fd, backlog);
3420 Py_END_ALLOW_THREADS
3421 if (res < 0)
3422 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003423 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003424}
3425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003426PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003427"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003428\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003429Enable a server to accept connections. If backlog is specified, it must be\n\
3430at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003431unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003432connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003433
Victor Stinner31bf2d52015-04-01 21:57:09 +02003434struct sock_recv {
3435 char *cbuf;
3436 Py_ssize_t len;
3437 int flags;
3438 Py_ssize_t result;
3439};
3440
3441static int
3442sock_recv_impl(PySocketSockObject *s, void *data)
3443{
3444 struct sock_recv *ctx = data;
3445
3446#ifdef MS_WINDOWS
3447 if (ctx->len > INT_MAX)
3448 ctx->len = INT_MAX;
3449 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3450#else
3451 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3452#endif
3453 return (ctx->result >= 0);
3454}
3455
Guido van Rossum82a5c661998-07-07 20:45:43 +00003456
Thomas Wouters477c8d52006-05-27 19:21:47 +00003457/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003458 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003459 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003460 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003461 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003462 * also possible that we return a number of bytes smaller than the request
3463 * bytes.
3464 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003465
Antoine Pitrou19467d22010-08-17 19:33:30 +00003466static Py_ssize_t
3467sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003468{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003469 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 if (!IS_SELECTABLE(s)) {
3472 select_error();
3473 return -1;
3474 }
3475 if (len == 0) {
3476 /* If 0 bytes were requested, do nothing. */
3477 return 0;
3478 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003479
Victor Stinner31bf2d52015-04-01 21:57:09 +02003480 ctx.cbuf = cbuf;
3481 ctx.len = len;
3482 ctx.flags = flags;
3483 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003485
3486 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003487}
3488
Guido van Rossum48a680c2001-03-02 06:34:14 +00003489
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003490/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003491
Guido van Rossum73624e91994-10-10 17:59:00 +00003492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003493sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003494{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003495 Py_ssize_t recvlen, outlen;
3496 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003498
Antoine Pitrou19467d22010-08-17 19:33:30 +00003499 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 if (recvlen < 0) {
3503 PyErr_SetString(PyExc_ValueError,
3504 "negative buffersize in recv");
3505 return NULL;
3506 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 /* Allocate a new string. */
3509 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3510 if (buf == NULL)
3511 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 /* Call the guts */
3514 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3515 if (outlen < 0) {
3516 /* An error occurred, release the string and return an
3517 error. */
3518 Py_DECREF(buf);
3519 return NULL;
3520 }
3521 if (outlen != recvlen) {
3522 /* We did not read as many bytes as we anticipated, resize the
3523 string if possible and be successful. */
3524 _PyBytes_Resize(&buf, outlen);
3525 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003528}
3529
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003530PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003531"recv(buffersize[, flags]) -> data\n\
3532\n\
3533Receive up to buffersize bytes from the socket. For the optional flags\n\
3534argument, see the Unix manual. When no data is available, block until\n\
3535at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003536the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003537
Guido van Rossum30a685f1991-06-27 15:51:29 +00003538
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003539/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003540
Thomas Wouters477c8d52006-05-27 19:21:47 +00003541static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003542sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003545
Antoine Pitrou19467d22010-08-17 19:33:30 +00003546 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 Py_buffer pbuf;
3548 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003549 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003552 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 &pbuf, &recvlen, &flags))
3554 return NULL;
3555 buf = pbuf.buf;
3556 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 if (recvlen < 0) {
3559 PyBuffer_Release(&pbuf);
3560 PyErr_SetString(PyExc_ValueError,
3561 "negative buffersize in recv_into");
3562 return NULL;
3563 }
3564 if (recvlen == 0) {
3565 /* If nbytes was not specified, use the buffer's length */
3566 recvlen = buflen;
3567 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 /* Check if the buffer is large enough */
3570 if (buflen < recvlen) {
3571 PyBuffer_Release(&pbuf);
3572 PyErr_SetString(PyExc_ValueError,
3573 "buffer too small for requested bytes");
3574 return NULL;
3575 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 /* Call the guts */
3578 readlen = sock_recv_guts(s, buf, recvlen, flags);
3579 if (readlen < 0) {
3580 /* Return an error. */
3581 PyBuffer_Release(&pbuf);
3582 return NULL;
3583 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 PyBuffer_Release(&pbuf);
3586 /* Return the number of bytes read. Note that we do not do anything
3587 special here in the case that readlen < recvlen. */
3588 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003589}
3590
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003591PyDoc_STRVAR(recv_into_doc,
3592"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003593\n\
oldkaa0735f2018-02-02 16:52:55 +08003594A version of recv() that stores its data into a buffer rather than creating\n\
3595a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003596is not specified (or 0), receive up to the size available in the given buffer.\n\
3597\n\
3598See recv() for documentation about the flags.");
3599
Victor Stinner31bf2d52015-04-01 21:57:09 +02003600struct sock_recvfrom {
3601 char* cbuf;
3602 Py_ssize_t len;
3603 int flags;
3604 socklen_t *addrlen;
3605 sock_addr_t *addrbuf;
3606 Py_ssize_t result;
3607};
3608
3609static int
3610sock_recvfrom_impl(PySocketSockObject *s, void *data)
3611{
3612 struct sock_recvfrom *ctx = data;
3613
3614 memset(ctx->addrbuf, 0, *ctx->addrlen);
3615
3616#ifdef MS_WINDOWS
3617 if (ctx->len > INT_MAX)
3618 ctx->len = INT_MAX;
3619 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3620 SAS2SA(ctx->addrbuf), ctx->addrlen);
3621#else
3622 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3623 SAS2SA(ctx->addrbuf), ctx->addrlen);
3624#endif
3625 return (ctx->result >= 0);
3626}
3627
Thomas Wouters477c8d52006-05-27 19:21:47 +00003628
3629/*
Christian Heimes99170a52007-12-19 02:07:34 +00003630 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3631 * into a char buffer. If you have any inc/def ref to do to the objects that
3632 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003633 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003634 * that it is also possible that we return a number of bytes smaller than the
3635 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003636 *
3637 * 'addr' is a return value for the address object. Note that you must decref
3638 * it yourself.
3639 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003640static Py_ssize_t
3641sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003642 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003645 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003646 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 if (!getsockaddrlen(s, &addrlen))
3651 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 if (!IS_SELECTABLE(s)) {
3654 select_error();
3655 return -1;
3656 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003657
Victor Stinner31bf2d52015-04-01 21:57:09 +02003658 ctx.cbuf = cbuf;
3659 ctx.len = len;
3660 ctx.flags = flags;
3661 ctx.addrbuf = &addrbuf;
3662 ctx.addrlen = &addrlen;
3663 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003665
Victor Stinner31bf2d52015-04-01 21:57:09 +02003666 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3667 s->sock_proto);
3668 if (*addr == NULL)
3669 return -1;
3670
3671 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003672}
3673
3674/* s.recvfrom(nbytes [,flags]) method */
3675
3676static PyObject *
3677sock_recvfrom(PySocketSockObject *s, PyObject *args)
3678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 PyObject *buf = NULL;
3680 PyObject *addr = NULL;
3681 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003682 int flags = 0;
3683 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003684
Antoine Pitrou19467d22010-08-17 19:33:30 +00003685 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 if (recvlen < 0) {
3689 PyErr_SetString(PyExc_ValueError,
3690 "negative buffersize in recvfrom");
3691 return NULL;
3692 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3695 if (buf == NULL)
3696 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3699 recvlen, flags, &addr);
3700 if (outlen < 0) {
3701 goto finally;
3702 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003704 if (outlen != recvlen) {
3705 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003706 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003708 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 goto finally;
3710 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003713
3714finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 Py_XDECREF(buf);
3716 Py_XDECREF(addr);
3717 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003718}
3719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003720PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003721"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3722\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003723Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003724
Thomas Wouters477c8d52006-05-27 19:21:47 +00003725
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003726/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003727
3728static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003729sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003732
Antoine Pitrou19467d22010-08-17 19:33:30 +00003733 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 Py_buffer pbuf;
3735 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003736 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003739
Antoine Pitrou19467d22010-08-17 19:33:30 +00003740 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 kwlist, &pbuf,
3742 &recvlen, &flags))
3743 return NULL;
3744 buf = pbuf.buf;
3745 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 if (recvlen < 0) {
3748 PyBuffer_Release(&pbuf);
3749 PyErr_SetString(PyExc_ValueError,
3750 "negative buffersize in recvfrom_into");
3751 return NULL;
3752 }
3753 if (recvlen == 0) {
3754 /* If nbytes was not specified, use the buffer's length */
3755 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003756 } else if (recvlen > buflen) {
3757 PyBuffer_Release(&pbuf);
3758 PyErr_SetString(PyExc_ValueError,
3759 "nbytes is greater than the length of the buffer");
3760 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3764 if (readlen < 0) {
3765 PyBuffer_Release(&pbuf);
3766 /* Return an error */
3767 Py_XDECREF(addr);
3768 return NULL;
3769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 PyBuffer_Release(&pbuf);
3772 /* Return the number of bytes read and the address. Note that we do
3773 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003774 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003775}
3776
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003777PyDoc_STRVAR(recvfrom_into_doc,
3778"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003779\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003780Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003781
Victor Stinner35bee932015-04-02 12:28:07 +02003782/* The sendmsg() and recvmsg[_into]() methods require a working
3783 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3784#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003785struct sock_recvmsg {
3786 struct msghdr *msg;
3787 int flags;
3788 ssize_t result;
3789};
3790
3791static int
3792sock_recvmsg_impl(PySocketSockObject *s, void *data)
3793{
3794 struct sock_recvmsg *ctx = data;
3795
3796 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3797 return (ctx->result >= 0);
3798}
3799
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003800/*
3801 * Call recvmsg() with the supplied iovec structures, flags, and
3802 * ancillary data buffer size (controllen). Returns the tuple return
3803 * value for recvmsg() or recvmsg_into(), with the first item provided
3804 * by the supplied makeval() function. makeval() will be called with
3805 * the length read and makeval_data as arguments, and must return a
3806 * new reference (which will be decrefed if there is a subsequent
3807 * error). On error, closes any file descriptors received via
3808 * SCM_RIGHTS.
3809 */
3810static PyObject *
3811sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3812 int flags, Py_ssize_t controllen,
3813 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3814{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003815 sock_addr_t addrbuf;
3816 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003817 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003818 PyObject *cmsg_list = NULL, *retval = NULL;
3819 void *controlbuf = NULL;
3820 struct cmsghdr *cmsgh;
3821 size_t cmsgdatalen = 0;
3822 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003823 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824
3825 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3826 ignored" when the socket is connected (Linux fills them in
3827 anyway for AF_UNIX sockets at least). Normally msg_namelen
3828 seems to be set to 0 if there's no address, but try to
3829 initialize msg_name to something that won't be mistaken for a
3830 real address if that doesn't happen. */
3831 if (!getsockaddrlen(s, &addrbuflen))
3832 return NULL;
3833 memset(&addrbuf, 0, addrbuflen);
3834 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3835
3836 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3837 PyErr_SetString(PyExc_ValueError,
3838 "invalid ancillary data buffer length");
3839 return NULL;
3840 }
3841 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3842 return PyErr_NoMemory();
3843
3844 /* Make the system call. */
3845 if (!IS_SELECTABLE(s)) {
3846 select_error();
3847 goto finally;
3848 }
3849
Victor Stinner31bf2d52015-04-01 21:57:09 +02003850 msg.msg_name = SAS2SA(&addrbuf);
3851 msg.msg_namelen = addrbuflen;
3852 msg.msg_iov = iov;
3853 msg.msg_iovlen = iovlen;
3854 msg.msg_control = controlbuf;
3855 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003856
Victor Stinner31bf2d52015-04-01 21:57:09 +02003857 ctx.msg = &msg;
3858 ctx.flags = flags;
3859 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003860 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003861
3862 /* Make list of (level, type, data) tuples from control messages. */
3863 if ((cmsg_list = PyList_New(0)) == NULL)
3864 goto err_closefds;
3865 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3866 implementations didn't do so. */
3867 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3868 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3869 PyObject *bytes, *tuple;
3870 int tmp;
3871
3872 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3873 if (cmsg_status != 0) {
3874 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3875 "received malformed or improperly-truncated "
3876 "ancillary data", 1) == -1)
3877 goto err_closefds;
3878 }
3879 if (cmsg_status < 0)
3880 break;
3881 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003882 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003883 goto err_closefds;
3884 }
3885
3886 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3887 cmsgdatalen);
3888 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3889 (int)cmsgh->cmsg_type, bytes);
3890 if (tuple == NULL)
3891 goto err_closefds;
3892 tmp = PyList_Append(cmsg_list, tuple);
3893 Py_DECREF(tuple);
3894 if (tmp != 0)
3895 goto err_closefds;
3896
3897 if (cmsg_status != 0)
3898 break;
3899 }
3900
3901 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003902 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003903 cmsg_list,
3904 (int)msg.msg_flags,
3905 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3906 ((msg.msg_namelen > addrbuflen) ?
3907 addrbuflen : msg.msg_namelen),
3908 s->sock_proto));
3909 if (retval == NULL)
3910 goto err_closefds;
3911
3912finally:
3913 Py_XDECREF(cmsg_list);
3914 PyMem_Free(controlbuf);
3915 return retval;
3916
3917err_closefds:
3918#ifdef SCM_RIGHTS
3919 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3920 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3921 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3922 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3923 if (cmsg_status < 0)
3924 break;
3925 if (cmsgh->cmsg_level == SOL_SOCKET &&
3926 cmsgh->cmsg_type == SCM_RIGHTS) {
3927 size_t numfds;
3928 int *fdp;
3929
3930 numfds = cmsgdatalen / sizeof(int);
3931 fdp = (int *)CMSG_DATA(cmsgh);
3932 while (numfds-- > 0)
3933 close(*fdp++);
3934 }
3935 if (cmsg_status != 0)
3936 break;
3937 }
3938#endif /* SCM_RIGHTS */
3939 goto finally;
3940}
3941
3942
3943static PyObject *
3944makeval_recvmsg(ssize_t received, void *data)
3945{
3946 PyObject **buf = data;
3947
3948 if (received < PyBytes_GET_SIZE(*buf))
3949 _PyBytes_Resize(buf, received);
3950 Py_XINCREF(*buf);
3951 return *buf;
3952}
3953
3954/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3955
3956static PyObject *
3957sock_recvmsg(PySocketSockObject *s, PyObject *args)
3958{
3959 Py_ssize_t bufsize, ancbufsize = 0;
3960 int flags = 0;
3961 struct iovec iov;
3962 PyObject *buf = NULL, *retval = NULL;
3963
3964 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3965 return NULL;
3966
3967 if (bufsize < 0) {
3968 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3969 return NULL;
3970 }
3971 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3972 return NULL;
3973 iov.iov_base = PyBytes_AS_STRING(buf);
3974 iov.iov_len = bufsize;
3975
3976 /* Note that we're passing a pointer to *our pointer* to the bytes
3977 object here (&buf); makeval_recvmsg() may incref the object, or
3978 deallocate it and set our pointer to NULL. */
3979 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3980 &makeval_recvmsg, &buf);
3981 Py_XDECREF(buf);
3982 return retval;
3983}
3984
3985PyDoc_STRVAR(recvmsg_doc,
3986"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3987\n\
3988Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3989socket. The ancbufsize argument sets the size in bytes of the\n\
3990internal buffer used to receive the ancillary data; it defaults to 0,\n\
3991meaning that no ancillary data will be received. Appropriate buffer\n\
3992sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3993CMSG_LEN(), and items which do not fit into the buffer might be\n\
3994truncated or discarded. The flags argument defaults to 0 and has the\n\
3995same meaning as for recv().\n\
3996\n\
3997The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3998The data item is a bytes object holding the non-ancillary data\n\
3999received. The ancdata item is a list of zero or more tuples\n\
4000(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4001(control messages) received: cmsg_level and cmsg_type are integers\n\
4002specifying the protocol level and protocol-specific type respectively,\n\
4003and cmsg_data is a bytes object holding the associated data. The\n\
4004msg_flags item is the bitwise OR of various flags indicating\n\
4005conditions on the received message; see your system documentation for\n\
4006details. If the receiving socket is unconnected, address is the\n\
4007address of the sending socket, if available; otherwise, its value is\n\
4008unspecified.\n\
4009\n\
4010If recvmsg() raises an exception after the system call returns, it\n\
4011will first attempt to close any file descriptors received via the\n\
4012SCM_RIGHTS mechanism.");
4013
4014
4015static PyObject *
4016makeval_recvmsg_into(ssize_t received, void *data)
4017{
4018 return PyLong_FromSsize_t(received);
4019}
4020
4021/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4022
4023static PyObject *
4024sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4025{
4026 Py_ssize_t ancbufsize = 0;
4027 int flags = 0;
4028 struct iovec *iovs = NULL;
4029 Py_ssize_t i, nitems, nbufs = 0;
4030 Py_buffer *bufs = NULL;
4031 PyObject *buffers_arg, *fast, *retval = NULL;
4032
4033 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4034 &buffers_arg, &ancbufsize, &flags))
4035 return NULL;
4036
4037 if ((fast = PySequence_Fast(buffers_arg,
4038 "recvmsg_into() argument 1 must be an "
4039 "iterable")) == NULL)
4040 return NULL;
4041 nitems = PySequence_Fast_GET_SIZE(fast);
4042 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004043 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004044 goto finally;
4045 }
4046
4047 /* Fill in an iovec for each item, and save the Py_buffer
4048 structs to release afterwards. */
4049 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4050 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4051 PyErr_NoMemory();
4052 goto finally;
4053 }
4054 for (; nbufs < nitems; nbufs++) {
4055 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4056 "w*;recvmsg_into() argument 1 must be an iterable "
4057 "of single-segment read-write buffers",
4058 &bufs[nbufs]))
4059 goto finally;
4060 iovs[nbufs].iov_base = bufs[nbufs].buf;
4061 iovs[nbufs].iov_len = bufs[nbufs].len;
4062 }
4063
4064 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4065 &makeval_recvmsg_into, NULL);
4066finally:
4067 for (i = 0; i < nbufs; i++)
4068 PyBuffer_Release(&bufs[i]);
4069 PyMem_Free(bufs);
4070 PyMem_Free(iovs);
4071 Py_DECREF(fast);
4072 return retval;
4073}
4074
4075PyDoc_STRVAR(recvmsg_into_doc,
4076"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4077\n\
4078Receive normal data and ancillary data from the socket, scattering the\n\
4079non-ancillary data into a series of buffers. The buffers argument\n\
4080must be an iterable of objects that export writable buffers\n\
4081(e.g. bytearray objects); these will be filled with successive chunks\n\
4082of the non-ancillary data until it has all been written or there are\n\
4083no more buffers. The ancbufsize argument sets the size in bytes of\n\
4084the internal buffer used to receive the ancillary data; it defaults to\n\
40850, meaning that no ancillary data will be received. Appropriate\n\
4086buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4087or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4088truncated or discarded. The flags argument defaults to 0 and has the\n\
4089same meaning as for recv().\n\
4090\n\
4091The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4092The nbytes item is the total number of bytes of non-ancillary data\n\
4093written into the buffers. The ancdata item is a list of zero or more\n\
4094tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4095data (control messages) received: cmsg_level and cmsg_type are\n\
4096integers specifying the protocol level and protocol-specific type\n\
4097respectively, and cmsg_data is a bytes object holding the associated\n\
4098data. The msg_flags item is the bitwise OR of various flags\n\
4099indicating conditions on the received message; see your system\n\
4100documentation for details. If the receiving socket is unconnected,\n\
4101address is the address of the sending socket, if available; otherwise,\n\
4102its value is unspecified.\n\
4103\n\
4104If recvmsg_into() raises an exception after the system call returns,\n\
4105it will first attempt to close any file descriptors received via the\n\
4106SCM_RIGHTS mechanism.");
4107#endif /* CMSG_LEN */
4108
4109
Victor Stinner31bf2d52015-04-01 21:57:09 +02004110struct sock_send {
4111 char *buf;
4112 Py_ssize_t len;
4113 int flags;
4114 Py_ssize_t result;
4115};
4116
4117static int
4118sock_send_impl(PySocketSockObject *s, void *data)
4119{
4120 struct sock_send *ctx = data;
4121
4122#ifdef MS_WINDOWS
4123 if (ctx->len > INT_MAX)
4124 ctx->len = INT_MAX;
4125 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4126#else
4127 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4128#endif
4129 return (ctx->result >= 0);
4130}
4131
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004132/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004133
Guido van Rossum73624e91994-10-10 17:59:00 +00004134static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004135sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004136{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004137 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004139 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4142 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 if (!IS_SELECTABLE(s)) {
4145 PyBuffer_Release(&pbuf);
4146 return select_error();
4147 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004148 ctx.buf = pbuf.buf;
4149 ctx.len = pbuf.len;
4150 ctx.flags = flags;
4151 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004152 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 return NULL;
4154 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004155 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004156
4157 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004158}
4159
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004160PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004161"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004162\n\
4163Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004164argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004165sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004166
4167
4168/* s.sendall(data [,flags]) method */
4169
4170static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004171sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004174 Py_ssize_t len, n;
4175 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004177 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004178 int has_timeout = (s->sock_timeout > 0);
4179 _PyTime_t interval = s->sock_timeout;
4180 _PyTime_t deadline = 0;
4181 int deadline_initialized = 0;
4182 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4185 return NULL;
4186 buf = pbuf.buf;
4187 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 if (!IS_SELECTABLE(s)) {
4190 PyBuffer_Release(&pbuf);
4191 return select_error();
4192 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004195 if (has_timeout) {
4196 if (deadline_initialized) {
4197 /* recompute the timeout */
4198 interval = deadline - _PyTime_GetMonotonicClock();
4199 }
4200 else {
4201 deadline_initialized = 1;
4202 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4203 }
4204
4205 if (interval <= 0) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01004206 PyErr_SetString(PyExc_TimeoutError, "timed out");
Victor Stinner8912d142015-04-06 23:16:34 +02004207 goto done;
4208 }
4209 }
4210
Victor Stinner02f32ab2015-04-01 22:53:26 +02004211 ctx.buf = buf;
4212 ctx.len = len;
4213 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004214 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4215 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004216 n = ctx.result;
4217 assert(n >= 0);
4218
4219 buf += n;
4220 len -= n;
4221
4222 /* We must run our signal handlers before looping again.
4223 send() can return a successful partial write when it is
4224 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004225 if (PyErr_CheckSignals())
4226 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004227 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004229
Victor Stinner8912d142015-04-06 23:16:34 +02004230 Py_INCREF(Py_None);
4231 res = Py_None;
4232
4233done:
4234 PyBuffer_Release(&pbuf);
4235 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004236}
4237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004238PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004239"sendall(data[, flags])\n\
4240\n\
4241Send a data string to the socket. For the optional flags\n\
4242argument, see the Unix manual. This calls send() repeatedly\n\
4243until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004244to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004245
Guido van Rossum30a685f1991-06-27 15:51:29 +00004246
Victor Stinner31bf2d52015-04-01 21:57:09 +02004247struct sock_sendto {
4248 char *buf;
4249 Py_ssize_t len;
4250 int flags;
4251 int addrlen;
4252 sock_addr_t *addrbuf;
4253 Py_ssize_t result;
4254};
4255
4256static int
4257sock_sendto_impl(PySocketSockObject *s, void *data)
4258{
4259 struct sock_sendto *ctx = data;
4260
4261#ifdef MS_WINDOWS
4262 if (ctx->len > INT_MAX)
4263 ctx->len = INT_MAX;
4264 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4265 SAS2SA(ctx->addrbuf), ctx->addrlen);
4266#else
4267 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4268 SAS2SA(ctx->addrbuf), ctx->addrlen);
4269#endif
4270 return (ctx->result >= 0);
4271}
4272
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004273/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004274
Guido van Rossum73624e91994-10-10 17:59:00 +00004275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004276sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 Py_buffer pbuf;
4279 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004280 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004282 int addrlen, flags;
4283 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004286 arglen = PyTuple_Size(args);
4287 switch (arglen) {
4288 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004289 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4290 return NULL;
4291 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004292 break;
4293 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004294 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4295 &pbuf, &flags, &addro)) {
4296 return NULL;
4297 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004298 break;
4299 default:
4300 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004301 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004302 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004303 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 if (!IS_SELECTABLE(s)) {
4307 PyBuffer_Release(&pbuf);
4308 return select_error();
4309 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004310
Victor Stinnerd565fb92019-10-10 21:30:20 +02004311 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 PyBuffer_Release(&pbuf);
4313 return NULL;
4314 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004315
Steve Dowerb82e17e2019-05-23 08:45:22 -07004316 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4317 return NULL;
4318 }
4319
Victor Stinner31bf2d52015-04-01 21:57:09 +02004320 ctx.buf = pbuf.buf;
4321 ctx.len = pbuf.len;
4322 ctx.flags = flags;
4323 ctx.addrlen = addrlen;
4324 ctx.addrbuf = &addrbuf;
4325 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004326 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 return NULL;
4328 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004329 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004330
4331 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004332}
4333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004334PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004335"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004336\n\
4337Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004338For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004339
Guido van Rossum30a685f1991-06-27 15:51:29 +00004340
Victor Stinner35bee932015-04-02 12:28:07 +02004341/* The sendmsg() and recvmsg[_into]() methods require a working
4342 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4343#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004344struct sock_sendmsg {
4345 struct msghdr *msg;
4346 int flags;
4347 ssize_t result;
4348};
4349
4350static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004351sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4352 struct msghdr *msg,
4353 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4354 Py_ssize_t ndataparts, ndatabufs = 0;
4355 int result = -1;
4356 struct iovec *iovs = NULL;
4357 PyObject *data_fast = NULL;
4358 Py_buffer *databufs = NULL;
4359
4360 /* Fill in an iovec for each message part, and save the Py_buffer
4361 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004362 data_fast = PySequence_Fast(data_arg,
4363 "sendmsg() argument 1 must be an "
4364 "iterable");
4365 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004366 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004367 }
4368
Christian Heimesdffa3942016-09-05 23:54:41 +02004369 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4370 if (ndataparts > INT_MAX) {
4371 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4372 goto finally;
4373 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004374
Christian Heimesdffa3942016-09-05 23:54:41 +02004375 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004376 if (ndataparts > 0) {
4377 iovs = PyMem_New(struct iovec, ndataparts);
4378 if (iovs == NULL) {
4379 PyErr_NoMemory();
4380 goto finally;
4381 }
4382 msg->msg_iov = iovs;
4383
4384 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004385 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004386 PyErr_NoMemory();
4387 goto finally;
4388 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004389 }
4390 for (; ndatabufs < ndataparts; ndatabufs++) {
4391 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4392 "y*;sendmsg() argument 1 must be an iterable of "
4393 "bytes-like objects",
4394 &databufs[ndatabufs]))
4395 goto finally;
4396 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4397 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4398 }
4399 result = 0;
4400 finally:
4401 *databufsout = databufs;
4402 *ndatabufsout = ndatabufs;
4403 Py_XDECREF(data_fast);
4404 return result;
4405}
4406
4407static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004408sock_sendmsg_impl(PySocketSockObject *s, void *data)
4409{
4410 struct sock_sendmsg *ctx = data;
4411
4412 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4413 return (ctx->result >= 0);
4414}
4415
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004416/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4417
4418static PyObject *
4419sock_sendmsg(PySocketSockObject *s, PyObject *args)
4420{
Christian Heimesdffa3942016-09-05 23:54:41 +02004421 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004422 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004423 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004424 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 struct cmsginfo {
4426 int level;
4427 int type;
4428 Py_buffer data;
4429 } *cmsgs = NULL;
4430 void *controlbuf = NULL;
4431 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004432 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004433 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004434 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004435 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004436
4437 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004438 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004439 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004440 }
4441
4442 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004443
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004444 /* Parse destination address. */
4445 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004446 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004447 "sendmsg"))
4448 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004449 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004450 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004451 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4452 return NULL;
4453 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004454 msg.msg_name = &addrbuf;
4455 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004456 } else {
4457 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4458 return NULL;
4459 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004460 }
4461
4462 /* Fill in an iovec for each message part, and save the Py_buffer
4463 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004464 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004465 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004466 }
4467
4468 if (cmsg_arg == NULL)
4469 ncmsgs = 0;
4470 else {
4471 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4472 "sendmsg() argument 2 must be an "
4473 "iterable")) == NULL)
4474 goto finally;
4475 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4476 }
4477
4478#ifndef CMSG_SPACE
4479 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004480 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004481 "sending multiple control messages is not supported "
4482 "on this system");
4483 goto finally;
4484 }
4485#endif
4486 /* Save level, type and Py_buffer for each control message,
4487 and calculate total size. */
4488 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4489 PyErr_NoMemory();
4490 goto finally;
4491 }
4492 controllen = controllen_last = 0;
4493 while (ncmsgbufs < ncmsgs) {
4494 size_t bufsize, space;
4495
4496 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4497 "(iiy*):[sendmsg() ancillary data items]",
4498 &cmsgs[ncmsgbufs].level,
4499 &cmsgs[ncmsgbufs].type,
4500 &cmsgs[ncmsgbufs].data))
4501 goto finally;
4502 bufsize = cmsgs[ncmsgbufs++].data.len;
4503
4504#ifdef CMSG_SPACE
4505 if (!get_CMSG_SPACE(bufsize, &space)) {
4506#else
4507 if (!get_CMSG_LEN(bufsize, &space)) {
4508#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004509 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004510 goto finally;
4511 }
4512 controllen += space;
4513 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004514 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004515 goto finally;
4516 }
4517 controllen_last = controllen;
4518 }
4519
4520 /* Construct ancillary data block from control message info. */
4521 if (ncmsgbufs > 0) {
4522 struct cmsghdr *cmsgh = NULL;
4523
Victor Stinner52d61e42016-09-12 11:41:58 +02004524 controlbuf = PyMem_Malloc(controllen);
4525 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004526 PyErr_NoMemory();
4527 goto finally;
4528 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004529 msg.msg_control = controlbuf;
4530
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004531 msg.msg_controllen = controllen;
4532
4533 /* Need to zero out the buffer as a workaround for glibc's
4534 CMSG_NXTHDR() implementation. After getting the pointer to
4535 the next header, it checks its (uninitialized) cmsg_len
4536 member to see if the "message" fits in the buffer, and
4537 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004538 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004539 memset(controlbuf, 0, controllen);
4540
4541 for (i = 0; i < ncmsgbufs; i++) {
4542 size_t msg_len, data_len = cmsgs[i].data.len;
4543 int enough_space = 0;
4544
4545 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4546 if (cmsgh == NULL) {
4547 PyErr_Format(PyExc_RuntimeError,
4548 "unexpected NULL result from %s()",
4549 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4550 goto finally;
4551 }
4552 if (!get_CMSG_LEN(data_len, &msg_len)) {
4553 PyErr_SetString(PyExc_RuntimeError,
4554 "item size out of range for CMSG_LEN()");
4555 goto finally;
4556 }
4557 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4558 size_t space;
4559
4560 cmsgh->cmsg_len = msg_len;
4561 if (get_cmsg_data_space(&msg, cmsgh, &space))
4562 enough_space = (space >= data_len);
4563 }
4564 if (!enough_space) {
4565 PyErr_SetString(PyExc_RuntimeError,
4566 "ancillary data does not fit in calculated "
4567 "space");
4568 goto finally;
4569 }
4570 cmsgh->cmsg_level = cmsgs[i].level;
4571 cmsgh->cmsg_type = cmsgs[i].type;
4572 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4573 }
4574 }
4575
4576 /* Make the system call. */
4577 if (!IS_SELECTABLE(s)) {
4578 select_error();
4579 goto finally;
4580 }
4581
Victor Stinner31bf2d52015-04-01 21:57:09 +02004582 ctx.msg = &msg;
4583 ctx.flags = flags;
4584 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004585 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004586
4587 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004588
4589finally:
4590 PyMem_Free(controlbuf);
4591 for (i = 0; i < ncmsgbufs; i++)
4592 PyBuffer_Release(&cmsgs[i].data);
4593 PyMem_Free(cmsgs);
4594 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004595 PyMem_Free(msg.msg_iov);
4596 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004597 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004598 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004599 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004600 return retval;
4601}
4602
4603PyDoc_STRVAR(sendmsg_doc,
4604"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4605\n\
4606Send normal and ancillary data to the socket, gathering the\n\
4607non-ancillary data from a series of buffers and concatenating it into\n\
4608a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004609data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004610The ancdata argument specifies the ancillary data (control messages)\n\
4611as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4612cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4613protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004614is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004615argument defaults to 0 and has the same meaning as for send(). If\n\
4616address is supplied and not None, it sets a destination address for\n\
4617the message. The return value is the number of bytes of non-ancillary\n\
4618data sent.");
4619#endif /* CMSG_LEN */
4620
Christian Heimesdffa3942016-09-05 23:54:41 +02004621#ifdef HAVE_SOCKADDR_ALG
4622static PyObject*
4623sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4624{
4625 PyObject *retval = NULL;
4626
4627 Py_ssize_t i, ndatabufs = 0;
4628 Py_buffer *databufs = NULL;
4629 PyObject *data_arg = NULL;
4630
4631 Py_buffer iv = {NULL, NULL};
4632
4633 PyObject *opobj = NULL;
4634 int op = -1;
4635
4636 PyObject *assoclenobj = NULL;
4637 int assoclen = -1;
4638
4639 unsigned int *uiptr;
4640 int flags = 0;
4641
4642 struct msghdr msg;
4643 struct cmsghdr *header = NULL;
4644 struct af_alg_iv *alg_iv = NULL;
4645 struct sock_sendmsg ctx;
4646 Py_ssize_t controllen;
4647 void *controlbuf = NULL;
4648 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4649
4650 if (self->sock_family != AF_ALG) {
4651 PyErr_SetString(PyExc_OSError,
4652 "algset is only supported for AF_ALG");
4653 return NULL;
4654 }
4655
4656 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4657 "|O$O!y*O!i:sendmsg_afalg", keywords,
4658 &data_arg,
4659 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004660 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004661 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004662 }
4663
4664 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004665
4666 /* op is a required, keyword-only argument >= 0 */
4667 if (opobj != NULL) {
4668 op = _PyLong_AsInt(opobj);
4669 }
4670 if (op < 0) {
4671 /* override exception from _PyLong_AsInt() */
4672 PyErr_SetString(PyExc_TypeError,
4673 "Invalid or missing argument 'op'");
4674 goto finally;
4675 }
4676 /* assoclen is optional but must be >= 0 */
4677 if (assoclenobj != NULL) {
4678 assoclen = _PyLong_AsInt(assoclenobj);
4679 if (assoclen == -1 && PyErr_Occurred()) {
4680 goto finally;
4681 }
4682 if (assoclen < 0) {
4683 PyErr_SetString(PyExc_TypeError,
4684 "assoclen must be positive");
4685 goto finally;
4686 }
4687 }
4688
4689 controllen = CMSG_SPACE(4);
4690 if (iv.buf != NULL) {
4691 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4692 }
4693 if (assoclen >= 0) {
4694 controllen += CMSG_SPACE(4);
4695 }
4696
4697 controlbuf = PyMem_Malloc(controllen);
4698 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004699 PyErr_NoMemory();
4700 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004701 }
4702 memset(controlbuf, 0, controllen);
4703
Christian Heimesdffa3942016-09-05 23:54:41 +02004704 msg.msg_controllen = controllen;
4705 msg.msg_control = controlbuf;
4706
4707 /* Fill in an iovec for each message part, and save the Py_buffer
4708 structs to release afterwards. */
4709 if (data_arg != NULL) {
4710 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4711 goto finally;
4712 }
4713 }
4714
4715 /* set operation to encrypt or decrypt */
4716 header = CMSG_FIRSTHDR(&msg);
4717 if (header == NULL) {
4718 PyErr_SetString(PyExc_RuntimeError,
4719 "unexpected NULL result from CMSG_FIRSTHDR");
4720 goto finally;
4721 }
4722 header->cmsg_level = SOL_ALG;
4723 header->cmsg_type = ALG_SET_OP;
4724 header->cmsg_len = CMSG_LEN(4);
4725 uiptr = (void*)CMSG_DATA(header);
4726 *uiptr = (unsigned int)op;
4727
4728 /* set initialization vector */
4729 if (iv.buf != NULL) {
4730 header = CMSG_NXTHDR(&msg, header);
4731 if (header == NULL) {
4732 PyErr_SetString(PyExc_RuntimeError,
4733 "unexpected NULL result from CMSG_NXTHDR(iv)");
4734 goto finally;
4735 }
4736 header->cmsg_level = SOL_ALG;
4737 header->cmsg_type = ALG_SET_IV;
4738 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4739 alg_iv = (void*)CMSG_DATA(header);
4740 alg_iv->ivlen = iv.len;
4741 memcpy(alg_iv->iv, iv.buf, iv.len);
4742 }
4743
4744 /* set length of associated data for AEAD */
4745 if (assoclen >= 0) {
4746 header = CMSG_NXTHDR(&msg, header);
4747 if (header == NULL) {
4748 PyErr_SetString(PyExc_RuntimeError,
4749 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4750 goto finally;
4751 }
4752 header->cmsg_level = SOL_ALG;
4753 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4754 header->cmsg_len = CMSG_LEN(4);
4755 uiptr = (void*)CMSG_DATA(header);
4756 *uiptr = (unsigned int)assoclen;
4757 }
4758
4759 ctx.msg = &msg;
4760 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004761 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004762 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004763 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004764
4765 retval = PyLong_FromSsize_t(ctx.result);
4766
4767 finally:
4768 PyMem_Free(controlbuf);
4769 if (iv.buf != NULL) {
4770 PyBuffer_Release(&iv);
4771 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004772 PyMem_Free(msg.msg_iov);
4773 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004774 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004775 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004776 PyMem_Free(databufs);
4777 return retval;
4778}
4779
4780PyDoc_STRVAR(sendmsg_afalg_doc,
4781"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4782\n\
4783Set operation mode, IV and length of associated data for an AF_ALG\n\
4784operation socket.");
4785#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004786
Guido van Rossum30a685f1991-06-27 15:51:29 +00004787/* s.shutdown(how) method */
4788
Guido van Rossum73624e91994-10-10 17:59:00 +00004789static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004790sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 int how;
4793 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004794
Serhiy Storchaka78980432013-01-15 01:12:17 +02004795 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 if (how == -1 && PyErr_Occurred())
4797 return NULL;
4798 Py_BEGIN_ALLOW_THREADS
4799 res = shutdown(s->sock_fd, how);
4800 Py_END_ALLOW_THREADS
4801 if (res < 0)
4802 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004803 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004804}
4805
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004806PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004807"shutdown(flag)\n\
4808\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004809Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4810of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004811
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004812#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004813static PyObject*
4814sock_ioctl(PySocketSockObject *s, PyObject *arg)
4815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 unsigned long cmd = SIO_RCVALL;
4817 PyObject *argO;
4818 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4821 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 switch (cmd) {
4824 case SIO_RCVALL: {
4825 unsigned int option = RCVALL_ON;
4826 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4827 return NULL;
4828 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4829 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4830 return set_error();
4831 }
4832 return PyLong_FromUnsignedLong(recv); }
4833 case SIO_KEEPALIVE_VALS: {
4834 struct tcp_keepalive ka;
4835 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4836 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4837 return NULL;
4838 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4839 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4840 return set_error();
4841 }
4842 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004843#if defined(SIO_LOOPBACK_FAST_PATH)
4844 case SIO_LOOPBACK_FAST_PATH: {
4845 unsigned int option;
4846 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4847 return NULL;
4848 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4849 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4850 return set_error();
4851 }
4852 return PyLong_FromUnsignedLong(recv); }
4853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004855 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 return NULL;
4857 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004858}
4859PyDoc_STRVAR(sock_ioctl_doc,
4860"ioctl(cmd, option) -> long\n\
4861\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004862Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4863SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004864SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4865SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004866#endif
4867
4868#if defined(MS_WINDOWS)
4869static PyObject*
4870sock_share(PySocketSockObject *s, PyObject *arg)
4871{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004872 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004873 DWORD processId;
4874 int result;
4875
4876 if (!PyArg_ParseTuple(arg, "I", &processId))
4877 return NULL;
4878
4879 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004880 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004881 Py_END_ALLOW_THREADS
4882 if (result == SOCKET_ERROR)
4883 return set_error();
4884 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4885}
4886PyDoc_STRVAR(sock_share_doc,
4887"share(process_id) -> bytes\n\
4888\n\
4889Share the socket with another process. The target process id\n\
4890must be provided and the resulting bytes object passed to the target\n\
4891process. There the shared socket can be instantiated by calling\n\
4892socket.fromshare().");
4893
Christian Heimesfaf2f632008-01-06 16:59:19 +00004894
4895#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004896
4897/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004898
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004899static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4901 accept_doc},
4902 {"bind", (PyCFunction)sock_bind, METH_O,
4903 bind_doc},
4904 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004905 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 {"connect", (PyCFunction)sock_connect, METH_O,
4907 connect_doc},
4908 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4909 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004910 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4911 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4913 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004914#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 {"getpeername", (PyCFunction)sock_getpeername,
4916 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 {"getsockname", (PyCFunction)sock_getsockname,
4919 METH_NOARGS, getsockname_doc},
4920 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4921 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004922#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4924 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004925#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004926#if defined(MS_WINDOWS)
4927 {"share", (PyCFunction)sock_share, METH_VARARGS,
4928 sock_share_doc},
4929#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004930 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 listen_doc},
4932 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4933 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004934 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 recv_into_doc},
4936 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4937 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004938 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004939 recvfrom_into_doc},
4940 {"send", (PyCFunction)sock_send, METH_VARARGS,
4941 send_doc},
4942 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4943 sendall_doc},
4944 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4945 sendto_doc},
4946 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4947 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004948 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4949 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4951 settimeout_doc},
4952 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4953 gettimeout_doc},
4954 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4955 setsockopt_doc},
4956 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4957 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004958#ifdef CMSG_LEN
4959 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4960 recvmsg_doc},
4961 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4962 recvmsg_into_doc,},
4963 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4964 sendmsg_doc},
4965#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004966#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004967 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004968 sendmsg_afalg_doc},
4969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004971};
4972
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004973/* SockObject members */
4974static PyMemberDef sock_memberlist[] = {
4975 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4976 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4977 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004978 {0},
4979};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004980
Victor Stinner71694d52015-03-28 01:18:54 +01004981static PyGetSetDef sock_getsetlist[] = {
4982 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4983 {NULL} /* sentinel */
4984};
4985
Guido van Rossum73624e91994-10-10 17:59:00 +00004986/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004987 First close the file description. */
4988
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004989static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004990sock_finalize(PySocketSockObject *s)
4991{
4992 SOCKET_T fd;
4993 PyObject *error_type, *error_value, *error_traceback;
4994
4995 /* Save the current exception, if any. */
4996 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4997
Victor Stinnerd3afb622016-07-22 17:47:09 +02004998 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004999 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5000 /* Spurious errors can appear at shutdown */
5001 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5002 PyErr_WriteUnraisable((PyObject *)s);
5003 }
5004 }
5005
5006 /* Only close the socket *after* logging the ResourceWarning warning
5007 to allow the logger to call socket methods like
5008 socket.getsockname(). If the socket is closed before, socket
5009 methods fails with the EBADF error. */
5010 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005011 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005012
5013 /* We do not want to retry upon EINTR: see sock_close() */
5014 Py_BEGIN_ALLOW_THREADS
5015 (void) SOCKETCLOSE(fd);
5016 Py_END_ALLOW_THREADS
5017 }
5018
5019 /* Restore the saved exception. */
5020 PyErr_Restore(error_type, error_value, error_traceback);
5021}
5022
5023static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005024sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005025{
Victor Stinner19a8e842016-03-21 16:36:48 +01005026 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5027 return;
5028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005030}
5031
Guido van Rossum30a685f1991-06-27 15:51:29 +00005032
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005033static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005034sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005035{
Victor Stinnere254e532014-07-26 14:36:55 +02005036 long sock_fd;
5037 /* On Windows, this test is needed because SOCKET_T is unsigned */
5038 if (s->sock_fd == INVALID_SOCKET) {
5039 sock_fd = -1;
5040 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005041#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005042 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 /* this can occur on Win64, and actually there is a special
5044 ugly printf formatter for decimal pointer length integer
5045 printing, only bother if necessary*/
5046 PyErr_SetString(PyExc_OverflowError,
5047 "no printf formatter to display "
5048 "the socket descriptor in decimal");
5049 return NULL;
5050 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005051#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005052 else
5053 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 return PyUnicode_FromFormat(
5055 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005056 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 s->sock_type,
5058 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005059}
5060
5061
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005062/* Create a new, uninitialized socket object. */
5063
5064static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005065sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 new = type->tp_alloc(type, 0);
5070 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005071 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005072 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 ((PySocketSockObject *)new)->errorhandler = &set_error;
5074 }
5075 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005076}
5077
5078
5079/* Initialize a new socket object. */
5080
Victor Stinnerdaf45552013-08-28 00:53:59 +02005081#ifdef SOCK_CLOEXEC
5082/* socket() and socketpair() fail with EINVAL on Linux kernel older
5083 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5084static int sock_cloexec_works = -1;
5085#endif
5086
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005087/*ARGSUSED*/
5088static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005089sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 PySocketSockObject *s = (PySocketSockObject *)self;
5092 PyObject *fdobj = NULL;
5093 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005094 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005096#ifndef MS_WINDOWS
5097#ifdef SOCK_CLOEXEC
5098 int *atomic_flag_works = &sock_cloexec_works;
5099#else
5100 int *atomic_flag_works = NULL;
5101#endif
5102#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5105 "|iiiO:socket", keywords,
5106 &family, &type, &proto, &fdobj))
5107 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005108
Steve Dowerb82e17e2019-05-23 08:45:22 -07005109#ifdef MS_WINDOWS
5110 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005111 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005112#endif
5113 {
5114 if (PySys_Audit("socket.__new__", "Oiii",
5115 s, family, type, proto) < 0) {
5116 return -1;
5117 }
5118 }
5119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005121#ifdef MS_WINDOWS
5122 /* recreate a socket that was duplicated */
5123 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005124 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005125 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5126 PyErr_Format(PyExc_ValueError,
5127 "socket descriptor string has wrong size, "
5128 "should be %zu bytes.", sizeof(info));
5129 return -1;
5130 }
5131 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005132
Steve Dower63ba5cc2020-03-31 12:38:53 +01005133 if (PySys_Audit("socket.__new__", "Oiii", s,
5134 info.iAddressFamily, info.iSocketType,
5135 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005136 return -1;
5137 }
5138
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005139 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005140 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005141 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5142 Py_END_ALLOW_THREADS
5143 if (fd == INVALID_SOCKET) {
5144 set_error();
5145 return -1;
5146 }
5147 family = info.iAddressFamily;
5148 type = info.iSocketType;
5149 proto = info.iProtocol;
5150 }
5151 else
5152#endif
5153 {
Dima Tisneke9912702018-12-17 22:07:55 +09005154 fd = PyLong_AsSocket_t(fdobj);
5155 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5156 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005157#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005158 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005159#else
Dima Tisneke9912702018-12-17 22:07:55 +09005160 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005161#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005162 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5163 return -1;
5164 }
5165
5166 /* validate that passed file descriptor is valid and a socket. */
5167 sock_addr_t addrbuf;
5168 socklen_t addrlen = sizeof(sock_addr_t);
5169
5170 memset(&addrbuf, 0, addrlen);
5171 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5172 if (family == -1) {
5173 family = SAS2SA(&addrbuf)->sa_family;
5174 }
5175 } else {
5176#ifdef MS_WINDOWS
5177 /* getsockname() on an unbound socket is an error on Windows.
5178 Invalid descriptor and not a socket is same error code.
5179 Error out if family must be resolved, or bad descriptor. */
5180 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5181#else
5182 /* getsockname() is not supported for SOL_ALG on Linux. */
5183 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5184#endif
5185 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005186 return -1;
5187 }
5188 }
5189#ifdef SO_TYPE
5190 if (type == -1) {
5191 int tmp;
5192 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005193 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5194 (void *)&tmp, &slen) == 0)
5195 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005196 type = tmp;
5197 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005198 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005199 return -1;
5200 }
5201 }
5202#else
5203 type = SOCK_STREAM;
5204#endif
5205#ifdef SO_PROTOCOL
5206 if (proto == -1) {
5207 int tmp;
5208 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005209 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5210 (void *)&tmp, &slen) == 0)
5211 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005212 proto = tmp;
5213 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005214 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005215 return -1;
5216 }
5217 }
5218#else
5219 proto = 0;
5220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 }
5222 }
5223 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005224 /* No fd, default to AF_INET and SOCK_STREAM */
5225 if (family == -1) {
5226 family = AF_INET;
5227 }
5228 if (type == -1) {
5229 type = SOCK_STREAM;
5230 }
5231 if (proto == -1) {
5232 proto = 0;
5233 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005234#ifdef MS_WINDOWS
5235 /* Windows implementation */
5236#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5237#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5238#endif
5239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005241 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005242 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005243 NULL, 0,
5244 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5245 if (fd == INVALID_SOCKET) {
5246 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5247 support_wsa_no_inherit = 0;
5248 fd = socket(family, type, proto);
5249 }
5250 }
5251 else {
5252 fd = socket(family, type, proto);
5253 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 if (fd == INVALID_SOCKET) {
5257 set_error();
5258 return -1;
5259 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005260
5261 if (!support_wsa_no_inherit) {
5262 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5263 closesocket(fd);
5264 PyErr_SetFromWindowsErr(0);
5265 return -1;
5266 }
5267 }
5268#else
5269 /* UNIX */
5270 Py_BEGIN_ALLOW_THREADS
5271#ifdef SOCK_CLOEXEC
5272 if (sock_cloexec_works != 0) {
5273 fd = socket(family, type | SOCK_CLOEXEC, proto);
5274 if (sock_cloexec_works == -1) {
5275 if (fd >= 0) {
5276 sock_cloexec_works = 1;
5277 }
5278 else if (errno == EINVAL) {
5279 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5280 sock_cloexec_works = 0;
5281 fd = socket(family, type, proto);
5282 }
5283 }
5284 }
5285 else
5286#endif
5287 {
5288 fd = socket(family, type, proto);
5289 }
5290 Py_END_ALLOW_THREADS
5291
5292 if (fd == INVALID_SOCKET) {
5293 set_error();
5294 return -1;
5295 }
5296
5297 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5298 SOCKETCLOSE(fd);
5299 return -1;
5300 }
5301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005303 if (init_sockobject(s, fd, family, type, proto) == -1) {
5304 SOCKETCLOSE(fd);
5305 return -1;
5306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005309
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005310}
5311
5312
Guido van Rossumb6775db1994-08-01 11:34:53 +00005313/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005314
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005315static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5317 "_socket.socket", /* tp_name */
5318 sizeof(PySocketSockObject), /* tp_basicsize */
5319 0, /* tp_itemsize */
5320 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005321 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 0, /* tp_getattr */
5323 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005324 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 (reprfunc)sock_repr, /* tp_repr */
5326 0, /* tp_as_number */
5327 0, /* tp_as_sequence */
5328 0, /* tp_as_mapping */
5329 0, /* tp_hash */
5330 0, /* tp_call */
5331 0, /* tp_str */
5332 PyObject_GenericGetAttr, /* tp_getattro */
5333 0, /* tp_setattro */
5334 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 sock_doc, /* tp_doc */
5337 0, /* tp_traverse */
5338 0, /* tp_clear */
5339 0, /* tp_richcompare */
5340 0, /* tp_weaklistoffset */
5341 0, /* tp_iter */
5342 0, /* tp_iternext */
5343 sock_methods, /* tp_methods */
5344 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005345 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 0, /* tp_base */
5347 0, /* tp_dict */
5348 0, /* tp_descr_get */
5349 0, /* tp_descr_set */
5350 0, /* tp_dictoffset */
5351 sock_initobj, /* tp_init */
5352 PyType_GenericAlloc, /* tp_alloc */
5353 sock_new, /* tp_new */
5354 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005355 0, /* tp_is_gc */
5356 0, /* tp_bases */
5357 0, /* tp_mro */
5358 0, /* tp_cache */
5359 0, /* tp_subclasses */
5360 0, /* tp_weaklist */
5361 0, /* tp_del */
5362 0, /* tp_version_tag */
5363 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005364};
5365
Guido van Rossum30a685f1991-06-27 15:51:29 +00005366
Guido van Rossum81194471991-07-27 21:42:02 +00005367/* Python interface to gethostname(). */
5368
5369/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005370static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005371socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005372{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005373 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5374 return NULL;
5375 }
5376
Martin v. Löwis72f48422010-10-29 18:20:08 +00005377#ifdef MS_WINDOWS
5378 /* Don't use winsock's gethostname, as this returns the ANSI
5379 version of the hostname, whereas we need a Unicode string.
5380 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005381 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005382 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005383 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005384 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005385
5386 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005387 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005388
5389 if (GetLastError() != ERROR_MORE_DATA)
5390 return PyErr_SetFromWindowsErr(0);
5391
5392 if (size == 0)
5393 return PyUnicode_New(0, 0);
5394
5395 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5396 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005397 name = PyMem_New(wchar_t, size);
5398 if (!name) {
5399 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005400 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005401 }
Victor Stinner74168972011-11-17 01:11:36 +01005402 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5403 name,
5404 &size))
5405 {
5406 PyMem_Free(name);
5407 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005408 }
Victor Stinner74168972011-11-17 01:11:36 +01005409
5410 result = PyUnicode_FromWideChar(name, size);
5411 PyMem_Free(name);
5412 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005413#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 char buf[1024];
5415 int res;
5416 Py_BEGIN_ALLOW_THREADS
5417 res = gethostname(buf, (int) sizeof buf - 1);
5418 Py_END_ALLOW_THREADS
5419 if (res < 0)
5420 return set_error();
5421 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005422 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005423#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005424}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005426PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005427"gethostname() -> string\n\
5428\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005429Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005430
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005431#ifdef HAVE_SETHOSTNAME
5432PyDoc_STRVAR(sethostname_doc,
5433"sethostname(name)\n\n\
5434Sets the hostname to name.");
5435
5436static PyObject *
5437socket_sethostname(PyObject *self, PyObject *args)
5438{
5439 PyObject *hnobj;
5440 Py_buffer buf;
5441 int res, flag = 0;
5442
Christian Heimesd2774c72013-06-19 02:06:29 +02005443#ifdef _AIX
5444/* issue #18259, not declared in any useful header file */
5445extern int sethostname(const char *, size_t);
5446#endif
5447
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005448 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5449 PyErr_Clear();
5450 if (!PyArg_ParseTuple(args, "O&:sethostname",
5451 PyUnicode_FSConverter, &hnobj))
5452 return NULL;
5453 flag = 1;
5454 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005455
5456 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5457 return NULL;
5458 }
5459
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005460 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5461 if (!res) {
5462 res = sethostname(buf.buf, buf.len);
5463 PyBuffer_Release(&buf);
5464 }
5465 if (flag)
5466 Py_DECREF(hnobj);
5467 if (res)
5468 return set_error();
5469 Py_RETURN_NONE;
5470}
5471#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005472
Guido van Rossum30a685f1991-06-27 15:51:29 +00005473/* Python interface to gethostbyname(name). */
5474
5475/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005477socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005480 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005481 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005483 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005485 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5486 goto finally;
5487 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005488 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005489 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005490 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005491finally:
5492 PyMem_Free(name);
5493 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005494}
5495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005496PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005497"gethostbyname(host) -> address\n\
5498\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005499Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005500
5501
Victor Stinner72400302016-01-28 15:41:01 +01005502static PyObject*
5503sock_decode_hostname(const char *name)
5504{
5505#ifdef MS_WINDOWS
5506 /* Issue #26227: gethostbyaddr() returns a string encoded
5507 * to the ANSI code page */
Steve Dowerdc516ef2021-04-22 00:18:20 +01005508 return PyUnicode_DecodeMBCS(name, strlen(name), "surrogatepass");
Victor Stinner72400302016-01-28 15:41:01 +01005509#else
5510 /* Decode from UTF-8 */
5511 return PyUnicode_FromString(name);
5512#endif
5513}
5514
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005515/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5516
5517static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005518gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 char **pch;
5521 PyObject *rtn_tuple = (PyObject *)NULL;
5522 PyObject *name_list = (PyObject *)NULL;
5523 PyObject *addr_list = (PyObject *)NULL;
5524 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005525 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 if (h == NULL) {
5528 /* Let's get real error message to return */
5529 set_herror(h_errno);
5530 return NULL;
5531 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 if (h->h_addrtype != af) {
5534 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005535 errno = EAFNOSUPPORT;
5536 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 return NULL;
5538 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 case AF_INET:
5543 if (alen < sizeof(struct sockaddr_in))
5544 return NULL;
5545 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005546
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005547#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 case AF_INET6:
5549 if (alen < sizeof(struct sockaddr_in6))
5550 return NULL;
5551 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005552#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 if ((name_list = PyList_New(0)) == NULL)
5557 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 if ((addr_list = PyList_New(0)) == NULL)
5560 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 /* SF #1511317: h_aliases can be NULL */
5563 if (h->h_aliases) {
5564 for (pch = h->h_aliases; *pch != NULL; pch++) {
5565 int status;
5566 tmp = PyUnicode_FromString(*pch);
5567 if (tmp == NULL)
5568 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 status = PyList_Append(name_list, tmp);
5571 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 if (status)
5574 goto err;
5575 }
5576 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5579 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 case AF_INET:
5584 {
5585 struct sockaddr_in sin;
5586 memset(&sin, 0, sizeof(sin));
5587 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005588#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005592 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 if (pch == h->h_addr_list && alen >= sizeof(sin))
5595 memcpy((char *) addr, &sin, sizeof(sin));
5596 break;
5597 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005598
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005599#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 case AF_INET6:
5601 {
5602 struct sockaddr_in6 sin6;
5603 memset(&sin6, 0, sizeof(sin6));
5604 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005605#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005609 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5612 memcpy((char *) addr, &sin6, sizeof(sin6));
5613 break;
5614 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005615#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005618 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 "unsupported address family");
5620 return NULL;
5621 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 if (tmp == NULL)
5624 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 status = PyList_Append(addr_list, tmp);
5627 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 if (status)
5630 goto err;
5631 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005632
Victor Stinner72400302016-01-28 15:41:01 +01005633 name = sock_decode_hostname(h->h_name);
5634 if (name == NULL)
5635 goto err;
5636 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005637
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005638 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 Py_XDECREF(name_list);
5640 Py_XDECREF(addr_list);
5641 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005642}
5643
5644
5645/* Python interface to gethostbyname_ex(name). */
5646
5647/*ARGSUSED*/
5648static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005649socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 char *name;
5652 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005653 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005655 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005656#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005658#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 char buf[16384];
5662 int buf_len = (sizeof buf) - 1;
5663 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005664#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005665#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005667#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005668#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005669
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005670 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005672 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5673 goto finally;
5674 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005675 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005676 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005678#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005679#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005680 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005682#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005684#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 memset((void *) &data, '\0', sizeof(data));
5686 result = gethostbyname_r(name, &hp_allocated, &data);
5687 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005688#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005689#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005690#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005692#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005693 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005695#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 Py_END_ALLOW_THREADS
5697 /* Some C libraries would require addr.__ss_family instead of
5698 addr.ss_family.
5699 Therefore, we cast the sockaddr_storage into sockaddr to
5700 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005701 sa = SAS2SA(&addr);
5702 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005704#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005706#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005707finally:
5708 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005710}
5711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005712PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005713"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5714\n\
5715Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005716for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005717
5718
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005719/* Python interface to gethostbyaddr(IP). */
5720
5721/*ARGSUSED*/
5722static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005723socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005724{
Charles-François Natali8b759652011-12-23 16:44:51 +01005725 sock_addr_t addr;
5726 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 char *ip_num;
5728 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005729 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005730#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005732#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005734#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 /* glibcs up to 2.10 assume that the buf argument to
5736 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5737 does not ensure. The attribute below instructs the compiler
5738 to maintain this alignment. */
5739 char buf[16384] Py_ALIGNED(8);
5740 int buf_len = (sizeof buf) - 1;
5741 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005742#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005743#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005745#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005746#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005747 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 int al;
5749 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005750
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005751 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005753 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5754 goto finally;
5755 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 af = AF_UNSPEC;
5757 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005758 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 af = sa->sa_family;
5760 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005761 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 switch (af) {
5763 case AF_INET:
5764 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5765 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5766 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005767#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 case AF_INET6:
5769 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5770 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5771 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005774 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005775 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 }
5777 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005778#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005779#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005780 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 &hp_allocated, buf, buf_len,
5782 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005783#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 h = gethostbyaddr_r(ap, al, af,
5785 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005786#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 memset((void *) &data, '\0', sizeof(data));
5788 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5789 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005790#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005791#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005792#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005794#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005795 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005797#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005799 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005800#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005802#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005803finally:
5804 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005806}
5807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005808PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005809"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5810\n\
5811Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005812for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005813
Guido van Rossum30a685f1991-06-27 15:51:29 +00005814
5815/* Python interface to getservbyname(name).
5816 This only returns the port number, since the other info is already
5817 known or not useful (like the list of aliases). */
5818
5819/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005821socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005822{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005823 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 struct servent *sp;
5825 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5826 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005827
5828 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5829 return NULL;
5830 }
5831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 Py_BEGIN_ALLOW_THREADS
5833 sp = getservbyname(name, proto);
5834 Py_END_ALLOW_THREADS
5835 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005836 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 return NULL;
5838 }
5839 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005840}
5841
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005842PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005843"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005844\n\
5845Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005846The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5847otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005848
Guido van Rossum30a685f1991-06-27 15:51:29 +00005849
Barry Warsaw11b91a02004-06-28 00:50:43 +00005850/* Python interface to getservbyport(port).
5851 This only returns the service name, since the other info is already
5852 known or not useful (like the list of aliases). */
5853
5854/*ARGSUSED*/
5855static PyObject *
5856socket_getservbyport(PyObject *self, PyObject *args)
5857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005859 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 struct servent *sp;
5861 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5862 return NULL;
5863 if (port < 0 || port > 0xffff) {
5864 PyErr_SetString(
5865 PyExc_OverflowError,
5866 "getservbyport: port must be 0-65535.");
5867 return NULL;
5868 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005869
5870 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5871 return NULL;
5872 }
5873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 Py_BEGIN_ALLOW_THREADS
5875 sp = getservbyport(htons((short)port), proto);
5876 Py_END_ALLOW_THREADS
5877 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005878 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 return NULL;
5880 }
5881 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005882}
5883
5884PyDoc_STRVAR(getservbyport_doc,
5885"getservbyport(port[, protocolname]) -> string\n\
5886\n\
5887Return the service name from a port number and protocol name.\n\
5888The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5889otherwise any protocol will match.");
5890
Guido van Rossum3901d851996-12-19 16:35:04 +00005891/* Python interface to getprotobyname(name).
5892 This only returns the protocol number, since the other info is
5893 already known or not useful (like the list of aliases). */
5894
5895/*ARGSUSED*/
5896static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005897socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005898{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005899 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 struct protoent *sp;
5901 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5902 return NULL;
5903 Py_BEGIN_ALLOW_THREADS
5904 sp = getprotobyname(name);
5905 Py_END_ALLOW_THREADS
5906 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005907 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 return NULL;
5909 }
5910 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005911}
5912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005913PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005914"getprotobyname(name) -> integer\n\
5915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005916Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005917
Christian Heimesd0e31b92018-01-27 09:54:13 +01005918static PyObject *
5919socket_close(PyObject *self, PyObject *fdobj)
5920{
5921 SOCKET_T fd;
5922 int res;
5923
5924 fd = PyLong_AsSocket_t(fdobj);
5925 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5926 return NULL;
5927 Py_BEGIN_ALLOW_THREADS
5928 res = SOCKETCLOSE(fd);
5929 Py_END_ALLOW_THREADS
5930 /* bpo-30319: The peer can already have closed the connection.
5931 Python ignores ECONNRESET on close(). */
5932 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5933 return set_error();
5934 }
5935 Py_RETURN_NONE;
5936}
5937
5938PyDoc_STRVAR(close_doc,
5939"close(integer) -> None\n\
5940\n\
5941Close an integer socket file descriptor. This is like os.close(), but for\n\
5942sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005943
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005944#ifndef NO_DUP
5945/* dup() function for socket fds */
5946
5947static PyObject *
5948socket_dup(PyObject *self, PyObject *fdobj)
5949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 SOCKET_T fd, newfd;
5951 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005952#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005953 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005954#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 fd = PyLong_AsSocket_t(fdobj);
5957 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5958 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005959
Victor Stinnerdaf45552013-08-28 00:53:59 +02005960#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005961 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005962 return set_error();
5963
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005964 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005965 FROM_PROTOCOL_INFO,
5966 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 if (newfd == INVALID_SOCKET)
5968 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005969
Victor Stinnerdaf45552013-08-28 00:53:59 +02005970 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5971 closesocket(newfd);
5972 PyErr_SetFromWindowsErr(0);
5973 return NULL;
5974 }
5975#else
5976 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5977 newfd = _Py_dup(fd);
5978 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005979 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005980#endif
5981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 newfdobj = PyLong_FromSocket_t(newfd);
5983 if (newfdobj == NULL)
5984 SOCKETCLOSE(newfd);
5985 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005986}
5987
5988PyDoc_STRVAR(dup_doc,
5989"dup(integer) -> integer\n\
5990\n\
5991Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5992sockets; on some platforms os.dup() won't work for socket file descriptors.");
5993#endif
5994
5995
Dave Cole331708b2004-08-09 04:51:41 +00005996#ifdef HAVE_SOCKETPAIR
5997/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005998 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005999 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006000
6001/*ARGSUSED*/
6002static PyObject *
6003socket_socketpair(PyObject *self, PyObject *args)
6004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 PySocketSockObject *s0 = NULL, *s1 = NULL;
6006 SOCKET_T sv[2];
6007 int family, type = SOCK_STREAM, proto = 0;
6008 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006009#ifdef SOCK_CLOEXEC
6010 int *atomic_flag_works = &sock_cloexec_works;
6011#else
6012 int *atomic_flag_works = NULL;
6013#endif
6014 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006015
6016#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006018#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6022 &family, &type, &proto))
6023 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006026 Py_BEGIN_ALLOW_THREADS
6027#ifdef SOCK_CLOEXEC
6028 if (sock_cloexec_works != 0) {
6029 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6030 if (sock_cloexec_works == -1) {
6031 if (ret >= 0) {
6032 sock_cloexec_works = 1;
6033 }
6034 else if (errno == EINVAL) {
6035 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6036 sock_cloexec_works = 0;
6037 ret = socketpair(family, type, proto, sv);
6038 }
6039 }
6040 }
6041 else
6042#endif
6043 {
6044 ret = socketpair(family, type, proto, sv);
6045 }
6046 Py_END_ALLOW_THREADS
6047
6048 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006050
6051 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6052 goto finally;
6053 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6054 goto finally;
6055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 s0 = new_sockobject(sv[0], family, type, proto);
6057 if (s0 == NULL)
6058 goto finally;
6059 s1 = new_sockobject(sv[1], family, type, proto);
6060 if (s1 == NULL)
6061 goto finally;
6062 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006063
6064finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 if (res == NULL) {
6066 if (s0 == NULL)
6067 SOCKETCLOSE(sv[0]);
6068 if (s1 == NULL)
6069 SOCKETCLOSE(sv[1]);
6070 }
6071 Py_XDECREF(s0);
6072 Py_XDECREF(s1);
6073 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006074}
6075
6076PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006077"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006078\n\
6079Create a pair of socket objects from the sockets returned by the platform\n\
6080socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006081The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006082AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006083
6084#endif /* HAVE_SOCKETPAIR */
6085
6086
Guido van Rossum006bf911996-06-12 04:04:55 +00006087static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006088socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006089{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006090 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006091
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006092 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 return NULL;
6094 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006095 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006097 "ntohs: can't convert negative Python int to C "
6098 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 return NULL;
6100 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006101 if (x > 0xffff) {
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006102 PyErr_SetString(PyExc_OverflowError,
6103 "ntohs: Python int too large to convert to C "
6104 "16-bit unsigned integer");
6105 return NULL;
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006106 }
6107 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006108}
6109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006110PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006111"ntohs(integer) -> integer\n\
6112\n\
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006113Convert a 16-bit unsigned integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006114
6115
Guido van Rossum006bf911996-06-12 04:04:55 +00006116static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006117socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 if (PyLong_Check(arg)) {
6122 x = PyLong_AsUnsignedLong(arg);
6123 if (x == (unsigned long) -1 && PyErr_Occurred())
6124 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006125#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126 {
6127 unsigned long y;
6128 /* only want the trailing 32 bits */
6129 y = x & 0xFFFFFFFFUL;
6130 if (y ^ x)
6131 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006132 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006133 x = y;
6134 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 }
6137 else
6138 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006139 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006142}
6143
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006144PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006145"ntohl(integer) -> integer\n\
6146\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006147Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006148
6149
Guido van Rossum006bf911996-06-12 04:04:55 +00006150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006151socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006152{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006153 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006154
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006155 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 return NULL;
6157 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006158 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006160 "htons: can't convert negative Python int to C "
6161 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 return NULL;
6163 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006164 if (x > 0xffff) {
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006165 PyErr_SetString(PyExc_OverflowError,
6166 "htons: Python int too large to convert to C "
6167 "16-bit unsigned integer");
6168 return NULL;
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006169 }
6170 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006171}
6172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006173PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006174"htons(integer) -> integer\n\
6175\n\
Erlend Egeberg Aaslandf4936ad2020-12-31 14:16:50 +01006176Convert a 16-bit unsigned integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006177
6178
Guido van Rossum006bf911996-06-12 04:04:55 +00006179static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006180socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 if (PyLong_Check(arg)) {
6185 x = PyLong_AsUnsignedLong(arg);
6186 if (x == (unsigned long) -1 && PyErr_Occurred())
6187 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006188#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 {
6190 unsigned long y;
6191 /* only want the trailing 32 bits */
6192 y = x & 0xFFFFFFFFUL;
6193 if (y ^ x)
6194 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006195 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 x = y;
6197 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 }
6200 else
6201 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006202 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 Py_TYPE(arg)->tp_name);
6204 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006205}
6206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006207PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006208"htonl(integer) -> integer\n\
6209\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006210Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006211
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006212/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006214PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006215"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006216\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006217Convert 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 +00006218binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006219
6220static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006221socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006222{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006223#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006225#endif
6226
6227#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006228#if (SIZEOF_INT != 4)
6229#error "Not sure if in_addr_t exists and int is not 32-bits."
6230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 /* Have to use inet_addr() instead */
6232 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006233#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006234 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6237 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006238
Tim Peters1df9fdd2003-02-13 03:13:40 +00006239
6240#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006241
6242#ifdef USE_INET_ATON_WEAKLINK
6243 if (inet_aton != NULL) {
6244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 if (inet_aton(ip_addr, &buf))
6246 return PyBytes_FromStringAndSize((char *)(&buf),
6247 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006248
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006249 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 "illegal IP address string passed to inet_aton");
6251 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006252
Thomas Wouters477c8d52006-05-27 19:21:47 +00006253#ifdef USE_INET_ATON_WEAKLINK
6254 } else {
6255#endif
6256
6257#endif
6258
6259#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 /* special-case this address as inet_addr might return INADDR_NONE
6262 * for this */
6263 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006264 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006266
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006267 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006271 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 "illegal IP address string passed to inet_aton");
6273 return NULL;
6274 }
6275 }
6276 return PyBytes_FromStringAndSize((char *) &packed_addr,
6277 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006278
6279#ifdef USE_INET_ATON_WEAKLINK
6280 }
6281#endif
6282
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006283#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006284}
6285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006286PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006287"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006288\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006289Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006290
6291static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006292socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006293{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006294 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006296
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006297 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 return NULL;
6299 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006300
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006301 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006302 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006304 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 return NULL;
6306 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006307
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006308 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6309 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006310
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006311 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006313}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006314
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006315#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006316
6317PyDoc_STRVAR(inet_pton_doc,
6318"inet_pton(af, ip) -> packed IP address string\n\
6319\n\
6320Convert an IP address from string format to a packed string suitable\n\
6321for use with low-level network functions.");
6322
6323static PyObject *
6324socket_inet_pton(PyObject *self, PyObject *args)
6325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006327 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006329#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006330 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6335 return NULL;
6336 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006337
Martin v. Löwis04697e82004-06-02 12:35:29 +00006338#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006340 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 "can't use AF_INET6, IPv6 is disabled");
6342 return NULL;
6343 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006344#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 retval = inet_pton(af, ip, packed);
6347 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006348 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 return NULL;
6350 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006351 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 "illegal IP address string passed to inet_pton");
6353 return NULL;
6354 } else if (af == AF_INET) {
6355 return PyBytes_FromStringAndSize(packed,
6356 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006357#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 } else if (af == AF_INET6) {
6359 return PyBytes_FromStringAndSize(packed,
6360 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006363 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 return NULL;
6365 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006366}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006367
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006368PyDoc_STRVAR(inet_ntop_doc,
6369"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6370\n\
6371Convert a packed IP address of the given family to string format.");
6372
6373static PyObject *
6374socket_inet_ntop(PyObject *self, PyObject *args)
6375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006377 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006379#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006380 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006381#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006382 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006383#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006384
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006385 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 return NULL;
6387 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006390 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391 PyErr_SetString(PyExc_ValueError,
6392 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006393 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 return NULL;
6395 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006396#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006397 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006398 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 PyErr_SetString(PyExc_ValueError,
6400 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006401 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 return NULL;
6403 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 } else {
6406 PyErr_Format(PyExc_ValueError,
6407 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006408 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 return NULL;
6410 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006411
Коренберг Марк7766b962018-02-13 00:47:42 +05006412 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006413 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6414 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006416 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 return NULL;
6418 } else {
6419 return PyUnicode_FromString(retval);
6420 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006421}
6422
6423#endif /* HAVE_INET_PTON */
6424
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006425/* Python interface to getaddrinfo(host, port). */
6426
6427/*ARGSUSED*/
6428static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006429socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006430{
Victor Stinner77af1722011-05-26 14:05:59 +02006431 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006432 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 struct addrinfo hints, *res;
6434 struct addrinfo *res0 = NULL;
6435 PyObject *hobj = NULL;
6436 PyObject *pobj = (PyObject *)NULL;
6437 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006438 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 int family, socktype, protocol, flags;
6440 int error;
6441 PyObject *all = (PyObject *)NULL;
6442 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006443
Georg Brandl6083a4b2013-10-14 06:51:46 +02006444 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006446 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006447 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 &protocol, &flags)) {
6449 return NULL;
6450 }
6451 if (hobj == Py_None) {
6452 hptr = NULL;
6453 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006454 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 if (!idna)
6456 return NULL;
6457 assert(PyBytes_Check(idna));
6458 hptr = PyBytes_AS_STRING(idna);
6459 } else if (PyBytes_Check(hobj)) {
6460 hptr = PyBytes_AsString(hobj);
6461 } else {
6462 PyErr_SetString(PyExc_TypeError,
6463 "getaddrinfo() argument 1 must be string or None");
6464 return NULL;
6465 }
6466 if (PyLong_CheckExact(pobj)) {
6467 long value = PyLong_AsLong(pobj);
6468 if (value == -1 && PyErr_Occurred())
6469 goto err;
6470 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6471 pptr = pbuf;
6472 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006473 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006474 if (pptr == NULL)
6475 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006477 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 } else if (pobj == Py_None) {
6479 pptr = (char *)NULL;
6480 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006481 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 goto err;
6483 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006484#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006485 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006486 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006487 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6488 * This workaround avoids a segfault in libsystem.
6489 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006490 pptr = "00";
6491 }
6492#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006493
6494 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6495 hobj, pobj, family, socktype, protocol) < 0) {
6496 return NULL;
6497 }
6498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499 memset(&hints, 0, sizeof(hints));
6500 hints.ai_family = family;
6501 hints.ai_socktype = socktype;
6502 hints.ai_protocol = protocol;
6503 hints.ai_flags = flags;
6504 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 error = getaddrinfo(hptr, pptr, &hints, &res0);
6506 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 if (error) {
6508 set_gaierror(error);
6509 goto err;
6510 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006511
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006512 all = PyList_New(0);
6513 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 goto err;
6515 for (res = res0; res; res = res->ai_next) {
6516 PyObject *single;
6517 PyObject *addr =
6518 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6519 if (addr == NULL)
6520 goto err;
6521 single = Py_BuildValue("iiisO", res->ai_family,
6522 res->ai_socktype, res->ai_protocol,
6523 res->ai_canonname ? res->ai_canonname : "",
6524 addr);
6525 Py_DECREF(addr);
6526 if (single == NULL)
6527 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006528
Zackery Spytz4c596d52018-11-14 15:39:01 -07006529 if (PyList_Append(all, single)) {
6530 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006532 }
6533 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534 }
6535 Py_XDECREF(idna);
6536 if (res0)
6537 freeaddrinfo(res0);
6538 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006539 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540 Py_XDECREF(all);
6541 Py_XDECREF(idna);
6542 if (res0)
6543 freeaddrinfo(res0);
6544 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006545}
6546
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006547PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006548"getaddrinfo(host, port [, family, type, proto, flags])\n\
6549 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006550\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006551Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006552
6553/* Python interface to getnameinfo(sa, flags). */
6554
6555/*ARGSUSED*/
6556static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006557socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 PyObject *sa = (PyObject *)NULL;
6560 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006561 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006562 int port;
6563 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6565 struct addrinfo hints, *res = NULL;
6566 int error;
6567 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006568 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570 flags = flowinfo = scope_id = 0;
6571 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6572 return NULL;
6573 if (!PyTuple_Check(sa)) {
6574 PyErr_SetString(PyExc_TypeError,
6575 "getnameinfo() argument 1 must be a tuple");
6576 return NULL;
6577 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006578 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006580 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006582 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006583 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006584 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006585 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006586 return NULL;
6587 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006588
6589 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6590 return NULL;
6591 }
6592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6594 memset(&hints, 0, sizeof(hints));
6595 hints.ai_family = AF_UNSPEC;
6596 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006597 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 error = getaddrinfo(hostp, pbuf, &hints, &res);
6600 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 if (error) {
6602 set_gaierror(error);
6603 goto fail;
6604 }
6605 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006606 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 "sockaddr resolved to multiple addresses");
6608 goto fail;
6609 }
6610 switch (res->ai_family) {
6611 case AF_INET:
6612 {
6613 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006614 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615 "IPv4 sockaddr must be 2 tuple");
6616 goto fail;
6617 }
6618 break;
6619 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006620#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 case AF_INET6:
6622 {
6623 struct sockaddr_in6 *sin6;
6624 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006625 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 sin6->sin6_scope_id = scope_id;
6627 break;
6628 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006631 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6633 if (error) {
6634 set_gaierror(error);
6635 goto fail;
6636 }
Victor Stinner72400302016-01-28 15:41:01 +01006637
6638 name = sock_decode_hostname(hbuf);
6639 if (name == NULL)
6640 goto fail;
6641 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006642
6643fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 if (res)
6645 freeaddrinfo(res);
6646 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006647}
6648
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006649PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006650"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006651\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006652Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006653
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006654
6655/* Python API to getting and setting the default timeout value. */
6656
6657static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306658socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006659{
Victor Stinner71694d52015-03-28 01:18:54 +01006660 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006661 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 }
Victor Stinner71694d52015-03-28 01:18:54 +01006663 else {
6664 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6665 return PyFloat_FromDouble(seconds);
6666 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006667}
6668
6669PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006670"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006671\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006672Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006673A value of None indicates that new socket objects have no timeout.\n\
6674When the socket module is first imported, the default is None.");
6675
6676static PyObject *
6677socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6678{
Victor Stinner71694d52015-03-28 01:18:54 +01006679 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006680
Victor Stinner71694d52015-03-28 01:18:54 +01006681 if (socket_parse_timeout(&timeout, arg) < 0)
6682 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006685
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006686 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006687}
6688
6689PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006690"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006691\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006692Set 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
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006696#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006697/* Python API for getting interface indices and names */
6698
6699static PyObject *
6700socket_if_nameindex(PyObject *self, PyObject *arg)
6701{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006702 PyObject *list = PyList_New(0);
6703 if (list == NULL) {
6704 return NULL;
6705 }
6706#ifdef MS_WINDOWS
6707 PMIB_IF_TABLE2 tbl;
6708 int ret;
6709 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6710 Py_DECREF(list);
6711 // ret is used instead of GetLastError()
6712 return PyErr_SetFromWindowsErr(ret);
6713 }
6714 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6715 MIB_IF_ROW2 r = tbl->Table[i];
6716 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6717 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6718 Py_ARRAY_LENGTH(buf)))) {
6719 Py_DECREF(list);
6720 FreeMibTable(tbl);
6721 // ret is used instead of GetLastError()
6722 return PyErr_SetFromWindowsErr(ret);
6723 }
6724 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6725 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6726 Py_XDECREF(tuple);
6727 Py_DECREF(list);
6728 FreeMibTable(tbl);
6729 return NULL;
6730 }
6731 Py_DECREF(tuple);
6732 }
6733 FreeMibTable(tbl);
6734 return list;
6735#else
Charles-François Natali60713592011-05-20 16:55:06 +02006736 int i;
6737 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006738
Charles-François Natali60713592011-05-20 16:55:06 +02006739 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006740 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006741 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006742 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006743 return NULL;
6744 }
6745
Gregory P. Smithb474e672018-12-30 17:05:36 -08006746#ifdef _Py_MEMORY_SANITIZER
6747 __msan_unpoison(ni, sizeof(ni));
6748 __msan_unpoison(&ni[0], sizeof(ni[0]));
6749#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006750 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006751#ifdef _Py_MEMORY_SANITIZER
6752 /* This one isn't the end sentinel, the next one must exist. */
6753 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6754 /* Otherwise Py_BuildValue internals are flagged by MSan when
6755 they access the not-msan-tracked if_name string data. */
6756 {
6757 char *to_sanitize = ni[i].if_name;
6758 do {
6759 __msan_unpoison(to_sanitize, 1);
6760 } while (*to_sanitize++ != '\0');
6761 }
6762#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006763 PyObject *ni_tuple = Py_BuildValue("IO&",
6764 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006765
6766 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6767 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006768 Py_DECREF(list);
6769 if_freenameindex(ni);
6770 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006771 }
6772 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006773 }
6774
6775 if_freenameindex(ni);
6776 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006777#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006778}
6779
6780PyDoc_STRVAR(if_nameindex_doc,
6781"if_nameindex()\n\
6782\n\
6783Returns a list of network interface information (index, name) tuples.");
6784
Charles-François Natali60713592011-05-20 16:55:06 +02006785static PyObject *
6786socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006787{
Charles-François Natali60713592011-05-20 16:55:06 +02006788 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006789#ifdef MS_WINDOWS
6790 NET_IFINDEX index;
6791#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006792 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006793#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006794 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6795 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006796 return NULL;
6797
Charles-François Natali60713592011-05-20 16:55:06 +02006798 index = if_nametoindex(PyBytes_AS_STRING(oname));
6799 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006800 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006801 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006802 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006803 return NULL;
6804 }
6805
6806 return PyLong_FromUnsignedLong(index);
6807}
6808
6809PyDoc_STRVAR(if_nametoindex_doc,
6810"if_nametoindex(if_name)\n\
6811\n\
6812Returns the interface index corresponding to the interface name if_name.");
6813
Charles-François Natali60713592011-05-20 16:55:06 +02006814static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006815socket_if_indextoname(PyObject *self, PyObject *arg)
6816{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006817#ifdef MS_WINDOWS
6818 NET_IFINDEX index;
6819#else
Charles-François Natali60713592011-05-20 16:55:06 +02006820 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006821#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006822 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006823
Charles-François Natali60713592011-05-20 16:55:06 +02006824 index = PyLong_AsUnsignedLong(arg);
6825 if (index == (unsigned long) -1)
6826 return NULL;
6827
6828 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006829 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006830 return NULL;
6831 }
6832
Charles-François Natali60713592011-05-20 16:55:06 +02006833 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006834}
6835
6836PyDoc_STRVAR(if_indextoname_doc,
6837"if_indextoname(if_index)\n\
6838\n\
6839Returns the interface name corresponding to the interface index if_index.");
6840
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006841#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006842
6843
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006844#ifdef CMSG_LEN
6845/* Python interface to CMSG_LEN(length). */
6846
6847static PyObject *
6848socket_CMSG_LEN(PyObject *self, PyObject *args)
6849{
6850 Py_ssize_t length;
6851 size_t result;
6852
6853 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6854 return NULL;
6855 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6856 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6857 return NULL;
6858 }
6859 return PyLong_FromSize_t(result);
6860}
6861
6862PyDoc_STRVAR(CMSG_LEN_doc,
6863"CMSG_LEN(length) -> control message length\n\
6864\n\
6865Return the total length, without trailing padding, of an ancillary\n\
6866data item with associated data of the given length. This value can\n\
6867often be used as the buffer size for recvmsg() to receive a single\n\
6868item of ancillary data, but RFC 3542 requires portable applications to\n\
6869use CMSG_SPACE() and thus include space for padding, even when the\n\
6870item will be the last in the buffer. Raises OverflowError if length\n\
6871is outside the permissible range of values.");
6872
6873
6874#ifdef CMSG_SPACE
6875/* Python interface to CMSG_SPACE(length). */
6876
6877static PyObject *
6878socket_CMSG_SPACE(PyObject *self, PyObject *args)
6879{
6880 Py_ssize_t length;
6881 size_t result;
6882
6883 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6884 return NULL;
6885 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6886 PyErr_SetString(PyExc_OverflowError,
6887 "CMSG_SPACE() argument out of range");
6888 return NULL;
6889 }
6890 return PyLong_FromSize_t(result);
6891}
6892
6893PyDoc_STRVAR(CMSG_SPACE_doc,
6894"CMSG_SPACE(length) -> buffer size\n\
6895\n\
6896Return the buffer size needed for recvmsg() to receive an ancillary\n\
6897data item with associated data of the given length, along with any\n\
6898trailing padding. The buffer space needed to receive multiple items\n\
6899is the sum of the CMSG_SPACE() values for their associated data\n\
6900lengths. Raises OverflowError if length is outside the permissible\n\
6901range of values.");
6902#endif /* CMSG_SPACE */
6903#endif /* CMSG_LEN */
6904
6905
Guido van Rossum30a685f1991-06-27 15:51:29 +00006906/* List of functions exported by this module. */
6907
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006908static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909 {"gethostbyname", socket_gethostbyname,
6910 METH_VARARGS, gethostbyname_doc},
6911 {"gethostbyname_ex", socket_gethostbyname_ex,
6912 METH_VARARGS, ghbn_ex_doc},
6913 {"gethostbyaddr", socket_gethostbyaddr,
6914 METH_VARARGS, gethostbyaddr_doc},
6915 {"gethostname", socket_gethostname,
6916 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006917#ifdef HAVE_SETHOSTNAME
6918 {"sethostname", socket_sethostname,
6919 METH_VARARGS, sethostname_doc},
6920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 {"getservbyname", socket_getservbyname,
6922 METH_VARARGS, getservbyname_doc},
6923 {"getservbyport", socket_getservbyport,
6924 METH_VARARGS, getservbyport_doc},
6925 {"getprotobyname", socket_getprotobyname,
6926 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006927 {"close", socket_close,
6928 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006929#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930 {"dup", socket_dup,
6931 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006932#endif
Dave Cole331708b2004-08-09 04:51:41 +00006933#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 {"socketpair", socket_socketpair,
6935 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937 {"ntohs", socket_ntohs,
6938 METH_VARARGS, ntohs_doc},
6939 {"ntohl", socket_ntohl,
6940 METH_O, ntohl_doc},
6941 {"htons", socket_htons,
6942 METH_VARARGS, htons_doc},
6943 {"htonl", socket_htonl,
6944 METH_O, htonl_doc},
6945 {"inet_aton", socket_inet_aton,
6946 METH_VARARGS, inet_aton_doc},
6947 {"inet_ntoa", socket_inet_ntoa,
6948 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006949#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 {"inet_pton", socket_inet_pton,
6951 METH_VARARGS, inet_pton_doc},
6952 {"inet_ntop", socket_inet_ntop,
6953 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006954#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006955 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006956 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957 {"getnameinfo", socket_getnameinfo,
6958 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306959 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960 METH_NOARGS, getdefaulttimeout_doc},
6961 {"setdefaulttimeout", socket_setdefaulttimeout,
6962 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006963#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006964 {"if_nameindex", socket_if_nameindex,
6965 METH_NOARGS, if_nameindex_doc},
6966 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006967 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006968 {"if_indextoname", socket_if_indextoname,
6969 METH_O, if_indextoname_doc},
6970#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006971#ifdef CMSG_LEN
6972 {"CMSG_LEN", socket_CMSG_LEN,
6973 METH_VARARGS, CMSG_LEN_doc},
6974#ifdef CMSG_SPACE
6975 {"CMSG_SPACE", socket_CMSG_SPACE,
6976 METH_VARARGS, CMSG_SPACE_doc},
6977#endif
6978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006980};
6981
Guido van Rossum30a685f1991-06-27 15:51:29 +00006982
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006983#ifdef MS_WINDOWS
6984#define OS_INIT_DEFINED
6985
6986/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006987
6988static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006989os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006991 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006992}
6993
6994static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006995os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006997 WSADATA WSAData;
6998 int ret;
6999 ret = WSAStartup(0x0101, &WSAData);
7000 switch (ret) {
7001 case 0: /* No error */
7002 Py_AtExit(os_cleanup);
7003 return 1; /* Success */
7004 case WSASYSNOTREADY:
7005 PyErr_SetString(PyExc_ImportError,
7006 "WSAStartup failed: network not ready");
7007 break;
7008 case WSAVERNOTSUPPORTED:
7009 case WSAEINVAL:
7010 PyErr_SetString(
7011 PyExc_ImportError,
7012 "WSAStartup failed: requested version not supported");
7013 break;
7014 default:
7015 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7016 break;
7017 }
7018 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007019}
7020
Guido van Rossum8d665e61996-06-26 18:22:49 +00007021#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007022
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007023
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007024
7025#ifndef OS_INIT_DEFINED
7026static int
7027os_init(void)
7028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007030}
7031#endif
7032
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007033static void
7034sock_free_api(PySocketModule_APIObject *capi)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007035{
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007036 Py_DECREF(capi->Sock_Type);
7037 Py_DECREF(capi->error);
7038 Py_DECREF(capi->timeout_error);
7039 PyMem_Free(capi);
7040}
7041
7042static void
7043sock_destroy_api(PyObject *capsule)
7044{
7045 void *capi = PyCapsule_GetPointer(capsule, PySocket_CAPSULE_NAME);
7046 sock_free_api(capi);
7047}
7048
7049static PySocketModule_APIObject *
7050sock_get_api(void)
7051{
7052 PySocketModule_APIObject *capi = PyMem_Malloc(sizeof(PySocketModule_APIObject));
7053 if (capi == NULL) {
7054 PyErr_NoMemory();
7055 return NULL;
7056 }
7057
7058 capi->Sock_Type = (PyTypeObject *)Py_NewRef(&sock_type);
7059 capi->error = Py_NewRef(PyExc_OSError);
7060 capi->timeout_error = Py_NewRef(PyExc_TimeoutError);
7061 return capi;
7062}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007063
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);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007112 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007114 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 if (socket_herror == NULL)
7116 return NULL;
7117 Py_INCREF(socket_herror);
7118 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007119 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 NULL);
7121 if (socket_gaierror == NULL)
7122 return NULL;
7123 Py_INCREF(socket_gaierror);
7124 PyModule_AddObject(m, "gaierror", socket_gaierror);
Christian Heimes03c8ddd2020-11-20 09:26:07 +01007125 PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError);
7126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007127 Py_INCREF((PyObject *)&sock_type);
7128 if (PyModule_AddObject(m, "SocketType",
7129 (PyObject *)&sock_type) != 0)
7130 return NULL;
7131 Py_INCREF((PyObject *)&sock_type);
7132 if (PyModule_AddObject(m, "socket",
7133 (PyObject *)&sock_type) != 0)
7134 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007135
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007136#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 Py_INCREF(has_ipv6);
7142 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 /* Export C API */
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007145 PySocketModule_APIObject *capi = sock_get_api();
7146 if (capi == NULL) {
7147 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 return NULL;
Erlend Egeberg Aaslandf22b7ca2021-01-06 20:43:06 +01007149 }
7150 PyObject *capsule = PyCapsule_New(capi,
7151 PySocket_CAPSULE_NAME,
7152 sock_destroy_api);
7153 if (capsule == NULL) {
7154 sock_free_api(capi);
7155 Py_DECREF(m);
7156 return NULL;
7157 }
7158 if (PyModule_AddObject(m, PySocket_CAPI_NAME, capsule) < 0) {
7159 Py_DECREF(capsule);
7160 Py_DECREF(m);
7161 return NULL;
7162 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007165#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007167#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007169#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007171#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007172#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007173 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007175#endif
7176#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007178#endif
7179#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007182#endif
7183#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007186#endif
7187#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007190#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007191#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007194#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007195#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007198#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007199#ifdef HAVE_SOCKADDR_ALG
7200 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7201#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007202#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007205#endif
7206#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007208#endif
7209#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007212#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007213#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007216#endif
7217#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007220#endif
7221#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007224#endif
7225#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007228#endif
7229#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, AF_NETLINK);
7232 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007233#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007235#endif
7236#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007238#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7240 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007241#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007243#endif
7244#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007246#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007247#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007249#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007250#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007252#endif
7253#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007255#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007257#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007259#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007260#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007262#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007263#ifdef NETLINK_CRYPTO
7264 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7265#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007266#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007267
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007268#ifdef AF_QIPCRTR
7269 /* Qualcomm IPCROUTER */
7270 PyModule_AddIntMacro(m, AF_QIPCRTR);
7271#endif
7272
caaveryeffc12f2017-09-06 18:18:10 -04007273#ifdef AF_VSOCK
7274 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7275 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7276 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7277 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7278 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7279 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7280 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7281 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7282 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7283#endif
7284
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007285#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007286 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007288#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007289#ifdef AF_LINK
7290 PyModule_AddIntMacro(m, AF_LINK);
7291#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007292#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007295#endif
7296#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007299#endif
7300#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007303#endif
7304#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007307#endif
7308#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007311#endif
7312#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007315#endif
7316#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007319#endif
7320#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007323#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007324
Hye-Shik Chang81268602004-02-02 06:05:24 +00007325#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007327#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007329#endif /* BTPROTO_L2CAP */
7330#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, BTPROTO_HCI);
7332 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007333#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007335#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007338#endif /* !__FreeBSD__ */
7339#endif /* !__NetBSD__ && !__DragonFly__ */
7340#endif /* BTPROTO_HCI */
7341#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007343#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7345 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007346#ifdef BTPROTO_SCO
7347 PyModule_AddIntMacro(m, BTPROTO_SCO);
7348#endif /* BTPROTO_SCO */
7349#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007350
Charles-François Natali47413c12011-10-06 19:47:44 +02007351#ifdef AF_CAN
7352 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007354#endif
7355#ifdef PF_CAN
7356 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007358#endif
7359
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007360/* Reliable Datagram Sockets */
7361#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007363#endif
7364#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007366#endif
7367
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007368/* Kernel event messages */
7369#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007371#endif
7372#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007374#endif
7375
Antoine Pitroub156a462010-10-27 20:13:57 +00007376#ifdef AF_PACKET
7377 PyModule_AddIntMacro(m, AF_PACKET);
7378#endif
7379#ifdef PF_PACKET
7380 PyModule_AddIntMacro(m, PF_PACKET);
7381#endif
7382#ifdef PACKET_HOST
7383 PyModule_AddIntMacro(m, PACKET_HOST);
7384#endif
7385#ifdef PACKET_BROADCAST
7386 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7387#endif
7388#ifdef PACKET_MULTICAST
7389 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7390#endif
7391#ifdef PACKET_OTHERHOST
7392 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7393#endif
7394#ifdef PACKET_OUTGOING
7395 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7396#endif
7397#ifdef PACKET_LOOPBACK
7398 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7399#endif
7400#ifdef PACKET_FASTROUTE
7401 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007402#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007403
Christian Heimes043d6f62008-01-07 17:19:16 +00007404#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7409 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7410 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007411
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7413 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7414 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, SOL_TIPC);
7418 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7419 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7420 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7421 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007422
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007423 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7424 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7425 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7426 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007428 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007429 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7430 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007431#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007434#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007435 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7436 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7437 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7438 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7439 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7440 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007441#endif
7442
Christian Heimesdffa3942016-09-05 23:54:41 +02007443#ifdef HAVE_SOCKADDR_ALG
7444 /* Socket options */
7445 PyModule_AddIntMacro(m, ALG_SET_KEY);
7446 PyModule_AddIntMacro(m, ALG_SET_IV);
7447 PyModule_AddIntMacro(m, ALG_SET_OP);
7448 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7449 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7450 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7451
7452 /* Operations */
7453 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7454 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7455 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7456 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7457#endif
7458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007459 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007460 PyModule_AddIntMacro(m, SOCK_STREAM);
7461 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007462/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007463#ifdef SOCK_RAW
7464 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007466#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007468#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007470#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007471#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007473#endif
7474#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007476#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007487#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007489#endif
7490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007494#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007497#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007509#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007512#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007540#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007541#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007543#endif
7544#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007546#endif
7547#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007549#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007550#ifdef SO_PASSSEC
7551 PyModule_AddIntMacro(m, SO_PASSSEC);
7552#endif
7553#ifdef SO_PEERSEC
7554 PyModule_AddIntMacro(m, SO_PEERSEC);
7555#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007556#ifdef SO_BINDTODEVICE
7557 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7558#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007559#ifdef SO_PRIORITY
7560 PyModule_AddIntMacro(m, SO_PRIORITY);
7561#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007562#ifdef SO_MARK
7563 PyModule_AddIntMacro(m, SO_MARK);
7564#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007565#ifdef SO_DOMAIN
7566 PyModule_AddIntMacro(m, SO_DOMAIN);
7567#endif
7568#ifdef SO_PROTOCOL
7569 PyModule_AddIntMacro(m, SO_PROTOCOL);
7570#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007572 /* Maximum number of connections for "listen" */
7573#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007577#endif
7578
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007579 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007580#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007582#endif
7583#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007585#endif
7586#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007588#endif
7589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007590 /* Flags for send, recv */
7591#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007620#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007621#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007623#endif
7624#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007626#endif
7627#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007629#endif
7630#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007632#endif
7633#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007635#endif
7636#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007638#endif
7639#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007641#endif
7642#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007644#endif
7645#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007647#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007648#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007650#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007652 /* Protocol level and numbers, usable for [gs]etsockopt */
7653#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007658#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007661#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007664#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007670#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007673#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007676#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007679 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007681#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007683#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007685#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007686#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007688#endif
7689#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7691 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007692#endif
7693#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7695 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7696 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007697
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7699 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7700 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007701#ifdef CAN_ISOTP
7702 PyModule_AddIntMacro(m, CAN_ISOTP);
7703#endif
karl ding360371f2020-04-29 15:31:19 -07007704#ifdef CAN_J1939
7705 PyModule_AddIntMacro(m, CAN_J1939);
7706#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007707#endif
7708#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7710 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7711 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7712 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007713#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007714#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7715 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7716#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007717#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7718 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7719#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007720#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007722
7723 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007724 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7725 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7726 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7727 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7728 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7729 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7730 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7731 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7732 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7733 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7734 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7735 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007736
7737 /* BCM flags */
7738 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7739 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7740 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7741 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7742 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7743 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7744 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7745 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7746 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7747 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7748 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7749#ifdef CAN_FD_FRAME
7750 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7751 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7752#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007753#endif
karl ding360371f2020-04-29 15:31:19 -07007754#ifdef HAVE_LINUX_CAN_J1939_H
7755 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7756 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7757 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7758 PyModule_AddIntMacro(m, J1939_NO_NAME);
7759 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7760 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7761 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7762 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7763 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7764 PyModule_AddIntMacro(m, J1939_NO_PGN);
7765
7766 /* J1939 socket options */
7767 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7768 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7769 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7770 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7771
7772 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7773 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7774 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7775 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7776
7777 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7778 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7779
7780 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7781 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7782
7783 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7784#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007785#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007787#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007788#ifdef HAVE_SOCKADDR_ALG
7789 PyModule_AddIntMacro(m, SOL_ALG);
7790#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007791#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007793#endif
7794#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007796#endif
7797#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007799#endif
7800#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007802#endif
7803#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007805#endif
7806#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007809#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007811#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007812 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007814#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007818 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007819#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007820 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007839#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007842#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007843 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007845#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007846 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007848#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007849 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007850#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007851 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007852#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007853#ifdef IPPROTO_UDPLITE
7854 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7855 #ifndef UDPLITE_SEND_CSCOV
7856 #define UDPLITE_SEND_CSCOV 10
7857 #endif
7858 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7859 #ifndef UDPLITE_RECV_CSCOV
7860 #define UDPLITE_RECV_CSCOV 11
7861 #endif
7862 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007864#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007873#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007879#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007888#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007891#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007894#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007897#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007900#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007906#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007907 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007912#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007915#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007918#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007920#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007921#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007924#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007926#endif
Rui Cunhab05b48d2021-03-20 22:04:56 +00007927#ifdef IPPROTO_MPTCP
7928 PyModule_AddIntMacro(m, IPPROTO_MPTCP);
7929#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007930/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007932 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007933#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007934 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007936#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007938#endif
7939
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007940#ifdef MS_WINDOWS
7941 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7942 PyModule_AddIntMacro(m, IPPROTO_ST);
7943 PyModule_AddIntMacro(m, IPPROTO_CBT);
7944 PyModule_AddIntMacro(m, IPPROTO_IGP);
7945 PyModule_AddIntMacro(m, IPPROTO_RDP);
7946 PyModule_AddIntMacro(m, IPPROTO_PGM);
7947 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7948 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7949#endif
7950
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007951#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007953#endif
7954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955 /* Some port configuration */
7956#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007959 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007963#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007965#endif
7966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007967 /* Some reserved IP v.4 addresses */
7968#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007970#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007980#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007981 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007983#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007985#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988#ifdef INADDR_ALLHOSTS_GROUP
7989 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7990 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007991#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007992 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007995 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007996#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007999#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008000 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008001#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008002 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008003#endif
8004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008005 /* IPv4 [gs]etsockopt options */
8006#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008007 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008011#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008013 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008019 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008021#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008022 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008023#endif
Miss Islington (bot)28fe0152021-06-20 13:36:21 -07008024#ifdef IP_RECVTOS
8025 PyModule_AddIntMacro(m, IP_RECVTOS);
8026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008028 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008030#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008031 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008033#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008034 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008036#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008037 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008039#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008040 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008042#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008043 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008045#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008046 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008048#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008049 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008051#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008052 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008054#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008055 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008056#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008057#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008058 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008059#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008061 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8062#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008063 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008065#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008066 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008068#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008071#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008072 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008074#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008075 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008077#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008078 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008080 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008081#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008082 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008084 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008085#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008087#endif
8088#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008090#endif
8091#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008093#endif
8094#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008096#endif
8097#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008099#endif
8100#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008102#endif
8103#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008105#endif
8106#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008108#endif
8109#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008111#endif
8112#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008114#endif
8115#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008117#endif
8118#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008120#endif
8121#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008123#endif
8124#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008126#endif
8127#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008129#endif
8130#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008132#endif
8133#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008135#endif
8136#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008138#endif
8139#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008141#endif
8142#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008143 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008144#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008146 /* TCP options */
8147#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008150#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008151 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008153#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008154 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008156#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008157 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008158#endif
Miss Islington (bot)ff7af222021-07-14 16:15:31 -07008159 /* TCP_KEEPALIVE is OSX's TCP_KEEPIDLE equivalent */
8160#if defined(__APPLE__) && defined(TCP_KEEPALIVE)
8161 PyModule_AddIntMacro(m, TCP_KEEPALIVE);
8162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008163#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008166#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008169#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008172#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008173 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008175#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008176 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008178#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008181#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008182 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008183#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008184#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008185 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008186#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008187#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008188 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008189#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008190#ifdef TCP_CONGESTION
8191 PyModule_AddIntMacro(m, TCP_CONGESTION);
8192#endif
8193#ifdef TCP_USER_TIMEOUT
8194 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8195#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008196#ifdef TCP_NOTSENT_LOWAT
8197 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8198#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008200 /* IPX options */
8201#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008202 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008203#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008204
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008205/* Reliable Datagram Sockets */
8206#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008207 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008208#endif
8209#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008210 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008211#endif
8212#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008213 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008214#endif
8215#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008216 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008217#endif
8218#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008219 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008220#endif
8221#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008222 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008223#endif
8224#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008225 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008226#endif
8227#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008228 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008229#endif
8230#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008231 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008232#endif
8233#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008234 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008235#endif
8236#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008237 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008238#endif
8239#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008240 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008241#endif
8242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008243 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008244#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008245 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008246#endif
8247#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008248 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008249#endif
8250#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008251 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008252#endif
8253#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008254 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008255#endif
8256#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008257 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008258#endif
8259#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008260 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008261#endif
8262#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008263 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008264#endif
8265#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008266 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008267#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008268#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008269 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008270#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008271#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008272 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008273#endif
8274#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008275 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008276#endif
8277#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008278 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008279#endif
8280#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008281 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008282#endif
8283#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008284 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008285#endif
8286#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008287 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008288#endif
8289#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008290 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008291#endif
8292#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008293 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008294#endif
8295#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008296 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008297#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008298#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008299 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008300#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008301#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008302 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008303#endif
8304#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008305 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008306#endif
8307#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008308 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008309#endif
8310#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008311 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008312#endif
8313#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008314 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008315#endif
8316#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008317 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008318#endif
8319#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008320 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008321#endif
8322#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008323 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008324#endif
8325#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008326 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008327#endif
8328#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008329 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008330#endif
8331#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008332 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008333#endif
8334#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008335 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008336#endif
8337#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008338 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008339#endif
8340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008341 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008342#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008343 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008344#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008345 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008346#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008347 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008348#endif
8349#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008350 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008351#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008352 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008354 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008355#endif
8356#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008357 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008358#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008359 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008360#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008361 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008362#endif
8363
Christian Heimesfaf2f632008-01-06 16:59:19 +00008364#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008365 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008366 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8367#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008368 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008369#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008370 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008371 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8372#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008373 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008374#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008375 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008376 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008377 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008378 PyObject *tmp;
8379 tmp = PyLong_FromUnsignedLong(codes[i]);
8380 if (tmp == NULL)
8381 return NULL;
8382 PyModule_AddObject(m, names[i], tmp);
8383 }
8384 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008385 PyModule_AddIntMacro(m, RCVALL_OFF);
8386 PyModule_AddIntMacro(m, RCVALL_ON);
8387 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008388#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008389 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008390#endif
8391#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008392 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008393#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008394#endif /* _MSTCPIP_ */
8395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008396 /* Initialize gethostbyname lock */
Victor Stinner0de437d2020-05-28 17:23:39 +02008397#if defined(USE_GETHOSTBYNAME_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008398 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008399#endif
animalize19e7d482018-02-27 02:10:36 +08008400
8401#ifdef MS_WINDOWS
8402 /* remove some flags on older version Windows during run-time */
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02008403 if (remove_unusable_flags(m) < 0) {
8404 Py_DECREF(m);
8405 return NULL;
8406 }
animalize19e7d482018-02-27 02:10:36 +08008407#endif
8408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008409 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008410}