blob: 76ef606e10b1fb57418195d3663ba3cda86fce64 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Bjorn Anderssonbb816512018-09-26 06:47:52 -070010 portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are
11 supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Bjorn Anderssonbb816512018-09-26 06:47:52 -070058- an AF_QIPCRTR socket address is a (node, port) tuple where the
59 node and port are non-negative integers.
Christian Heimes043d6f62008-01-07 17:19:16 +000060- an AF_TIPC socket address is expressed as
61 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000063 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000065 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if addr_type is TIPC_ADDR_NAME:
67 v1 is the server type
68 v2 is the port identifier
69 v3 is ignored
70 if addr_type is TIPC_ADDR_NAMESEQ:
71 v1 is the server type
72 v2 is the lower port number
73 v3 is the upper port number
74 if addr_type is TIPC_ADDR_ID:
75 v1 is the node
76 v2 is the ref
77 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000078
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000082- names starting with sock_ are socket object methods
83- names starting with socket_ are module-level functions
84- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Thomas Wouters477c8d52006-05-27 19:21:47 +000088#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110089#include <AvailabilityMacros.h>
90/* for getaddrinfo thread safety test on old versions of OS X */
91#ifndef MAC_OS_X_VERSION_10_5
92#define MAC_OS_X_VERSION_10_5 1050
93#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 /*
95 * inet_aton is not available on OSX 10.3, yet we want to use a binary
96 * that was build on 10.4 or later to work on that release, weak linking
97 * comes to the rescue.
98 */
99# pragma weak inet_aton
100#endif
101
Inada Naokie9a1dcb2019-03-20 19:02:46 +0900102#define PY_SSIZE_T_CLEAN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000103#include "Python.h"
Victor Stinner4a21e572020-04-15 02:35:41 +0200104#include "structmember.h" // PyMemberDef
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105
Gregory P. Smithb474e672018-12-30 17:05:36 -0800106#ifdef _Py_MEMORY_SANITIZER
107# include <sanitizer/msan_interface.h>
108#endif
109
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000110/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000111PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100112"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
113socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
115Open a socket of the given type. The family argument specifies the\n\
116address family; it defaults to AF_INET. The type argument specifies\n\
117whether this is a stream (SOCK_STREAM, this is the default)\n\
118or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
119specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200120The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100122When a fileno is passed in, family, type and proto are auto-detected,\n\
123unless they are explicitly set.\n\
124\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125A socket object represents one endpoint of a network connection.\n\
126\n\
127Methods of socket objects (keyword arguments not allowed):\n\
128\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000129_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130bind(addr) -- bind the socket to a local address\n\
131close() -- close the socket\n\
132connect(addr) -- connect the socket to a remote address\n\
133connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200134dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135fileno() -- return underlying file descriptor\n\
136getpeername() -- return remote address [*]\n\
137getsockname() -- return local address\n\
138getsockopt(level, optname[, buflen]) -- get socket options\n\
139gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100140listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000142recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000144recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000145 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000146sendall(data[, flags]) -- send all data\n\
147send(data[, flags]) -- send data, may not send all of it\n\
148sendto(data[, flags], addr) -- send data to a given address\n\
Serhiy Storchaka5eca7f32019-09-01 12:12:52 +0300149setblocking(bool) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500150getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200151setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000152settimeout(None | float) -- set or clear the timeout\n\
153shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700154if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700155if_nametoindex(name) -- return the corresponding interface index\n\
156if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000158 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000159
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000160/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000161 I hope some day someone can clean this up please... */
162
Guido van Rossum9376b741999-09-15 22:01:40 +0000163/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
164 script doesn't get this right, so we hardcode some platform checks below.
165 On the other hand, not all Linux versions agree, so there the settings
166 computed by the configure script are needed! */
167
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700168#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# undef HAVE_GETHOSTBYNAME_R_3_ARG
170# undef HAVE_GETHOSTBYNAME_R_5_ARG
171# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000172#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000173
Victor Stinner710d27e2011-08-23 10:57:32 +0200174#if defined(__OpenBSD__)
175# include <sys/uio.h>
176#endif
177
Stefan Krah1f9eb872016-05-22 17:35:34 +0200178#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000180#endif
181
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000183# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# define HAVE_GETHOSTBYNAME_R_3_ARG
185# elif defined(__sun) || defined(__sgi)
186# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700187# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000188/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000189# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
190# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000191# else
192# undef HAVE_GETHOSTBYNAME_R
193# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000194#endif
195
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200196#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000198#endif
199
Ned Deilye1d4e582016-02-23 22:05:29 +1100200/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000201#ifdef HAVE_SYS_PARAM_H
202#include <sys/param.h>
203#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000204/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100205 (this includes the getaddrinfo emulation) protect access with a lock.
206
207 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
208 a mix of code including an unsafe implementation from an old BSD's
209 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
210 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100212
Ned Deilye1d4e582016-02-23 22:05:29 +1100213 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
214 http://www.openbsd.org/plus54.html
215
216 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
217
218http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100219 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200220#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100221 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000222 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100223 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
224 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100225 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000226#define USE_GETADDRINFO_LOCK
227#endif
228
229#ifdef USE_GETADDRINFO_LOCK
230#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
231#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
232#else
233#define ACQUIRE_GETADDRINFO_LOCK
234#define RELEASE_GETADDRINFO_LOCK
235#endif
236
Serhiy Storchakad3187152017-11-09 18:00:38 +0200237#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Victor Stinner62183b82020-04-15 02:04:42 +0200238# include <sys/ioctl.h>
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100239#endif
240
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243/* make sure that the reentrant (gethostbyaddr_r etc)
244 functions are declared correctly if compiling with
245 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000249#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000252#undef _XOPEN_SOURCE
253#include <sys/socket.h>
254#include <sys/types.h>
255#include <netinet/in.h>
256#ifdef _SS_ALIGNSIZE
257#define HAVE_GETADDRINFO 1
258#define HAVE_GETNAMEINFO 1
259#endif
260
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000261#define HAVE_INET_PTON
262#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000263#endif
264
Benjamin Peterson06930632017-09-04 16:36:05 -0700265/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100266#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000267#define INET_ADDRSTRLEN 16
268#endif
269
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700275#ifdef HAVE_SYS_SOCKET_H
276#include <sys/socket.h>
277#endif
278
279#ifdef HAVE_NET_IF_H
280#include <net/if.h>
281#endif
282
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000283/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000285#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286
287/* Addressing includes */
288
Guido van Rossum6f489d91996-06-28 20:15:15 +0000289#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Non-MS WINDOWS includes */
292# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000293# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000294
Guido van Rossum9376b741999-09-15 22:01:40 +0000295/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000297
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000300#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000303# ifdef HAVE_FCNTL_H
304# include <fcntl.h>
305# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100307/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
308#ifdef MS_WINDOWS
309#define IPPROTO_ICMP IPPROTO_ICMP
310#define IPPROTO_IGMP IPPROTO_IGMP
311#define IPPROTO_GGP IPPROTO_GGP
312#define IPPROTO_TCP IPPROTO_TCP
313#define IPPROTO_PUP IPPROTO_PUP
314#define IPPROTO_UDP IPPROTO_UDP
315#define IPPROTO_IDP IPPROTO_IDP
316#define IPPROTO_ND IPPROTO_ND
317#define IPPROTO_RAW IPPROTO_RAW
318#define IPPROTO_MAX IPPROTO_MAX
319#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
320#define IPPROTO_IPV4 IPPROTO_IPV4
321#define IPPROTO_IPV6 IPPROTO_IPV6
322#define IPPROTO_ROUTING IPPROTO_ROUTING
323#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
324#define IPPROTO_ESP IPPROTO_ESP
325#define IPPROTO_AH IPPROTO_AH
326#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
327#define IPPROTO_NONE IPPROTO_NONE
328#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
329#define IPPROTO_EGP IPPROTO_EGP
330#define IPPROTO_PIM IPPROTO_PIM
331#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
332#define IPPROTO_ST IPPROTO_ST // WinSock2 only
333#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
334#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
335#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
336#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
337#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
338#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
339#endif /* MS_WINDOWS */
340
Steve Dower65e4cb12014-11-22 12:54:57 -0800341/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200342#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600343// For if_nametoindex() and if_indextoname()
344#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800345
animalize19e7d482018-02-27 02:10:36 +0800346/* remove some flags on older version Windows during run-time.
347 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
348typedef struct {
349 DWORD build_number; /* available starting with this Win10 BuildNumber */
350 const char flag_name[20];
351} FlagRuntimeInfo;
352
353/* IMPORTANT: make sure the list ordered by descending build_number */
354static FlagRuntimeInfo win_runtime_flags[] = {
355 /* available starting with Windows 10 1709 */
356 {16299, "TCP_KEEPIDLE"},
357 {16299, "TCP_KEEPINTVL"},
358 /* available starting with Windows 10 1703 */
359 {15063, "TCP_KEEPCNT"},
360 /* available starting with Windows 10 1607 */
361 {14393, "TCP_FASTOPEN"}
362};
363
364static void
365remove_unusable_flags(PyObject *m)
366{
367 PyObject *dict;
368 OSVERSIONINFOEX info;
369 DWORDLONG dwlConditionMask;
370
371 dict = PyModule_GetDict(m);
372 if (dict == NULL) {
373 return;
374 }
375
376 /* set to Windows 10, except BuildNumber. */
377 memset(&info, 0, sizeof(info));
378 info.dwOSVersionInfoSize = sizeof(info);
379 info.dwMajorVersion = 10;
380 info.dwMinorVersion = 0;
381
382 /* set Condition Mask */
383 dwlConditionMask = 0;
384 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
385 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
386 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
387
388 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
389 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100390 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800391 Compatibility Mode will not cheat VerifyVersionInfo(...) */
392 if (VerifyVersionInfo(
393 &info,
394 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
395 dwlConditionMask)) {
396 break;
397 }
398 else {
399 if (PyDict_GetItemString(
400 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200401 win_runtime_flags[i].flag_name) != NULL)
402 {
403 if (PyDict_DelItemString(
404 dict,
405 win_runtime_flags[i].flag_name))
406 {
407 PyErr_Clear();
408 }
animalize19e7d482018-02-27 02:10:36 +0800409 }
410 }
411 }
412}
413
Jeremy Hylton22308652001-02-02 03:23:09 +0000414#endif
415
Skip Montanaro7befb992004-02-10 16:50:21 +0000416#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000417
Neal Norwitz39d22e52002-11-02 19:55:21 +0000418#ifndef O_NONBLOCK
419# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000420#endif
421
Trent Micka708d6e2004-09-07 17:48:26 +0000422/* include Python's addrinfo.h unless it causes trouble */
423#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
424 /* Do not include addinfo.h on some newer IRIX versions.
425 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
426 * for example, but not by 6.5.10.
427 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000428#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000429 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
430 * EAI_* constants are defined in (the already included) ws2tcpip.h.
431 */
432#else
433# include "addrinfo.h"
434#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000435
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000436#ifdef __APPLE__
437/* On OS X, getaddrinfo returns no error indication of lookup
438 failure, so we must use the emulation instead of the libinfo
439 implementation. Unfortunately, performing an autoconf test
440 for this bug would require DNS access for the machine performing
441 the configuration, which is not acceptable. Therefore, we
442 determine the bug just by checking for __APPLE__. If this bug
443 gets ever fixed, perhaps checking for sys/version.h would be
444 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000445#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600446/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000447 Find to check for Jaguar is that it has getnameinfo(), which
448 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000449#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000450#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000451
452#ifdef HAVE_INET_ATON
453#define USE_INET_ATON_WEAKLINK
454#endif
455
Jack Jansen84262fb2002-07-02 14:40:42 +0000456#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000457
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000458/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000459#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000460/* avoid clashes with the C library definition of the symbol. */
461#define getaddrinfo fake_getaddrinfo
462#define gai_strerror fake_gai_strerror
463#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000464#include "getaddrinfo.c"
465#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000466#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000467#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000468#include "getnameinfo.c"
469#endif
470
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000471#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000472#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000473#endif
474
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000475#ifdef MS_WIN32
Miss Islington (bot)b498c7f2020-06-15 13:20:10 -0700476# undef EAFNOSUPPORT
477# define EAFNOSUPPORT WSAEAFNOSUPPORT
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000478#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000479
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000480#ifndef SOCKETCLOSE
Miss Islington (bot)b498c7f2020-06-15 13:20:10 -0700481# define SOCKETCLOSE close
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000482#endif
483
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000484#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000485#define USE_BLUETOOTH 1
486#if defined(__FreeBSD__)
487#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
488#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000489#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000490#define SOL_HCI SOL_HCI_RAW
491#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000492#define sockaddr_l2 sockaddr_l2cap
493#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000494#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000495#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
496#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000497#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000498#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000499#define sockaddr_l2 sockaddr_bt
500#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000501#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000502#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000503#define SOL_HCI BTPROTO_HCI
504#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000505#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
506#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000507#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000508#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000509#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000510#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
511#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000512#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000513#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
514#endif
515#endif
516
Greg Bowser8fbece12019-08-02 16:29:52 -0400517#ifdef MS_WINDOWS
518#define sockaddr_rc SOCKADDR_BTH_REDEF
519
520#define USE_BLUETOOTH 1
521#define AF_BLUETOOTH AF_BTH
522#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
523#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
524#endif
525
Charles-François Natali8b759652011-12-23 16:44:51 +0100526/* Convert "sock_addr_t *" to "struct sockaddr *". */
527#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000528
Martin v. Löwise9416172003-05-03 10:12:45 +0000529/*
530 * Constants for getnameinfo()
531 */
532#if !defined(NI_MAXHOST)
533#define NI_MAXHOST 1025
534#endif
535#if !defined(NI_MAXSERV)
536#define NI_MAXSERV 32
537#endif
538
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000539#ifndef INVALID_SOCKET /* MS defines this */
540#define INVALID_SOCKET (-1)
541#endif
542
Charles-François Natali0cc86852013-09-13 19:53:08 +0200543#ifndef INADDR_NONE
544#define INADDR_NONE (-1)
545#endif
546
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000547/* XXX There's a problem here: *static* functions are not supposed to have
548 a Py prefix (or use CapitalizedWords). Later... */
549
Guido van Rossum30a685f1991-06-27 15:51:29 +0000550/* Global variable holding the exception type for errors detected
551 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000552static PyObject *socket_herror;
553static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000554static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555
Tim Peters643a7fc2002-02-17 04:13:21 +0000556/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000557 The sock_type variable contains pointers to various functions,
558 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000559 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000560static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000561
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000562#if defined(HAVE_POLL_H)
563#include <poll.h>
564#elif defined(HAVE_SYS_POLL_H)
565#include <sys/poll.h>
566#endif
567
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000568/* Largest value to try to store in a socklen_t (used when handling
569 ancillary data). POSIX requires socklen_t to hold at least
570 (2**31)-1 and recommends against storing larger values, but
571 socklen_t was originally int in the BSD interface, so to be on the
572 safe side we use the smaller of (2**31)-1 and INT_MAX. */
573#if INT_MAX > 0x7fffffff
574#define SOCKLEN_T_LIMIT 0x7fffffff
575#else
576#define SOCKLEN_T_LIMIT INT_MAX
577#endif
578
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200579#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000580/* Instead of select(), we'll use poll() since poll() works on any fd. */
581#define IS_SELECTABLE(s) 1
582/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000583#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200584/* If there's no timeout left, we don't have to call select, so it's a safe,
585 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100586#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000587#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000588
589static PyObject*
590select_error(void)
591{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200592 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000594}
595
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000596#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000597#ifndef WSAEAGAIN
598#define WSAEAGAIN WSAEWOULDBLOCK
599#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000600#define CHECK_ERRNO(expected) \
601 (WSAGetLastError() == WSA ## expected)
602#else
603#define CHECK_ERRNO(expected) \
604 (errno == expected)
605#endif
606
Victor Stinnerdaf45552013-08-28 00:53:59 +0200607#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200608# define GET_SOCK_ERROR WSAGetLastError()
609# define SET_SOCK_ERROR(err) WSASetLastError(err)
610# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
611# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
612#else
613# define GET_SOCK_ERROR errno
614# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
615# define SOCK_TIMEOUT_ERR EWOULDBLOCK
616# define SOCK_INPROGRESS_ERR EINPROGRESS
617#endif
618
Erik Janssens874809e2018-09-05 08:29:42 +0200619#ifdef _MSC_VER
620# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
621#else
622# define SUPPRESS_DEPRECATED_CALL
623#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200624
625#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200626/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
627static int support_wsa_no_inherit = -1;
628#endif
629
Guido van Rossum30a685f1991-06-27 15:51:29 +0000630/* Convenience function to raise an error according to errno
631 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632
Guido van Rossum73624e91994-10-10 17:59:00 +0000633static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000634set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000635{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000636#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 int err_no = WSAGetLastError();
638 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
639 recognizes the error codes used by both GetLastError() and
640 WSAGetLastError */
641 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200642 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000643#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000644
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200645 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000646}
647
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000650set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653
654#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600655 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000656#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 if (v != NULL) {
660 PyErr_SetObject(socket_herror, v);
661 Py_DECREF(v);
662 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000665}
666
667
668static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000669set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672
Martin v. Löwis272cb402002-03-01 08:31:07 +0000673#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* EAI_SYSTEM is not available on Windows XP. */
675 if (error == EAI_SYSTEM)
676 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000677#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000679#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (v != NULL) {
685 PyErr_SetObject(socket_gaierror, v);
686 Py_DECREF(v);
687 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690}
691
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000692/* Function to perform the setting of socket blocking mode
693 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694static int
695internal_setblocking(PySocketSockObject *s, int block)
696{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400697 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200698#ifdef MS_WINDOWS
699 u_long arg;
700#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100701#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100702 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100703 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000704#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000707#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100708#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200710 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400711 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200714 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400715 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100717 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 else
Victor Stinner9a954832013-12-04 00:41:24 +0100719 new_delay_flag = delay_flag | O_NONBLOCK;
720 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200721 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400722 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100723#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000724#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200725 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200726 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400727 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400729
730 result = 0;
731
732 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000734
Yury Selivanovfa22b292016-10-18 16:03:52 -0400735 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200736#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400737 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200738#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400739 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200740#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400741 }
742
743 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000744}
745
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000746static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200747internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
748 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100751#ifdef HAVE_POLL
752 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200753 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100754#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200755 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200756 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100757#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000758
Victor Stinnerb7df3142015-03-27 22:59:32 +0100759 /* must be called with the GIL held */
760 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100761
Victor Stinner416f2e62015-03-31 13:56:29 +0200762 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200763 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200766 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 /* Prefer poll, if available, since you can poll() any fd
770 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100772 pollfd.fd = s->sock_fd;
773 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 if (connect) {
775 /* On Windows, the socket becomes writable on connection success,
776 but a connection failure is notified as an error. On POSIX, the
777 socket becomes writable on connection success or on connection
778 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200779 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000781
Victor Stinner71694d52015-03-28 01:18:54 +0100782 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200783 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200784 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000785
Artem Khramov28146202019-08-15 03:21:48 +0600786 /* On some OSes, typically BSD-based ones, the timeout parameter of the
787 poll() syscall, when negative, must be exactly INFTIM, where defined,
788 or -1. See issue 37811. */
789 if (ms < 0) {
790#ifdef INFTIM
791 ms = INFTIM;
792#else
793 ms = -1;
794#endif
795 }
796
Victor Stinner71694d52015-03-28 01:18:54 +0100797 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200798 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100799 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000800#else
Victor Stinnerced11742015-04-09 10:27:25 +0200801 if (interval >= 0) {
802 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
803 tvp = &tv;
804 }
805 else
806 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000807
Victor Stinner71694d52015-03-28 01:18:54 +0100808 FD_ZERO(&fds);
809 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200810 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 if (connect) {
812 /* On Windows, the socket becomes writable on connection success,
813 but a connection failure is notified as an error. On POSIX, the
814 socket becomes writable on connection success or on connection
815 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200816 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 }
Victor Stinner71694d52015-03-28 01:18:54 +0100818
819 /* See if the socket is ready */
820 Py_BEGIN_ALLOW_THREADS;
821 if (writing)
822 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200823 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100824 else
825 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200826 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100827 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000828#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 if (n < 0)
831 return -1;
832 if (n == 0)
833 return 1;
834 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000835}
836
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000838
Victor Stinner81c41db2015-04-02 11:50:57 +0200839 On error, raise an exception and return -1 if err is set, or fill err and
840 return -1 otherwise. If a signal was received and the signal handler raised
841 an exception, return -1, and set err to -1 if err is set.
842
843 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100844
Victor Stinner31bf2d52015-04-01 21:57:09 +0200845 If the socket has a timeout, wait until the socket is ready before calling
846 the function: wait until the socket is writable if writing is nonzero, wait
847 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100848
Victor Stinner81c41db2015-04-02 11:50:57 +0200849 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850 the function, except if the signal handler raised an exception (PEP 475).
851
852 When the function is retried, recompute the timeout using a monotonic clock.
853
Victor Stinner81c41db2015-04-02 11:50:57 +0200854 sock_call_ex() must be called with the GIL held. The socket function is
855 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200856static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200857sock_call_ex(PySocketSockObject *s,
858 int writing,
859 int (*sock_func) (PySocketSockObject *s, void *data),
860 void *data,
861 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200862 int *err,
863 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200864{
Victor Stinner8912d142015-04-06 23:16:34 +0200865 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200866 _PyTime_t deadline = 0;
867 int deadline_initialized = 0;
868 int res;
869
870 /* sock_call() must be called with the GIL held. */
871 assert(PyGILState_Check());
872
873 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200875 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 /* For connect(), poll even for blocking socket. The connection
877 runs asynchronously. */
878 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200879 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200880 _PyTime_t interval;
881
Victor Stinner81c41db2015-04-02 11:50:57 +0200882 if (deadline_initialized) {
883 /* recompute the timeout */
884 interval = deadline - _PyTime_GetMonotonicClock();
885 }
886 else {
887 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200888 deadline = _PyTime_GetMonotonicClock() + timeout;
889 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200890 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891
Victor Stinner10550cd2015-04-03 13:22:27 +0200892 if (interval >= 0)
893 res = internal_select(s, writing, interval, connect);
894 else
895 res = 1;
896 }
897 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200898 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200899 }
900
Victor Stinner31bf2d52015-04-01 21:57:09 +0200901 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200902 if (err)
903 *err = GET_SOCK_ERROR;
904
Victor Stinner31bf2d52015-04-01 21:57:09 +0200905 if (CHECK_ERRNO(EINTR)) {
906 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200907 if (PyErr_CheckSignals()) {
908 if (err)
909 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200910 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200911 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200912
913 /* retry select() */
914 continue;
915 }
916
917 /* select() failed */
918 s->errorhandler();
919 return -1;
920 }
921
922 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200923 if (err)
924 *err = SOCK_TIMEOUT_ERR;
925 else
926 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200927 return -1;
928 }
929
930 /* the socket is ready */
931 }
932
Victor Stinner81c41db2015-04-02 11:50:57 +0200933 /* inner loop to retry sock_func() when sock_func() is interrupted
934 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200935 while (1) {
936 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200937 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200938 Py_END_ALLOW_THREADS
939
940 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200941 /* sock_func() succeeded */
942 if (err)
943 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200944 return 0;
945 }
946
Victor Stinner81c41db2015-04-02 11:50:57 +0200947 if (err)
948 *err = GET_SOCK_ERROR;
949
Victor Stinner31bf2d52015-04-01 21:57:09 +0200950 if (!CHECK_ERRNO(EINTR))
951 break;
952
Victor Stinner81c41db2015-04-02 11:50:57 +0200953 /* sock_func() was interrupted by a signal */
954 if (PyErr_CheckSignals()) {
955 if (err)
956 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200957 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200958 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200959
Victor Stinner81c41db2015-04-02 11:50:57 +0200960 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200961 }
962
963 if (s->sock_timeout > 0
964 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200965 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200966
967 For example, select() could indicate a socket is ready for
968 reading, but the data then discarded by the OS because of a
969 wrong checksum.
970
971 Loop on select() to recheck for socket readyness. */
972 continue;
973 }
974
Victor Stinner81c41db2015-04-02 11:50:57 +0200975 /* sock_func() failed */
976 if (!err)
977 s->errorhandler();
978 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000979 return -1;
980 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200981}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000982
Victor Stinner81c41db2015-04-02 11:50:57 +0200983static int
984sock_call(PySocketSockObject *s,
985 int writing,
986 int (*func) (PySocketSockObject *s, void *data),
987 void *data)
988{
Victor Stinner8912d142015-04-06 23:16:34 +0200989 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200990}
991
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000992
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000993/* Initialize a new socket object. */
994
Victor Stinner88ed6402015-04-09 10:23:12 +0200995/* Default timeout for new sockets */
996static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000997
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200998static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000999init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 s->sock_fd = fd;
1003 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -05001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -05001006
1007 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
1008 on some OSes as part of socket.type. We want to reset them here,
1009 to make socket.type be set to the same value on all platforms.
1010 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
1011 not portable.
1012 */
1013#ifdef SOCK_NONBLOCK
1014 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
1015#endif
1016#ifdef SOCK_CLOEXEC
1017 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1018#endif
1019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001023#ifdef SOCK_NONBLOCK
1024 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001025 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001026 else
1027#endif
1028 {
1029 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001030 if (defaulttimeout >= 0) {
1031 if (internal_setblocking(s, 0) == -1) {
1032 return -1;
1033 }
1034 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001035 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001036 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001037}
1038
1039
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040/* Create a new socket object.
1041 This just creates the object and initializes it.
1042 If the creation fails, return NULL and set an exception (implicit
1043 in NEWOBJ()). */
1044
Guido van Rossum73624e91994-10-10 17:59:00 +00001045static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001046new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 PySocketSockObject *s;
1049 s = (PySocketSockObject *)
1050 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001051 if (s == NULL)
1052 return NULL;
1053 if (init_sockobject(s, fd, family, type, proto) == -1) {
1054 Py_DECREF(s);
1055 return NULL;
1056 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058}
1059
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060
Guido van Rossum48a680c2001-03-02 06:34:14 +00001061/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001062 thread to be in gethostbyname or getaddrinfo */
1063#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001064static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001065#endif
1066
1067
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068/* Convert a string specifying a host name or one of a few symbolic
1069 names to a numeric IP address. This usually calls gethostbyname()
1070 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001071 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072 an error occurred; then an exception is raised. */
1073
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001074static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001075setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 struct addrinfo hints, *res;
1078 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1081 if (name[0] == '\0') {
1082 int siz;
1083 memset(&hints, 0, sizeof(hints));
1084 hints.ai_family = af;
1085 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1086 hints.ai_flags = AI_PASSIVE;
1087 Py_BEGIN_ALLOW_THREADS
1088 ACQUIRE_GETADDRINFO_LOCK
1089 error = getaddrinfo(NULL, "0", &hints, &res);
1090 Py_END_ALLOW_THREADS
1091 /* We assume that those thread-unsafe getaddrinfo() versions
1092 *are* safe regarding their return value, ie. that a
1093 subsequent call to getaddrinfo() does not destroy the
1094 outcome of the first call. */
1095 RELEASE_GETADDRINFO_LOCK
1096 if (error) {
1097 set_gaierror(error);
1098 return -1;
1099 }
1100 switch (res->ai_family) {
1101 case AF_INET:
1102 siz = 4;
1103 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001104#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 case AF_INET6:
1106 siz = 16;
1107 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 default:
1110 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001111 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 "unsupported address family");
1113 return -1;
1114 }
1115 if (res->ai_next) {
1116 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001117 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 "wildcard resolved to multiple address");
1119 return -1;
1120 }
1121 if (res->ai_addrlen < addr_ret_size)
1122 addr_ret_size = res->ai_addrlen;
1123 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1124 freeaddrinfo(res);
1125 return siz;
1126 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001127 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001128 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001129 if (strcmp(name, "255.255.255.255") == 0 ||
1130 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 struct sockaddr_in *sin;
1132 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001133 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 "address family mismatched");
1135 return -1;
1136 }
1137 sin = (struct sockaddr_in *)addr_ret;
1138 memset((void *) sin, '\0', sizeof(*sin));
1139 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001140#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001142#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 sin->sin_addr.s_addr = INADDR_BROADCAST;
1144 return sizeof(sin->sin_addr);
1145 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001146
1147 /* avoid a name resolution in case of numeric address */
1148#ifdef HAVE_INET_PTON
1149 /* check for an IPv4 address */
1150 if (af == AF_UNSPEC || af == AF_INET) {
1151 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1152 memset(sin, 0, sizeof(*sin));
1153 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1154 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001155#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001156 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001157#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001158 return 4;
1159 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001161#ifdef ENABLE_IPV6
1162 /* check for an IPv6 address - if the address contains a scope ID, we
1163 * fallback to getaddrinfo(), which can handle translation from interface
1164 * name to interface index */
1165 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1166 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1167 memset(sin, 0, sizeof(*sin));
1168 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1169 sin->sin6_family = AF_INET6;
1170#ifdef HAVE_SOCKADDR_SA_LEN
1171 sin->sin6_len = sizeof(*sin);
1172#endif
1173 return 16;
1174 }
1175 }
1176#endif /* ENABLE_IPV6 */
1177#else /* HAVE_INET_PTON */
1178 /* check for an IPv4 address */
1179 if (af == AF_INET || af == AF_UNSPEC) {
1180 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1181 memset(sin, 0, sizeof(*sin));
1182 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1183 sin->sin_family = AF_INET;
1184#ifdef HAVE_SOCKADDR_SA_LEN
1185 sin->sin_len = sizeof(*sin);
1186#endif
1187 return 4;
1188 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001189 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001190#endif /* HAVE_INET_PTON */
1191
1192 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 memset(&hints, 0, sizeof(hints));
1194 hints.ai_family = af;
1195 Py_BEGIN_ALLOW_THREADS
1196 ACQUIRE_GETADDRINFO_LOCK
1197 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001198#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 if (error == EAI_NONAME && af == AF_UNSPEC) {
1200 /* On Tru64 V5.1, numeric-to-addr conversion fails
1201 if no address family is given. Assume IPv4 for now.*/
1202 hints.ai_family = AF_INET;
1203 error = getaddrinfo(name, NULL, &hints, &res);
1204 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 Py_END_ALLOW_THREADS
1207 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1208 if (error) {
1209 set_gaierror(error);
1210 return -1;
1211 }
1212 if (res->ai_addrlen < addr_ret_size)
1213 addr_ret_size = res->ai_addrlen;
1214 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1215 freeaddrinfo(res);
1216 switch (addr_ret->sa_family) {
1217 case AF_INET:
1218 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001219#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 case AF_INET6:
1221 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001224 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 return -1;
1226 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001227}
1228
Guido van Rossum30a685f1991-06-27 15:51:29 +00001229
Коренберг Марк7766b962018-02-13 00:47:42 +05001230/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
Guido van Rossum73624e91994-10-10 17:59:00 +00001232static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001233make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001234{
Коренберг Марк7766b962018-02-13 00:47:42 +05001235 char buf[INET_ADDRSTRLEN];
1236 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1237 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 return NULL;
1239 }
1240 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001241}
1242
Коренберг Марк7766b962018-02-13 00:47:42 +05001243#ifdef ENABLE_IPV6
1244/* Convert IPv6 sockaddr to a Python str. */
1245
1246static PyObject *
1247make_ipv6_addr(const struct sockaddr_in6 *addr)
1248{
1249 char buf[INET6_ADDRSTRLEN];
1250 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1251 PyErr_SetFromErrno(PyExc_OSError);
1252 return NULL;
1253 }
1254 return PyUnicode_FromString(buf);
1255}
1256#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258#ifdef USE_BLUETOOTH
1259/* Convert a string representation of a Bluetooth address into a numeric
1260 address. Returns the length (6), or raises an exception and returns -1 if
1261 an error occurred. */
1262
1263static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001264setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 unsigned int b0, b1, b2, b3, b4, b5;
1267 char ch;
1268 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1271 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1272 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001273
1274#ifdef MS_WINDOWS
1275 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1276 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1277 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1278 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1279 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1280 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1281#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 bdaddr->b[0] = b0;
1283 bdaddr->b[1] = b1;
1284 bdaddr->b[2] = b2;
1285 bdaddr->b[3] = b3;
1286 bdaddr->b[4] = b4;
1287 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001288#endif
1289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return 6;
1291 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001292 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 return -1;
1294 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295}
1296
1297/* Create a string representation of the Bluetooth address. This is always a
1298 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1299 value (zero padded if necessary). */
1300
1301static PyObject *
1302makebdaddr(bdaddr_t *bdaddr)
1303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001305
Greg Bowser8fbece12019-08-02 16:29:52 -04001306#ifdef MS_WINDOWS
1307 int i;
1308 unsigned int octets[6];
1309
1310 for (i = 0; i < 6; ++i) {
1311 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1312 }
1313
1314 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1315 octets[5], octets[4], octets[3],
1316 octets[2], octets[1], octets[0]);
1317#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1319 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1320 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001321#endif
1322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001324}
1325#endif
1326
1327
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328/* Create an object representing the given socket address,
1329 suitable for passing it back to bind(), connect() etc.
1330 The family field of the sockaddr structure is inspected
1331 to determine what kind of address it really is. */
1332
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001333/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001334static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001335makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 if (addrlen == 0) {
1338 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001339 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case AF_INET:
1345 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001346 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1347 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 PyObject *ret = NULL;
1349 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1351 Py_DECREF(addrobj);
1352 }
1353 return ret;
1354 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001355
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001356#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 case AF_UNIX:
1358 {
1359 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001360#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001361 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1362 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1363 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 }
1365 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001366#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 {
1368 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001369 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 }
1371 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001372#endif /* AF_UNIX */
1373
Martin v. Löwis11017b12006-01-14 18:12:57 +00001374#if defined(AF_NETLINK)
1375 case AF_NETLINK:
1376 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1378 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001379 }
1380#endif /* AF_NETLINK */
1381
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001382#if defined(AF_QIPCRTR)
1383 case AF_QIPCRTR:
1384 {
1385 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1386 return Py_BuildValue("II", a->sq_node, a->sq_port);
1387 }
1388#endif /* AF_QIPCRTR */
1389
caaveryeffc12f2017-09-06 18:18:10 -04001390#if defined(AF_VSOCK)
1391 case AF_VSOCK:
1392 {
1393 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1394 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1395 }
1396#endif /* AF_VSOCK */
1397
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001398#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 case AF_INET6:
1400 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001401 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1402 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 PyObject *ret = NULL;
1404 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001405 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 addrobj,
1407 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001408 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 a->sin6_scope_id);
1410 Py_DECREF(addrobj);
1411 }
1412 return ret;
1413 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001414#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001415
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001416#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 case AF_BLUETOOTH:
1418 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001419
Greg Bowser8fbece12019-08-02 16:29:52 -04001420#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 case BTPROTO_L2CAP:
1422 {
1423 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1424 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1425 PyObject *ret = NULL;
1426 if (addrobj) {
1427 ret = Py_BuildValue("Oi",
1428 addrobj,
1429 _BT_L2_MEMB(a, psm));
1430 Py_DECREF(addrobj);
1431 }
1432 return ret;
1433 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001434
Greg Bowser8fbece12019-08-02 16:29:52 -04001435#endif /* BTPROTO_L2CAP */
1436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 case BTPROTO_RFCOMM:
1438 {
1439 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1440 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1441 PyObject *ret = NULL;
1442 if (addrobj) {
1443 ret = Py_BuildValue("Oi",
1444 addrobj,
1445 _BT_RC_MEMB(a, channel));
1446 Py_DECREF(addrobj);
1447 }
1448 return ret;
1449 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001450
Greg Bowser8fbece12019-08-02 16:29:52 -04001451#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 case BTPROTO_HCI:
1453 {
1454 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001455#if defined(__NetBSD__) || defined(__DragonFly__)
1456 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001457#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 PyObject *ret = NULL;
1459 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1460 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001461#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001463
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001464#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 case BTPROTO_SCO:
1466 {
1467 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1468 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1469 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001470#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001471#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 default:
1474 PyErr_SetString(PyExc_ValueError,
1475 "Unknown Bluetooth protocol");
1476 return NULL;
1477 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001478#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001479
Antoine Pitroub156a462010-10-27 20:13:57 +00001480#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 case AF_PACKET:
1482 {
1483 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001484 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 struct ifreq ifr;
1486 /* need to look up interface name give index */
1487 if (a->sll_ifindex) {
1488 ifr.ifr_ifindex = a->sll_ifindex;
1489 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1490 ifname = ifr.ifr_name;
1491 }
1492 return Py_BuildValue("shbhy#",
1493 ifname,
1494 ntohs(a->sll_protocol),
1495 a->sll_pkttype,
1496 a->sll_hatype,
1497 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001498 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001500#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001501
Christian Heimes043d6f62008-01-07 17:19:16 +00001502#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 case AF_TIPC:
1504 {
1505 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1506 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1507 return Py_BuildValue("IIIII",
1508 a->addrtype,
1509 a->addr.nameseq.type,
1510 a->addr.nameseq.lower,
1511 a->addr.nameseq.upper,
1512 a->scope);
1513 } else if (a->addrtype == TIPC_ADDR_NAME) {
1514 return Py_BuildValue("IIIII",
1515 a->addrtype,
1516 a->addr.name.name.type,
1517 a->addr.name.name.instance,
1518 a->addr.name.name.instance,
1519 a->scope);
1520 } else if (a->addrtype == TIPC_ADDR_ID) {
1521 return Py_BuildValue("IIIII",
1522 a->addrtype,
1523 a->addr.id.node,
1524 a->addr.id.ref,
1525 0,
1526 a->scope);
1527 } else {
1528 PyErr_SetString(PyExc_ValueError,
1529 "Invalid address type");
1530 return NULL;
1531 }
1532 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001533#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001534
Serhiy Storchakad3187152017-11-09 18:00:38 +02001535#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001536 case AF_CAN:
1537 {
1538 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001539 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001540 struct ifreq ifr;
1541 /* need to look up interface name given index */
1542 if (a->can_ifindex) {
1543 ifr.ifr_ifindex = a->can_ifindex;
1544 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1545 ifname = ifr.ifr_name;
1546 }
1547
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001548 switch (proto) {
1549#ifdef CAN_ISOTP
1550 case CAN_ISOTP:
1551 {
1552 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1553 ifname,
1554 a->can_addr.tp.rx_id,
1555 a->can_addr.tp.tx_id);
1556 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001557#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07001558#ifdef CAN_J1939
1559 case CAN_J1939:
1560 {
1561 return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1562 ifname,
1563 a->can_addr.j1939.name,
1564 a->can_addr.j1939.pgn,
1565 a->can_addr.j1939.addr);
1566 }
1567#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001568 default:
1569 {
bggardner954900a2019-09-12 06:02:48 -04001570 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001571 ifname);
1572 }
1573 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001574 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001575#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001576
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001577#ifdef PF_SYSTEM
1578 case PF_SYSTEM:
1579 switch(proto) {
1580#ifdef SYSPROTO_CONTROL
1581 case SYSPROTO_CONTROL:
1582 {
1583 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1584 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1585 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001586#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001587 default:
1588 PyErr_SetString(PyExc_ValueError,
1589 "Invalid address type");
1590 return 0;
1591 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001592#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001593
Christian Heimesdffa3942016-09-05 23:54:41 +02001594#ifdef HAVE_SOCKADDR_ALG
1595 case AF_ALG:
1596 {
1597 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1598 return Py_BuildValue("s#s#HH",
1599 a->salg_type,
1600 strnlen((const char*)a->salg_type,
1601 sizeof(a->salg_type)),
1602 a->salg_name,
1603 strnlen((const char*)a->salg_name,
1604 sizeof(a->salg_name)),
1605 a->salg_feat,
1606 a->salg_mask);
1607 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001608#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 default:
1613 /* If we don't know the address family, don't raise an
1614 exception -- return it as an (int, bytes) tuple. */
1615 return Py_BuildValue("iy#",
1616 addr->sa_family,
1617 addr->sa_data,
1618 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621}
1622
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1624 (in particular, numeric IP addresses). */
1625struct maybe_idna {
1626 PyObject *obj;
1627 char *buf;
1628};
1629
1630static void
1631idna_cleanup(struct maybe_idna *data)
1632{
1633 Py_CLEAR(data->obj);
1634}
1635
1636static int
1637idna_converter(PyObject *obj, struct maybe_idna *data)
1638{
1639 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001640 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001641 if (obj == NULL) {
1642 idna_cleanup(data);
1643 return 1;
1644 }
1645 data->obj = NULL;
1646 len = -1;
1647 if (PyBytes_Check(obj)) {
1648 data->buf = PyBytes_AsString(obj);
1649 len = PyBytes_Size(obj);
1650 }
1651 else if (PyByteArray_Check(obj)) {
1652 data->buf = PyByteArray_AsString(obj);
1653 len = PyByteArray_Size(obj);
1654 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001655 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001656 if (PyUnicode_READY(obj) == -1) {
1657 return 0;
1658 }
1659 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001660 data->buf = PyUnicode_DATA(obj);
1661 len = PyUnicode_GET_LENGTH(obj);
1662 }
1663 else {
1664 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1665 if (!obj2) {
1666 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1667 return 0;
1668 }
1669 assert(PyBytes_Check(obj2));
1670 data->obj = obj2;
1671 data->buf = PyBytes_AS_STRING(obj2);
1672 len = PyBytes_GET_SIZE(obj2);
1673 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001674 }
1675 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001676 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001677 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001678 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001679 }
1680 if (strlen(data->buf) != len) {
1681 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001682 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001683 return 0;
1684 }
1685 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001686}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001687
1688/* Parse a socket address argument according to the socket object's
1689 address family. Return 1 if the address was in the proper format,
1690 0 of not. The address is returned through addr_ret, its length
1691 through len_ret. */
1692
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001694getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001695 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001699#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 case AF_UNIX:
1701 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001702 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001703 int retval = 0;
1704
1705 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1706 allow embedded nulls on Linux. */
1707 if (PyUnicode_Check(args)) {
1708 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1709 return 0;
1710 }
1711 else
1712 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001713 if (!PyArg_Parse(args, "y*", &path)) {
1714 Py_DECREF(args);
1715 return retval;
1716 }
1717 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001718
Victor Stinnerd565fb92019-10-10 21:30:20 +02001719 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001720#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001721 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001723 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001724 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001726 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 }
1728 }
1729 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001730#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 {
1732 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001733 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001734 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001736 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001738 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 }
1740 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001741 memcpy(addr->sun_path, path.buf, path.len);
1742 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001743 retval = 1;
1744 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001745 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001746 Py_DECREF(args);
1747 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001749#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750
Martin v. Löwis11017b12006-01-14 18:12:57 +00001751#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 case AF_NETLINK:
1753 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001755 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (!PyTuple_Check(args)) {
1757 PyErr_Format(
1758 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001759 "%s(): AF_NETLINK address must be tuple, not %.500s",
1760 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 return 0;
1762 }
Oren Milman735171e2018-09-11 19:51:29 +03001763 if (!PyArg_ParseTuple(args,
1764 "II;AF_NETLINK address must be a pair "
1765 "(pid, groups)",
1766 &pid, &groups))
1767 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001769 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 addr->nl_family = AF_NETLINK;
1771 addr->nl_pid = pid;
1772 addr->nl_groups = groups;
1773 *len_ret = sizeof(*addr);
1774 return 1;
1775 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001776#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001777
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001778#if defined(AF_QIPCRTR)
1779 case AF_QIPCRTR:
1780 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001781 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001782 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001783 if (!PyTuple_Check(args)) {
1784 PyErr_Format(
1785 PyExc_TypeError,
1786 "getsockaddrarg: "
1787 "AF_QIPCRTR address must be tuple, not %.500s",
1788 Py_TYPE(args)->tp_name);
1789 return 0;
1790 }
1791 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1792 return 0;
1793 addr->sq_family = AF_QIPCRTR;
1794 addr->sq_node = node;
1795 addr->sq_port = port;
1796 *len_ret = sizeof(*addr);
1797 return 1;
1798 }
1799#endif /* AF_QIPCRTR */
1800
caaveryeffc12f2017-09-06 18:18:10 -04001801#if defined(AF_VSOCK)
1802 case AF_VSOCK:
1803 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001804 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001805 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001806 memset(addr, 0, sizeof(struct sockaddr_vm));
1807 if (!PyTuple_Check(args)) {
1808 PyErr_Format(
1809 PyExc_TypeError,
1810 "getsockaddrarg: "
1811 "AF_VSOCK address must be tuple, not %.500s",
1812 Py_TYPE(args)->tp_name);
1813 return 0;
1814 }
1815 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1816 return 0;
1817 addr->svm_family = s->sock_family;
1818 addr->svm_port = port;
1819 addr->svm_cid = cid;
1820 *len_ret = sizeof(*addr);
1821 return 1;
1822 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001823#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001824
1825
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001826#ifdef AF_RDS
1827 case AF_RDS:
1828 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001829#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 case AF_INET:
1832 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001833 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 int port, result;
1835 if (!PyTuple_Check(args)) {
1836 PyErr_Format(
1837 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001838 "%s(): AF_INET address must be tuple, not %.500s",
1839 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 return 0;
1841 }
Oren Milman735171e2018-09-11 19:51:29 +03001842 if (!PyArg_ParseTuple(args,
1843 "O&i;AF_INET address must be a pair "
1844 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001845 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001846 {
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;
Oren Milman735171e2018-09-11 19:51:29 +03001853 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001854 struct sockaddr_in* addr = &addrbuf->in;
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_INET);
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 }
1866 addr->sin_family = AF_INET;
1867 addr->sin_port = htons((short)port);
1868 *len_ret = sizeof *addr;
1869 return 1;
1870 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001871
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001872#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 case AF_INET6:
1874 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001875 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001876 int port, result;
1877 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 flowinfo = scope_id = 0;
1879 if (!PyTuple_Check(args)) {
1880 PyErr_Format(
1881 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001882 "%s(): AF_INET6 address must be tuple, not %.500s",
1883 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 return 0;
1885 }
Oren Milman735171e2018-09-11 19:51:29 +03001886 if (!PyArg_ParseTuple(args,
1887 "O&i|II;AF_INET6 address must be a tuple "
1888 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001889 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001890 &scope_id))
1891 {
1892 assert(PyErr_Occurred());
1893 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1894 PyErr_Format(PyExc_OverflowError,
1895 "%s(): port must be 0-65535.", caller);
1896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 return 0;
1898 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001899 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001900 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001902 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 if (result < 0)
1904 return 0;
1905 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001906 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001908 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 return 0;
1910 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001911 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001912 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001913 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001914 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001915 return 0;
1916 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 addr->sin6_family = s->sock_family;
1918 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001919 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 addr->sin6_scope_id = scope_id;
1921 *len_ret = sizeof *addr;
1922 return 1;
1923 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001924#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001925
Hye-Shik Chang81268602004-02-02 06:05:24 +00001926#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 case AF_BLUETOOTH:
1928 {
1929 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001930#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 case BTPROTO_L2CAP:
1932 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001933 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001934
Victor Stinnerd565fb92019-10-10 21:30:20 +02001935 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 memset(addr, 0, sizeof(struct sockaddr_l2));
1937 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1938 if (!PyArg_ParseTuple(args, "si", &straddr,
1939 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001940 PyErr_Format(PyExc_OSError,
1941 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 return 0;
1943 }
1944 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1945 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 *len_ret = sizeof *addr;
1948 return 1;
1949 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001950#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 case BTPROTO_RFCOMM:
1952 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001953 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001954 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1956 if (!PyArg_ParseTuple(args, "si", &straddr,
1957 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001958 PyErr_Format(PyExc_OSError,
1959 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 return 0;
1961 }
1962 if (setbdaddr(straddr, &_BT_RC_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 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001968#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 case BTPROTO_HCI:
1970 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001971 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001972#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001973 const char *straddr;
1974 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1975 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001976 PyErr_Format(PyExc_OSError, "%s: "
1977 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001978 return 0;
1979 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001980 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001981 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1982 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001983#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1985 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001986 PyErr_Format(PyExc_OSError,
1987 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 return 0;
1989 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001990#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 *len_ret = sizeof *addr;
1992 return 1;
1993 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001994#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 case BTPROTO_SCO:
1996 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001997 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001998
Victor Stinnerd565fb92019-10-10 21:30:20 +02001999 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
2001 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03002002 PyErr_Format(PyExc_OSError,
2003 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 return 0;
2005 }
2006 straddr = PyBytes_AS_STRING(args);
2007 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
2008 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 *len_ret = sizeof *addr;
2011 return 1;
2012 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002013#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002014#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 default:
Oren Milman735171e2018-09-11 19:51:29 +03002016 PyErr_Format(PyExc_OSError,
2017 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 return 0;
2019 }
2020 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002021#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002022
Antoine Pitroub156a462010-10-27 20:13:57 +00002023#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 case AF_PACKET:
2025 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002027 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 int protoNumber;
2029 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04002030 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002031 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 if (!PyTuple_Check(args)) {
2034 PyErr_Format(
2035 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002036 "%s(): AF_PACKET address must be tuple, not %.500s",
2037 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 return 0;
2039 }
Oren Milman735171e2018-09-11 19:51:29 +03002040 /* XXX: improve the default error message according to the
2041 documentation of AF_PACKET, which would be added as part
2042 of bpo-25041. */
2043 if (!PyArg_ParseTuple(args,
2044 "si|iiy*;AF_PACKET address must be a tuple of "
2045 "two to five elements",
2046 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002047 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002048 {
2049 assert(PyErr_Occurred());
2050 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2051 PyErr_Format(PyExc_OverflowError,
2052 "%s(): address argument out of range", caller);
2053 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002055 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2057 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2058 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2059 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002060 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 return 0;
2062 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002063 if (haddr.buf && haddr.len > 8) {
2064 PyErr_SetString(PyExc_ValueError,
2065 "Hardware address must be 8 bytes or less");
2066 PyBuffer_Release(&haddr);
2067 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 }
2069 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002070 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002072 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002073 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 return 0;
2075 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002076 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 addr->sll_family = AF_PACKET;
2078 addr->sll_protocol = htons((short)protoNumber);
2079 addr->sll_ifindex = ifr.ifr_ifindex;
2080 addr->sll_pkttype = pkttype;
2081 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002082 if (haddr.buf) {
2083 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2084 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002086 else
2087 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002089 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 return 1;
2091 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002092#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002093
Christian Heimes043d6f62008-01-07 17:19:16 +00002094#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 case AF_TIPC:
2096 {
2097 unsigned int atype, v1, v2, v3;
2098 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 if (!PyTuple_Check(args)) {
2101 PyErr_Format(
2102 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002103 "%s(): AF_TIPC address must be tuple, not %.500s",
2104 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 return 0;
2106 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002109 "IIII|I;AF_TIPC address must be a tuple "
2110 "(addr_type, v1, v2, v3[, scope])",
2111 &atype, &v1, &v2, &v3, &scope))
2112 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002114 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002115
Victor Stinnerd565fb92019-10-10 21:30:20 +02002116 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 addr->family = AF_TIPC;
2120 addr->scope = scope;
2121 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 if (atype == TIPC_ADDR_NAMESEQ) {
2124 addr->addr.nameseq.type = v1;
2125 addr->addr.nameseq.lower = v2;
2126 addr->addr.nameseq.upper = v3;
2127 } else if (atype == TIPC_ADDR_NAME) {
2128 addr->addr.name.name.type = v1;
2129 addr->addr.name.name.instance = v2;
2130 } else if (atype == TIPC_ADDR_ID) {
2131 addr->addr.id.node = v1;
2132 addr->addr.id.ref = v2;
2133 } else {
2134 /* Shouldn't happen */
2135 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2136 return 0;
2137 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 return 1;
2142 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002143#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002144
Serhiy Storchakad3187152017-11-09 18:00:38 +02002145#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002146 case AF_CAN:
2147 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002148#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002149 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002150 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002151#endif
2152#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002153 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002154#endif
2155#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002156 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002157 PyObject *interfaceName;
2158 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002159 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002160 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002161
Oren Milman735171e2018-09-11 19:51:29 +03002162 if (!PyTuple_Check(args)) {
2163 PyErr_Format(PyExc_TypeError,
2164 "%s(): AF_CAN address must be tuple, not %.500s",
2165 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002166 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002167 }
2168 if (!PyArg_ParseTuple(args,
2169 "O&;AF_CAN address must be a tuple "
2170 "(interface, )",
2171 PyUnicode_FSConverter, &interfaceName))
2172 {
2173 return 0;
2174 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002175
2176 len = PyBytes_GET_SIZE(interfaceName);
2177
2178 if (len == 0) {
2179 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002180 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002181 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2182 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002183 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2184 s->errorhandler();
2185 Py_DECREF(interfaceName);
2186 return 0;
2187 }
2188 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002189 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002190 "AF_CAN interface name too long");
2191 Py_DECREF(interfaceName);
2192 return 0;
2193 }
2194
2195 addr->can_family = AF_CAN;
2196 addr->can_ifindex = ifr.ifr_ifindex;
2197
2198 *len_ret = sizeof(*addr);
2199 Py_DECREF(interfaceName);
2200 return 1;
2201 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002202#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002203
2204#ifdef CAN_ISOTP
2205 case CAN_ISOTP:
2206 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002207 PyObject *interfaceName;
2208 struct ifreq ifr;
2209 Py_ssize_t len;
2210 unsigned long int rx_id, tx_id;
2211
Victor Stinnerd565fb92019-10-10 21:30:20 +02002212 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002213
2214 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2215 &interfaceName,
2216 &rx_id,
2217 &tx_id))
2218 return 0;
2219
2220 len = PyBytes_GET_SIZE(interfaceName);
2221
2222 if (len == 0) {
2223 ifr.ifr_ifindex = 0;
2224 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2225 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2226 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2227 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2228 s->errorhandler();
2229 Py_DECREF(interfaceName);
2230 return 0;
2231 }
2232 } else {
2233 PyErr_SetString(PyExc_OSError,
2234 "AF_CAN interface name too long");
2235 Py_DECREF(interfaceName);
2236 return 0;
2237 }
2238
2239 addr->can_family = AF_CAN;
2240 addr->can_ifindex = ifr.ifr_ifindex;
2241 addr->can_addr.tp.rx_id = rx_id;
2242 addr->can_addr.tp.tx_id = tx_id;
2243
2244 *len_ret = sizeof(*addr);
2245 Py_DECREF(interfaceName);
2246 return 1;
2247 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002248#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002249#ifdef CAN_J1939
2250 case CAN_J1939:
2251 {
2252 PyObject *interfaceName;
2253 struct ifreq ifr;
2254 Py_ssize_t len;
2255 uint64_t j1939_name;
2256 uint32_t j1939_pgn;
2257 uint8_t j1939_addr;
2258
2259 struct sockaddr_can *addr = &addrbuf->can;
2260
2261 if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2262 &interfaceName,
2263 &j1939_name,
2264 &j1939_pgn,
2265 &j1939_addr))
2266 return 0;
2267
2268 len = PyBytes_GET_SIZE(interfaceName);
2269
2270 if (len == 0) {
2271 ifr.ifr_ifindex = 0;
2272 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2273 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2274 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2275 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2276 s->errorhandler();
2277 Py_DECREF(interfaceName);
2278 return 0;
2279 }
2280 } else {
2281 PyErr_SetString(PyExc_OSError,
2282 "AF_CAN interface name too long");
2283 Py_DECREF(interfaceName);
2284 return 0;
2285 }
2286
2287 addr->can_family = AF_CAN;
2288 addr->can_ifindex = ifr.ifr_ifindex;
2289 addr->can_addr.j1939.name = j1939_name;
2290 addr->can_addr.j1939.pgn = j1939_pgn;
2291 addr->can_addr.j1939.addr = j1939_addr;
2292
2293 *len_ret = sizeof(*addr);
2294 Py_DECREF(interfaceName);
2295 return 1;
2296 }
2297#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002298 default:
Oren Milman735171e2018-09-11 19:51:29 +03002299 PyErr_Format(PyExc_OSError,
2300 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002301 return 0;
2302 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002303#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002304
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002305#ifdef PF_SYSTEM
2306 case PF_SYSTEM:
2307 switch (s->sock_proto) {
2308#ifdef SYSPROTO_CONTROL
2309 case SYSPROTO_CONTROL:
2310 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002311 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002312 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002313 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002314
2315 if (PyUnicode_Check(args)) {
2316 struct ctl_info info;
2317 PyObject *ctl_name;
2318
2319 if (!PyArg_Parse(args, "O&",
2320 PyUnicode_FSConverter, &ctl_name)) {
2321 return 0;
2322 }
2323
Victor Stinnerf50e1872015-03-20 11:32:24 +01002324 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002325 PyErr_SetString(PyExc_ValueError,
2326 "provided string is too long");
2327 Py_DECREF(ctl_name);
2328 return 0;
2329 }
2330 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2331 sizeof(info.ctl_name));
2332 Py_DECREF(ctl_name);
2333
2334 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2335 PyErr_SetString(PyExc_OSError,
2336 "cannot find kernel control with provided name");
2337 return 0;
2338 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002339
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002340 addr->sc_id = info.ctl_id;
2341 addr->sc_unit = 0;
2342 } else if (!PyArg_ParseTuple(args, "II",
2343 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002344 PyErr_Format(PyExc_TypeError,
2345 "%s(): PF_SYSTEM address must be a str or "
2346 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002347 return 0;
2348 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002349
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002350 *len_ret = sizeof(*addr);
2351 return 1;
2352 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002353#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002354 default:
Oren Milman735171e2018-09-11 19:51:29 +03002355 PyErr_Format(PyExc_OSError,
2356 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002357 return 0;
2358 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002359#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002360#ifdef HAVE_SOCKADDR_ALG
2361 case AF_ALG:
2362 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002363 const char *type;
2364 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002365 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002366
2367 memset(sa, 0, sizeof(*sa));
2368 sa->salg_family = AF_ALG;
2369
Oren Milman735171e2018-09-11 19:51:29 +03002370 if (!PyTuple_Check(args)) {
2371 PyErr_Format(PyExc_TypeError,
2372 "%s(): AF_ALG address must be tuple, not %.500s",
2373 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002374 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002375 }
2376 if (!PyArg_ParseTuple(args,
2377 "ss|HH;AF_ALG address must be a tuple "
2378 "(type, name[, feat[, mask]])",
2379 &type, &name, &sa->salg_feat, &sa->salg_mask))
2380 {
2381 return 0;
2382 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002383 /* sockaddr_alg has fixed-sized char arrays for type, and name
2384 * both must be NULL terminated.
2385 */
2386 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002387 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2388 return 0;
2389 }
2390 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002391 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002392 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2393 return 0;
2394 }
2395 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2396
2397 *len_ret = sizeof(*sa);
2398 return 1;
2399 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002400#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 default:
Oren Milman735171e2018-09-11 19:51:29 +03002405 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002409}
2410
Guido van Rossum30a685f1991-06-27 15:51:29 +00002411
Guido van Rossum48a680c2001-03-02 06:34:14 +00002412/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002413 Return 1 if the family is known, 0 otherwise. The length is returned
2414 through len_ret. */
2415
2416static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002417getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002420
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002421#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 case AF_UNIX:
2423 {
2424 *len_ret = sizeof (struct sockaddr_un);
2425 return 1;
2426 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002427#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002428
Martin v. Löwis11017b12006-01-14 18:12:57 +00002429#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002430 case AF_NETLINK:
2431 {
2432 *len_ret = sizeof (struct sockaddr_nl);
2433 return 1;
2434 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002435#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002436
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002437#if defined(AF_QIPCRTR)
2438 case AF_QIPCRTR:
2439 {
2440 *len_ret = sizeof (struct sockaddr_qrtr);
2441 return 1;
2442 }
2443#endif /* AF_QIPCRTR */
2444
caaveryeffc12f2017-09-06 18:18:10 -04002445#if defined(AF_VSOCK)
2446 case AF_VSOCK:
2447 {
2448 *len_ret = sizeof (struct sockaddr_vm);
2449 return 1;
2450 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002451#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002452
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002453#ifdef AF_RDS
2454 case AF_RDS:
2455 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002456#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 case AF_INET:
2459 {
2460 *len_ret = sizeof (struct sockaddr_in);
2461 return 1;
2462 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002463
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002464#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 case AF_INET6:
2466 {
2467 *len_ret = sizeof (struct sockaddr_in6);
2468 return 1;
2469 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002470#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002471
Hye-Shik Chang81268602004-02-02 06:05:24 +00002472#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 case AF_BLUETOOTH:
2474 {
2475 switch(s->sock_proto)
2476 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002477
Greg Bowser8fbece12019-08-02 16:29:52 -04002478#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 case BTPROTO_L2CAP:
2480 *len_ret = sizeof (struct sockaddr_l2);
2481 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002482#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 case BTPROTO_RFCOMM:
2484 *len_ret = sizeof (struct sockaddr_rc);
2485 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002486#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 case BTPROTO_HCI:
2488 *len_ret = sizeof (struct sockaddr_hci);
2489 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002490#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 case BTPROTO_SCO:
2492 *len_ret = sizeof (struct sockaddr_sco);
2493 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002494#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002495#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002497 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 "unknown BT protocol");
2499 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 }
2502 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002503#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002504
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002505#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 case AF_PACKET:
2507 {
2508 *len_ret = sizeof (struct sockaddr_ll);
2509 return 1;
2510 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002511#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002512
Christian Heimes043d6f62008-01-07 17:19:16 +00002513#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 case AF_TIPC:
2515 {
2516 *len_ret = sizeof (struct sockaddr_tipc);
2517 return 1;
2518 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002519#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002520
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002521#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002522 case AF_CAN:
2523 {
2524 *len_ret = sizeof (struct sockaddr_can);
2525 return 1;
2526 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002527#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002528
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002529#ifdef PF_SYSTEM
2530 case PF_SYSTEM:
2531 switch(s->sock_proto) {
2532#ifdef SYSPROTO_CONTROL
2533 case SYSPROTO_CONTROL:
2534 *len_ret = sizeof (struct sockaddr_ctl);
2535 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002536#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002537 default:
2538 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2539 "unknown PF_SYSTEM protocol");
2540 return 0;
2541 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002542#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002543#ifdef HAVE_SOCKADDR_ALG
2544 case AF_ALG:
2545 {
2546 *len_ret = sizeof (struct sockaddr_alg);
2547 return 1;
2548 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002549#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002554 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002558}
2559
2560
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002561/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2562 Currently, these methods are only compiled if the RFC 2292/3542
2563 CMSG_LEN() macro is available. Older systems seem to have used
2564 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2565 it may be possible to define CMSG_LEN() that way if it's not
2566 provided. Some architectures might need extra padding after the
2567 cmsghdr, however, and CMSG_LEN() would have to take account of
2568 this. */
2569#ifdef CMSG_LEN
2570/* If length is in range, set *result to CMSG_LEN(length) and return
2571 true; otherwise, return false. */
2572static int
2573get_CMSG_LEN(size_t length, size_t *result)
2574{
2575 size_t tmp;
2576
2577 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2578 return 0;
2579 tmp = CMSG_LEN(length);
2580 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2581 return 0;
2582 *result = tmp;
2583 return 1;
2584}
2585
2586#ifdef CMSG_SPACE
2587/* If length is in range, set *result to CMSG_SPACE(length) and return
2588 true; otherwise, return false. */
2589static int
2590get_CMSG_SPACE(size_t length, size_t *result)
2591{
2592 size_t tmp;
2593
2594 /* Use CMSG_SPACE(1) here in order to take account of the padding
2595 necessary before *and* after the data. */
2596 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2597 return 0;
2598 tmp = CMSG_SPACE(length);
2599 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2600 return 0;
2601 *result = tmp;
2602 return 1;
2603}
2604#endif
2605
2606/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2607 pointer in msg->msg_control with at least "space" bytes after it,
2608 and its cmsg_len member inside the buffer. */
2609static int
2610cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2611{
2612 size_t cmsg_offset;
2613 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2614 sizeof(cmsgh->cmsg_len));
2615
Charles-François Natali466517d2011-08-28 18:23:43 +02002616 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002617 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002618 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002619 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2620 annoying under OS X as it's unsigned there and so it triggers a
2621 tautological comparison warning under Clang when compared against 0.
2622 Since the check is valid on other platforms, silence the warning under
2623 Clang. */
2624 #ifdef __clang__
2625 #pragma clang diagnostic push
2626 #pragma clang diagnostic ignored "-Wtautological-compare"
2627 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002628 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002629 #pragma GCC diagnostic push
2630 #pragma GCC diagnostic ignored "-Wtype-limits"
2631 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002632 if (msg->msg_controllen < 0)
2633 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002634 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002635 #pragma GCC diagnostic pop
2636 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002637 #ifdef __clang__
2638 #pragma clang diagnostic pop
2639 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002640 if (space < cmsg_len_end)
2641 space = cmsg_len_end;
2642 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2643 return (cmsg_offset <= (size_t)-1 - space &&
2644 cmsg_offset + space <= msg->msg_controllen);
2645}
2646
2647/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2648 *space to number of bytes following it in the buffer and return
2649 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2650 msg->msg_controllen are valid. */
2651static int
2652get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2653{
2654 size_t data_offset;
2655 char *data_ptr;
2656
2657 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2658 return 0;
2659 data_offset = data_ptr - (char *)msg->msg_control;
2660 if (data_offset > msg->msg_controllen)
2661 return 0;
2662 *space = msg->msg_controllen - data_offset;
2663 return 1;
2664}
2665
2666/* If cmsgh is invalid or not contained in the buffer pointed to by
2667 msg->msg_control, return -1. If cmsgh is valid and its associated
2668 data is entirely contained in the buffer, set *data_len to the
2669 length of the associated data and return 0. If only part of the
2670 associated data is contained in the buffer but cmsgh is otherwise
2671 valid, set *data_len to the length contained in the buffer and
2672 return 1. */
2673static int
2674get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2675{
2676 size_t space, cmsg_data_len;
2677
2678 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2679 cmsgh->cmsg_len < CMSG_LEN(0))
2680 return -1;
2681 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2682 if (!get_cmsg_data_space(msg, cmsgh, &space))
2683 return -1;
2684 if (space >= cmsg_data_len) {
2685 *data_len = cmsg_data_len;
2686 return 0;
2687 }
2688 *data_len = space;
2689 return 1;
2690}
2691#endif /* CMSG_LEN */
2692
2693
Victor Stinner31bf2d52015-04-01 21:57:09 +02002694struct sock_accept {
2695 socklen_t *addrlen;
2696 sock_addr_t *addrbuf;
2697 SOCKET_T result;
2698};
2699
2700#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2701/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2702static int accept4_works = -1;
2703#endif
2704
2705static int
2706sock_accept_impl(PySocketSockObject *s, void *data)
2707{
2708 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002709 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2710 socklen_t *paddrlen = ctx->addrlen;
2711#ifdef HAVE_SOCKADDR_ALG
2712 /* AF_ALG does not support accept() with addr and raises
2713 * ECONNABORTED instead. */
2714 if (s->sock_family == AF_ALG) {
2715 addr = NULL;
2716 paddrlen = NULL;
2717 *ctx->addrlen = 0;
2718 }
2719#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002720
2721#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2722 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002723 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002724 SOCK_CLOEXEC);
2725 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2726 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2727 accept4_works = (errno != ENOSYS);
2728 }
2729 }
2730 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002731 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002732#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002733 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002734#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002735
2736#ifdef MS_WINDOWS
2737 return (ctx->result != INVALID_SOCKET);
2738#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002739 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002740#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002741}
2742
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002743/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002744
Guido van Rossum73624e91994-10-10 17:59:00 +00002745static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302746sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002747{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002749 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 socklen_t addrlen;
2751 PyObject *sock = NULL;
2752 PyObject *addr = NULL;
2753 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002754 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (!getsockaddrlen(s, &addrlen))
2757 return NULL;
2758 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 if (!IS_SELECTABLE(s))
2761 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002762
Victor Stinner31bf2d52015-04-01 21:57:09 +02002763 ctx.addrlen = &addrlen;
2764 ctx.addrbuf = &addrbuf;
2765 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002767 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002768
Victor Stinnerdaf45552013-08-28 00:53:59 +02002769#ifdef MS_WINDOWS
2770 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2771 PyErr_SetFromWindowsErr(0);
2772 SOCKETCLOSE(newfd);
2773 goto finally;
2774 }
2775#else
2776
2777#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2778 if (!accept4_works)
2779#endif
2780 {
2781 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2782 SOCKETCLOSE(newfd);
2783 goto finally;
2784 }
2785 }
2786#endif
2787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 sock = PyLong_FromSocket_t(newfd);
2789 if (sock == NULL) {
2790 SOCKETCLOSE(newfd);
2791 goto finally;
2792 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2795 addrlen, s->sock_proto);
2796 if (addr == NULL)
2797 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002800
Guido van Rossum67f7a382002-06-06 21:08:16 +00002801finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 Py_XDECREF(sock);
2803 Py_XDECREF(addr);
2804 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002805}
2806
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002807PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002808"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002809\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002810Wait for an incoming connection. Return a new socket file descriptor\n\
2811representing the connection, and the address of the client.\n\
2812For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002813
Guido van Rossum11ba0942002-06-13 15:07:44 +00002814/* s.setblocking(flag) method. Argument:
2815 False -- non-blocking mode; same as settimeout(0)
2816 True -- blocking mode; same as settimeout(None)
2817*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002818
Guido van Rossum73624e91994-10-10 17:59:00 +00002819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002820sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002821{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002822 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 block = PyLong_AsLong(arg);
2825 if (block == -1 && PyErr_Occurred())
2826 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Victor Stinner9001d802015-04-06 23:06:01 +02002828 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002829 if (internal_setblocking(s, block) == -1) {
2830 return NULL;
2831 }
2832 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002833}
Guido van Rossume4485b01994-09-07 14:32:49 +00002834
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002835PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002836"setblocking(flag)\n\
2837\n\
2838Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002839setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002841
Yury Selivanovf11b4602018-01-28 17:27:38 -05002842/* s.getblocking() method.
2843 Returns True if socket is in blocking mode,
2844 False if it is in non-blocking mode.
2845*/
2846static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302847sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002848{
2849 if (s->sock_timeout) {
2850 Py_RETURN_TRUE;
2851 }
2852 else {
2853 Py_RETURN_FALSE;
2854 }
2855}
2856
2857PyDoc_STRVAR(getblocking_doc,
2858"getblocking()\n\
2859\n\
2860Returns True if socket is in blocking mode, or False if it\n\
2861is in non-blocking mode.");
2862
Victor Stinner71694d52015-03-28 01:18:54 +01002863static int
2864socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2865{
2866#ifdef MS_WINDOWS
2867 struct timeval tv;
2868#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002869#ifndef HAVE_POLL
2870 _PyTime_t ms;
2871#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002872 int overflow = 0;
2873
2874 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002875 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002876 return 0;
2877 }
2878
Victor Stinner869e1772015-03-30 03:49:14 +02002879 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002880 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002881 return -1;
2882
2883 if (*timeout < 0) {
2884 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2885 return -1;
2886 }
2887
2888#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002889 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002890#endif
2891#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002892 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002893 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002894#endif
2895 if (overflow) {
2896 PyErr_SetString(PyExc_OverflowError,
2897 "timeout doesn't fit into C timeval");
2898 return -1;
2899 }
2900
2901 return 0;
2902}
2903
Guido van Rossum11ba0942002-06-13 15:07:44 +00002904/* s.settimeout(timeout) method. Argument:
2905 None -- no timeout, blocking mode; same as setblocking(True)
2906 0.0 -- non-blocking mode; same as setblocking(False)
2907 > 0 -- timeout mode; operations time out after timeout seconds
2908 < 0 -- illegal; raises an exception
2909*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002911sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002912{
Victor Stinner71694d52015-03-28 01:18:54 +01002913 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Victor Stinner71694d52015-03-28 01:18:54 +01002915 if (socket_parse_timeout(&timeout, arg) < 0)
2916 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002919
2920 int block = timeout < 0;
2921 /* Blocking mode for a Python socket object means that operations
2922 like :meth:`recv` or :meth:`sendall` will block the execution of
2923 the current thread until they are complete or aborted with a
2924 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2925 the underlying FD is in a blocking mode. When timeout is a positive
2926 number, the FD is in a non-blocking mode, and socket ops are
2927 implemented with a `select()` call.
2928
2929 When timeout is 0.0, the FD is in a non-blocking mode.
2930
2931 This table summarizes all states in which the socket object and
2932 its underlying FD can be:
2933
2934 ==================== ===================== ==============
2935 `gettimeout()` `getblocking()` FD
2936 ==================== ===================== ==============
2937 ``None`` ``True`` blocking
2938 ``0.0`` ``False`` non-blocking
2939 ``> 0`` ``True`` non-blocking
2940 */
2941
2942 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002943 return NULL;
2944 }
2945 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002946}
2947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002948PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002949"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002950\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002951Set a timeout on socket operations. 'timeout' can be a float,\n\
2952giving in seconds, or None. Setting a timeout of None disables\n\
2953the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002954Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002955
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002956/* s.gettimeout() method.
2957 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002958static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302959sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002960{
Victor Stinner71694d52015-03-28 01:18:54 +01002961 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002962 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 }
Victor Stinner71694d52015-03-28 01:18:54 +01002964 else {
2965 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2966 return PyFloat_FromDouble(seconds);
2967 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002968}
2969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002970PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002971"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002972\n\
oldkaa0735f2018-02-02 16:52:55 +08002973Returns the timeout in seconds (float) associated with socket\n\
2974operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002976
Guido van Rossumaee08791992-09-08 09:05:33 +00002977/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002978 With an integer third argument, sets an integer optval with optlen=4.
2979 With None as third argument and an integer fourth argument, set
2980 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002981 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002982 use optional built-in module 'struct' to encode the string.
2983*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002984
Guido van Rossum73624e91994-10-10 17:59:00 +00002985static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002986sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 int level;
2989 int optname;
2990 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002991 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002993 unsigned int optlen;
2994 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002995
caaveryeffc12f2017-09-06 18:18:10 -04002996#ifdef AF_VSOCK
2997 if (s->sock_family == AF_VSOCK) {
2998 uint64_t vflag; // Must be set width of 64 bits
2999 /* setsockopt(level, opt, flag) */
3000 if (PyArg_ParseTuple(args, "iiK:setsockopt",
3001 &level, &optname, &vflag)) {
3002 // level should always be set to AF_VSOCK
3003 res = setsockopt(s->sock_fd, level, optname,
3004 (void*)&vflag, sizeof vflag);
3005 goto done;
3006 }
3007 return NULL;
3008 }
3009#endif
3010
Christian Heimesdffa3942016-09-05 23:54:41 +02003011 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 if (PyArg_ParseTuple(args, "iii:setsockopt",
3013 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003014 res = setsockopt(s->sock_fd, level, optname,
3015 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02003016 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003018
3019 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02003020 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02003021 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
3022 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
3023 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01003024 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02003025 NULL, (socklen_t)optlen);
3026 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003028
3029 PyErr_Clear();
3030 /* setsockopt(level, opt, buffer) */
3031 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
3032 &level, &optname, &optval))
3033 return NULL;
3034
3035#ifdef MS_WINDOWS
3036 if (optval.len > INT_MAX) {
3037 PyBuffer_Release(&optval);
3038 PyErr_Format(PyExc_OverflowError,
3039 "socket option is larger than %i bytes",
3040 INT_MAX);
3041 return NULL;
3042 }
3043 res = setsockopt(s->sock_fd, level, optname,
3044 optval.buf, (int)optval.len);
3045#else
3046 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3047#endif
3048 PyBuffer_Release(&optval);
3049
3050done:
Victor Stinnercc739322016-03-23 21:35:29 +01003051 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003053 }
3054
3055 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003056}
3057
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003058PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003059"setsockopt(level, option, value: int)\n\
3060setsockopt(level, option, value: buffer)\n\
3061setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003062\n\
3063Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003064The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003065None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003066
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003067
Guido van Rossumaee08791992-09-08 09:05:33 +00003068/* s.getsockopt() method.
3069 With two arguments, retrieves an integer option.
3070 With a third integer argument, retrieves a string buffer of that size;
3071 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003072
Guido van Rossum73624e91994-10-10 17:59:00 +00003073static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003074sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 int level;
3077 int optname;
3078 int res;
3079 PyObject *buf;
3080 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003081 int flag = 0;
3082 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3085 &level, &optname, &buflen))
3086 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003089#ifdef AF_VSOCK
3090 if (s->sock_family == AF_VSOCK) {
3091 uint64_t vflag = 0; // Must be set width of 64 bits
3092 flagsize = sizeof vflag;
3093 res = getsockopt(s->sock_fd, level, optname,
3094 (void *)&vflag, &flagsize);
3095 if (res < 0)
3096 return s->errorhandler();
3097 return PyLong_FromUnsignedLong(vflag);
3098 }
3099#endif
3100 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 res = getsockopt(s->sock_fd, level, optname,
3102 (void *)&flag, &flagsize);
3103 if (res < 0)
3104 return s->errorhandler();
3105 return PyLong_FromLong(flag);
3106 }
caaveryeffc12f2017-09-06 18:18:10 -04003107#ifdef AF_VSOCK
3108 if (s->sock_family == AF_VSOCK) {
3109 PyErr_SetString(PyExc_OSError,
3110 "getsockopt string buffer not allowed");
3111 return NULL;
3112 }
3113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003115 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 "getsockopt buflen out of range");
3117 return NULL;
3118 }
3119 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3120 if (buf == NULL)
3121 return NULL;
3122 res = getsockopt(s->sock_fd, level, optname,
3123 (void *)PyBytes_AS_STRING(buf), &buflen);
3124 if (res < 0) {
3125 Py_DECREF(buf);
3126 return s->errorhandler();
3127 }
3128 _PyBytes_Resize(&buf, buflen);
3129 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003130}
3131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003132PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003133"getsockopt(level, option[, buffersize]) -> value\n\
3134\n\
3135Get a socket option. See the Unix manual for level and option.\n\
3136If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003137string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003138
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003139
Fred Drake728819a2000-07-01 03:40:12 +00003140/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003141
Guido van Rossum73624e91994-10-10 17:59:00 +00003142static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003143sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 sock_addr_t addrbuf;
3146 int addrlen;
3147 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003148
Victor Stinnerd565fb92019-10-10 21:30:20 +02003149 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003151 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003152
3153 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3154 return NULL;
3155 }
3156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 Py_BEGIN_ALLOW_THREADS
3158 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3159 Py_END_ALLOW_THREADS
3160 if (res < 0)
3161 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003162 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003163}
3164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003165PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003166"bind(address)\n\
3167\n\
3168Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003169pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003170sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003171
Guido van Rossum30a685f1991-06-27 15:51:29 +00003172
3173/* s.close() method.
3174 Set the file descriptor to -1 so operations tried subsequently
3175 will surely fail. */
3176
Guido van Rossum73624e91994-10-10 17:59:00 +00003177static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303178sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003181 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003182
Victor Stinner19a8e842016-03-21 16:36:48 +01003183 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003184 if (fd != INVALID_SOCKET) {
3185 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003186
3187 /* We do not want to retry upon EINTR: see
3188 http://lwn.net/Articles/576478/ and
3189 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3190 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003192 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003194 /* bpo-30319: The peer can already have closed the connection.
3195 Python ignores ECONNRESET on close(). */
3196 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003197 return s->errorhandler();
3198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003200 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003201}
3202
Christian Heimesd0e31b92018-01-27 09:54:13 +01003203PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003204"close()\n\
3205\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003206Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003207
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003208static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303209sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003210{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003211 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003212 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003213 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003214}
3215
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003216PyDoc_STRVAR(detach_doc,
3217"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003218\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003219Close the socket object without closing the underlying file descriptor.\n\
3220The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003221can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003222
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003223static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003224sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003225{
Victor Stinner81c41db2015-04-02 11:50:57 +02003226 int err;
3227 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003228
Victor Stinner81c41db2015-04-02 11:50:57 +02003229 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3230 /* getsockopt() failed */
3231 return 0;
3232 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003233
Victor Stinner81c41db2015-04-02 11:50:57 +02003234 if (err == EISCONN)
3235 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003236 if (err != 0) {
3237 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3238 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003239 return 0;
3240 }
3241 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003242}
3243
3244static int
3245internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3246 int raise)
3247{
3248 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003249
3250 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003252 Py_END_ALLOW_THREADS
3253
Victor Stinner70a46f62015-03-31 22:03:59 +02003254 if (!res) {
3255 /* connect() succeeded, the socket is connected */
3256 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003258
Victor Stinner81c41db2015-04-02 11:50:57 +02003259 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003260
Victor Stinner81c41db2015-04-02 11:50:57 +02003261 /* save error, PyErr_CheckSignals() can replace it */
3262 err = GET_SOCK_ERROR;
3263 if (CHECK_ERRNO(EINTR)) {
3264 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003265 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003266
3267 /* Issue #23618: when connect() fails with EINTR, the connection is
3268 running asynchronously.
3269
3270 If the socket is blocking or has a timeout, wait until the
3271 connection completes, fails or timed out using select(), and then
3272 get the connection status using getsockopt(SO_ERROR).
3273
3274 If the socket is non-blocking, raise InterruptedError. The caller is
3275 responsible to wait until the connection completes, fails or timed
3276 out (it's the case in asyncio for example). */
3277 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3278 }
3279 else {
3280 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3281 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003282 }
3283
Victor Stinner81c41db2015-04-02 11:50:57 +02003284 if (!wait_connect) {
3285 if (raise) {
3286 /* restore error, maybe replaced by PyErr_CheckSignals() */
3287 SET_SOCK_ERROR(err);
3288 s->errorhandler();
3289 return -1;
3290 }
3291 else
3292 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003293 }
3294
Victor Stinner81c41db2015-04-02 11:50:57 +02003295 if (raise) {
3296 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003297 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3298 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003299 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003300 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003301 else {
3302 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003303 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3304 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003305 return err;
3306 }
3307 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003308}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003309
Fred Drake728819a2000-07-01 03:40:12 +00003310/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003311
Guido van Rossum73624e91994-10-10 17:59:00 +00003312static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003313sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 sock_addr_t addrbuf;
3316 int addrlen;
3317 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003318
Victor Stinnerd565fb92019-10-10 21:30:20 +02003319 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003321 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003322
Steve Dowerb82e17e2019-05-23 08:45:22 -07003323 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3324 return NULL;
3325 }
3326
Victor Stinner81c41db2015-04-02 11:50:57 +02003327 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003328 if (res < 0)
3329 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003330
Victor Stinneree699e92015-03-31 21:28:42 +02003331 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003332}
3333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003334PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003335"connect(address)\n\
3336\n\
3337Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003338is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003339
Guido van Rossum30a685f1991-06-27 15:51:29 +00003340
Fred Drake728819a2000-07-01 03:40:12 +00003341/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003342
3343static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003344sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 sock_addr_t addrbuf;
3347 int addrlen;
3348 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003349
Victor Stinnerd565fb92019-10-10 21:30:20 +02003350 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003352 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003353
Steve Dowerb82e17e2019-05-23 08:45:22 -07003354 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3355 return NULL;
3356 }
3357
Victor Stinner81c41db2015-04-02 11:50:57 +02003358 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003359 if (res < 0)
3360 return NULL;
3361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003363}
3364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003365PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003366"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003367\n\
3368This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003369instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003370
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003371
Guido van Rossumed233a51992-06-23 09:07:03 +00003372/* s.fileno() method */
3373
Guido van Rossum73624e91994-10-10 17:59:00 +00003374static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303375sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003378}
3379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003380PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003381"fileno() -> integer\n\
3382\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003383Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003384
Guido van Rossumed233a51992-06-23 09:07:03 +00003385
Guido van Rossumc89705d1992-11-26 08:54:07 +00003386/* s.getsockname() method */
3387
Guido van Rossum73624e91994-10-10 17:59:00 +00003388static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303389sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 sock_addr_t addrbuf;
3392 int res;
3393 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 if (!getsockaddrlen(s, &addrlen))
3396 return NULL;
3397 memset(&addrbuf, 0, addrlen);
3398 Py_BEGIN_ALLOW_THREADS
3399 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3400 Py_END_ALLOW_THREADS
3401 if (res < 0)
3402 return s->errorhandler();
3403 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3404 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003405}
3406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003407PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003408"getsockname() -> address info\n\
3409\n\
3410Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003411info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003412
Guido van Rossumc89705d1992-11-26 08:54:07 +00003413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003415/* s.getpeername() method */
3416
Guido van Rossum73624e91994-10-10 17:59:00 +00003417static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303418sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 sock_addr_t addrbuf;
3421 int res;
3422 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 if (!getsockaddrlen(s, &addrlen))
3425 return NULL;
3426 memset(&addrbuf, 0, addrlen);
3427 Py_BEGIN_ALLOW_THREADS
3428 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3429 Py_END_ALLOW_THREADS
3430 if (res < 0)
3431 return s->errorhandler();
3432 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3433 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003434}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003436PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437"getpeername() -> address info\n\
3438\n\
3439Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003440info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003441
Guido van Rossumb6775db1994-08-01 11:34:53 +00003442#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003443
3444
Guido van Rossum30a685f1991-06-27 15:51:29 +00003445/* s.listen(n) method */
3446
Guido van Rossum73624e91994-10-10 17:59:00 +00003447static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003448sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003449{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003450 /* We try to choose a default backlog high enough to avoid connection drops
3451 * for common workloads, yet not too high to limit resource usage. */
3452 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003454
Charles-François Natali644b8f52014-05-22 19:45:39 +01003455 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003459 /* To avoid problems on systems that don't allow a negative backlog
3460 * (which doesn't make sense anyway) we force a minimum value of 0. */
3461 if (backlog < 0)
3462 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 res = listen(s->sock_fd, backlog);
3464 Py_END_ALLOW_THREADS
3465 if (res < 0)
3466 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003467 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003468}
3469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003470PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003471"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003472\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003473Enable a server to accept connections. If backlog is specified, it must be\n\
3474at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003475unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003476connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003477
Victor Stinner31bf2d52015-04-01 21:57:09 +02003478struct sock_recv {
3479 char *cbuf;
3480 Py_ssize_t len;
3481 int flags;
3482 Py_ssize_t result;
3483};
3484
3485static int
3486sock_recv_impl(PySocketSockObject *s, void *data)
3487{
3488 struct sock_recv *ctx = data;
3489
3490#ifdef MS_WINDOWS
3491 if (ctx->len > INT_MAX)
3492 ctx->len = INT_MAX;
3493 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3494#else
3495 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3496#endif
3497 return (ctx->result >= 0);
3498}
3499
Guido van Rossum82a5c661998-07-07 20:45:43 +00003500
Thomas Wouters477c8d52006-05-27 19:21:47 +00003501/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003502 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003503 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003504 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003505 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003506 * also possible that we return a number of bytes smaller than the request
3507 * bytes.
3508 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003509
Antoine Pitrou19467d22010-08-17 19:33:30 +00003510static Py_ssize_t
3511sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003512{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003513 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 if (!IS_SELECTABLE(s)) {
3516 select_error();
3517 return -1;
3518 }
3519 if (len == 0) {
3520 /* If 0 bytes were requested, do nothing. */
3521 return 0;
3522 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003523
Victor Stinner31bf2d52015-04-01 21:57:09 +02003524 ctx.cbuf = cbuf;
3525 ctx.len = len;
3526 ctx.flags = flags;
3527 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003529
3530 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003531}
3532
Guido van Rossum48a680c2001-03-02 06:34:14 +00003533
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003534/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003535
Guido van Rossum73624e91994-10-10 17:59:00 +00003536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003537sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003538{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003539 Py_ssize_t recvlen, outlen;
3540 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003542
Antoine Pitrou19467d22010-08-17 19:33:30 +00003543 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 if (recvlen < 0) {
3547 PyErr_SetString(PyExc_ValueError,
3548 "negative buffersize in recv");
3549 return NULL;
3550 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 /* Allocate a new string. */
3553 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3554 if (buf == NULL)
3555 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 /* Call the guts */
3558 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3559 if (outlen < 0) {
3560 /* An error occurred, release the string and return an
3561 error. */
3562 Py_DECREF(buf);
3563 return NULL;
3564 }
3565 if (outlen != recvlen) {
3566 /* We did not read as many bytes as we anticipated, resize the
3567 string if possible and be successful. */
3568 _PyBytes_Resize(&buf, outlen);
3569 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003572}
3573
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003574PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003575"recv(buffersize[, flags]) -> data\n\
3576\n\
3577Receive up to buffersize bytes from the socket. For the optional flags\n\
3578argument, see the Unix manual. When no data is available, block until\n\
3579at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003580the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003581
Guido van Rossum30a685f1991-06-27 15:51:29 +00003582
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003583/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003584
Thomas Wouters477c8d52006-05-27 19:21:47 +00003585static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003586sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003589
Antoine Pitrou19467d22010-08-17 19:33:30 +00003590 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 Py_buffer pbuf;
3592 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003593 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003596 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 &pbuf, &recvlen, &flags))
3598 return NULL;
3599 buf = pbuf.buf;
3600 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 if (recvlen < 0) {
3603 PyBuffer_Release(&pbuf);
3604 PyErr_SetString(PyExc_ValueError,
3605 "negative buffersize in recv_into");
3606 return NULL;
3607 }
3608 if (recvlen == 0) {
3609 /* If nbytes was not specified, use the buffer's length */
3610 recvlen = buflen;
3611 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 /* Check if the buffer is large enough */
3614 if (buflen < recvlen) {
3615 PyBuffer_Release(&pbuf);
3616 PyErr_SetString(PyExc_ValueError,
3617 "buffer too small for requested bytes");
3618 return NULL;
3619 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 /* Call the guts */
3622 readlen = sock_recv_guts(s, buf, recvlen, flags);
3623 if (readlen < 0) {
3624 /* Return an error. */
3625 PyBuffer_Release(&pbuf);
3626 return NULL;
3627 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003629 PyBuffer_Release(&pbuf);
3630 /* Return the number of bytes read. Note that we do not do anything
3631 special here in the case that readlen < recvlen. */
3632 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003633}
3634
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003635PyDoc_STRVAR(recv_into_doc,
3636"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003637\n\
oldkaa0735f2018-02-02 16:52:55 +08003638A version of recv() that stores its data into a buffer rather than creating\n\
3639a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003640is not specified (or 0), receive up to the size available in the given buffer.\n\
3641\n\
3642See recv() for documentation about the flags.");
3643
Victor Stinner31bf2d52015-04-01 21:57:09 +02003644struct sock_recvfrom {
3645 char* cbuf;
3646 Py_ssize_t len;
3647 int flags;
3648 socklen_t *addrlen;
3649 sock_addr_t *addrbuf;
3650 Py_ssize_t result;
3651};
3652
3653static int
3654sock_recvfrom_impl(PySocketSockObject *s, void *data)
3655{
3656 struct sock_recvfrom *ctx = data;
3657
3658 memset(ctx->addrbuf, 0, *ctx->addrlen);
3659
3660#ifdef MS_WINDOWS
3661 if (ctx->len > INT_MAX)
3662 ctx->len = INT_MAX;
3663 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3664 SAS2SA(ctx->addrbuf), ctx->addrlen);
3665#else
3666 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3667 SAS2SA(ctx->addrbuf), ctx->addrlen);
3668#endif
3669 return (ctx->result >= 0);
3670}
3671
Thomas Wouters477c8d52006-05-27 19:21:47 +00003672
3673/*
Christian Heimes99170a52007-12-19 02:07:34 +00003674 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3675 * into a char buffer. If you have any inc/def ref to do to the objects that
3676 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003677 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003678 * that it is also possible that we return a number of bytes smaller than the
3679 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003680 *
3681 * 'addr' is a return value for the address object. Note that you must decref
3682 * it yourself.
3683 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003684static Py_ssize_t
3685sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003690 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 if (!getsockaddrlen(s, &addrlen))
3695 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 if (!IS_SELECTABLE(s)) {
3698 select_error();
3699 return -1;
3700 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003701
Victor Stinner31bf2d52015-04-01 21:57:09 +02003702 ctx.cbuf = cbuf;
3703 ctx.len = len;
3704 ctx.flags = flags;
3705 ctx.addrbuf = &addrbuf;
3706 ctx.addrlen = &addrlen;
3707 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003709
Victor Stinner31bf2d52015-04-01 21:57:09 +02003710 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3711 s->sock_proto);
3712 if (*addr == NULL)
3713 return -1;
3714
3715 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003716}
3717
3718/* s.recvfrom(nbytes [,flags]) method */
3719
3720static PyObject *
3721sock_recvfrom(PySocketSockObject *s, PyObject *args)
3722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 PyObject *buf = NULL;
3724 PyObject *addr = NULL;
3725 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003726 int flags = 0;
3727 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003728
Antoine Pitrou19467d22010-08-17 19:33:30 +00003729 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 if (recvlen < 0) {
3733 PyErr_SetString(PyExc_ValueError,
3734 "negative buffersize in recvfrom");
3735 return NULL;
3736 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3739 if (buf == NULL)
3740 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3743 recvlen, flags, &addr);
3744 if (outlen < 0) {
3745 goto finally;
3746 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 if (outlen != recvlen) {
3749 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003750 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003752 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 goto finally;
3754 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003757
3758finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 Py_XDECREF(buf);
3760 Py_XDECREF(addr);
3761 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003762}
3763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003764PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003765"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3766\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003767Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003768
Thomas Wouters477c8d52006-05-27 19:21:47 +00003769
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003770/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003771
3772static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003773sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003776
Antoine Pitrou19467d22010-08-17 19:33:30 +00003777 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 Py_buffer pbuf;
3779 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003780 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003783
Antoine Pitrou19467d22010-08-17 19:33:30 +00003784 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 kwlist, &pbuf,
3786 &recvlen, &flags))
3787 return NULL;
3788 buf = pbuf.buf;
3789 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 if (recvlen < 0) {
3792 PyBuffer_Release(&pbuf);
3793 PyErr_SetString(PyExc_ValueError,
3794 "negative buffersize in recvfrom_into");
3795 return NULL;
3796 }
3797 if (recvlen == 0) {
3798 /* If nbytes was not specified, use the buffer's length */
3799 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003800 } else if (recvlen > buflen) {
3801 PyBuffer_Release(&pbuf);
3802 PyErr_SetString(PyExc_ValueError,
3803 "nbytes is greater than the length of the buffer");
3804 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3808 if (readlen < 0) {
3809 PyBuffer_Release(&pbuf);
3810 /* Return an error */
3811 Py_XDECREF(addr);
3812 return NULL;
3813 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 PyBuffer_Release(&pbuf);
3816 /* Return the number of bytes read and the address. Note that we do
3817 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003818 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003819}
3820
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003821PyDoc_STRVAR(recvfrom_into_doc,
3822"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003823\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003824Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003825
Victor Stinner35bee932015-04-02 12:28:07 +02003826/* The sendmsg() and recvmsg[_into]() methods require a working
3827 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3828#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003829struct sock_recvmsg {
3830 struct msghdr *msg;
3831 int flags;
3832 ssize_t result;
3833};
3834
3835static int
3836sock_recvmsg_impl(PySocketSockObject *s, void *data)
3837{
3838 struct sock_recvmsg *ctx = data;
3839
3840 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3841 return (ctx->result >= 0);
3842}
3843
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003844/*
3845 * Call recvmsg() with the supplied iovec structures, flags, and
3846 * ancillary data buffer size (controllen). Returns the tuple return
3847 * value for recvmsg() or recvmsg_into(), with the first item provided
3848 * by the supplied makeval() function. makeval() will be called with
3849 * the length read and makeval_data as arguments, and must return a
3850 * new reference (which will be decrefed if there is a subsequent
3851 * error). On error, closes any file descriptors received via
3852 * SCM_RIGHTS.
3853 */
3854static PyObject *
3855sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3856 int flags, Py_ssize_t controllen,
3857 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3858{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003859 sock_addr_t addrbuf;
3860 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003861 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862 PyObject *cmsg_list = NULL, *retval = NULL;
3863 void *controlbuf = NULL;
3864 struct cmsghdr *cmsgh;
3865 size_t cmsgdatalen = 0;
3866 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003867 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003868
3869 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3870 ignored" when the socket is connected (Linux fills them in
3871 anyway for AF_UNIX sockets at least). Normally msg_namelen
3872 seems to be set to 0 if there's no address, but try to
3873 initialize msg_name to something that won't be mistaken for a
3874 real address if that doesn't happen. */
3875 if (!getsockaddrlen(s, &addrbuflen))
3876 return NULL;
3877 memset(&addrbuf, 0, addrbuflen);
3878 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3879
3880 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3881 PyErr_SetString(PyExc_ValueError,
3882 "invalid ancillary data buffer length");
3883 return NULL;
3884 }
3885 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3886 return PyErr_NoMemory();
3887
3888 /* Make the system call. */
3889 if (!IS_SELECTABLE(s)) {
3890 select_error();
3891 goto finally;
3892 }
3893
Victor Stinner31bf2d52015-04-01 21:57:09 +02003894 msg.msg_name = SAS2SA(&addrbuf);
3895 msg.msg_namelen = addrbuflen;
3896 msg.msg_iov = iov;
3897 msg.msg_iovlen = iovlen;
3898 msg.msg_control = controlbuf;
3899 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003900
Victor Stinner31bf2d52015-04-01 21:57:09 +02003901 ctx.msg = &msg;
3902 ctx.flags = flags;
3903 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003904 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905
3906 /* Make list of (level, type, data) tuples from control messages. */
3907 if ((cmsg_list = PyList_New(0)) == NULL)
3908 goto err_closefds;
3909 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3910 implementations didn't do so. */
3911 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3912 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3913 PyObject *bytes, *tuple;
3914 int tmp;
3915
3916 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3917 if (cmsg_status != 0) {
3918 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3919 "received malformed or improperly-truncated "
3920 "ancillary data", 1) == -1)
3921 goto err_closefds;
3922 }
3923 if (cmsg_status < 0)
3924 break;
3925 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003926 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003927 goto err_closefds;
3928 }
3929
3930 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3931 cmsgdatalen);
3932 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3933 (int)cmsgh->cmsg_type, bytes);
3934 if (tuple == NULL)
3935 goto err_closefds;
3936 tmp = PyList_Append(cmsg_list, tuple);
3937 Py_DECREF(tuple);
3938 if (tmp != 0)
3939 goto err_closefds;
3940
3941 if (cmsg_status != 0)
3942 break;
3943 }
3944
3945 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003946 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003947 cmsg_list,
3948 (int)msg.msg_flags,
3949 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3950 ((msg.msg_namelen > addrbuflen) ?
3951 addrbuflen : msg.msg_namelen),
3952 s->sock_proto));
3953 if (retval == NULL)
3954 goto err_closefds;
3955
3956finally:
3957 Py_XDECREF(cmsg_list);
3958 PyMem_Free(controlbuf);
3959 return retval;
3960
3961err_closefds:
3962#ifdef SCM_RIGHTS
3963 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3964 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3965 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3966 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3967 if (cmsg_status < 0)
3968 break;
3969 if (cmsgh->cmsg_level == SOL_SOCKET &&
3970 cmsgh->cmsg_type == SCM_RIGHTS) {
3971 size_t numfds;
3972 int *fdp;
3973
3974 numfds = cmsgdatalen / sizeof(int);
3975 fdp = (int *)CMSG_DATA(cmsgh);
3976 while (numfds-- > 0)
3977 close(*fdp++);
3978 }
3979 if (cmsg_status != 0)
3980 break;
3981 }
3982#endif /* SCM_RIGHTS */
3983 goto finally;
3984}
3985
3986
3987static PyObject *
3988makeval_recvmsg(ssize_t received, void *data)
3989{
3990 PyObject **buf = data;
3991
3992 if (received < PyBytes_GET_SIZE(*buf))
3993 _PyBytes_Resize(buf, received);
3994 Py_XINCREF(*buf);
3995 return *buf;
3996}
3997
3998/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3999
4000static PyObject *
4001sock_recvmsg(PySocketSockObject *s, PyObject *args)
4002{
4003 Py_ssize_t bufsize, ancbufsize = 0;
4004 int flags = 0;
4005 struct iovec iov;
4006 PyObject *buf = NULL, *retval = NULL;
4007
4008 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
4009 return NULL;
4010
4011 if (bufsize < 0) {
4012 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
4013 return NULL;
4014 }
4015 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
4016 return NULL;
4017 iov.iov_base = PyBytes_AS_STRING(buf);
4018 iov.iov_len = bufsize;
4019
4020 /* Note that we're passing a pointer to *our pointer* to the bytes
4021 object here (&buf); makeval_recvmsg() may incref the object, or
4022 deallocate it and set our pointer to NULL. */
4023 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
4024 &makeval_recvmsg, &buf);
4025 Py_XDECREF(buf);
4026 return retval;
4027}
4028
4029PyDoc_STRVAR(recvmsg_doc,
4030"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
4031\n\
4032Receive normal data (up to bufsize bytes) and ancillary data from the\n\
4033socket. The ancbufsize argument sets the size in bytes of the\n\
4034internal buffer used to receive the ancillary data; it defaults to 0,\n\
4035meaning that no ancillary data will be received. Appropriate buffer\n\
4036sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
4037CMSG_LEN(), and items which do not fit into the buffer might be\n\
4038truncated or discarded. The flags argument defaults to 0 and has the\n\
4039same meaning as for recv().\n\
4040\n\
4041The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4042The data item is a bytes object holding the non-ancillary data\n\
4043received. The ancdata item is a list of zero or more tuples\n\
4044(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4045(control messages) received: cmsg_level and cmsg_type are integers\n\
4046specifying the protocol level and protocol-specific type respectively,\n\
4047and cmsg_data is a bytes object holding the associated data. The\n\
4048msg_flags item is the bitwise OR of various flags indicating\n\
4049conditions on the received message; see your system documentation for\n\
4050details. If the receiving socket is unconnected, address is the\n\
4051address of the sending socket, if available; otherwise, its value is\n\
4052unspecified.\n\
4053\n\
4054If recvmsg() raises an exception after the system call returns, it\n\
4055will first attempt to close any file descriptors received via the\n\
4056SCM_RIGHTS mechanism.");
4057
4058
4059static PyObject *
4060makeval_recvmsg_into(ssize_t received, void *data)
4061{
4062 return PyLong_FromSsize_t(received);
4063}
4064
4065/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4066
4067static PyObject *
4068sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4069{
4070 Py_ssize_t ancbufsize = 0;
4071 int flags = 0;
4072 struct iovec *iovs = NULL;
4073 Py_ssize_t i, nitems, nbufs = 0;
4074 Py_buffer *bufs = NULL;
4075 PyObject *buffers_arg, *fast, *retval = NULL;
4076
4077 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4078 &buffers_arg, &ancbufsize, &flags))
4079 return NULL;
4080
4081 if ((fast = PySequence_Fast(buffers_arg,
4082 "recvmsg_into() argument 1 must be an "
4083 "iterable")) == NULL)
4084 return NULL;
4085 nitems = PySequence_Fast_GET_SIZE(fast);
4086 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004087 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004088 goto finally;
4089 }
4090
4091 /* Fill in an iovec for each item, and save the Py_buffer
4092 structs to release afterwards. */
4093 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4094 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4095 PyErr_NoMemory();
4096 goto finally;
4097 }
4098 for (; nbufs < nitems; nbufs++) {
4099 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4100 "w*;recvmsg_into() argument 1 must be an iterable "
4101 "of single-segment read-write buffers",
4102 &bufs[nbufs]))
4103 goto finally;
4104 iovs[nbufs].iov_base = bufs[nbufs].buf;
4105 iovs[nbufs].iov_len = bufs[nbufs].len;
4106 }
4107
4108 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4109 &makeval_recvmsg_into, NULL);
4110finally:
4111 for (i = 0; i < nbufs; i++)
4112 PyBuffer_Release(&bufs[i]);
4113 PyMem_Free(bufs);
4114 PyMem_Free(iovs);
4115 Py_DECREF(fast);
4116 return retval;
4117}
4118
4119PyDoc_STRVAR(recvmsg_into_doc,
4120"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4121\n\
4122Receive normal data and ancillary data from the socket, scattering the\n\
4123non-ancillary data into a series of buffers. The buffers argument\n\
4124must be an iterable of objects that export writable buffers\n\
4125(e.g. bytearray objects); these will be filled with successive chunks\n\
4126of the non-ancillary data until it has all been written or there are\n\
4127no more buffers. The ancbufsize argument sets the size in bytes of\n\
4128the internal buffer used to receive the ancillary data; it defaults to\n\
41290, meaning that no ancillary data will be received. Appropriate\n\
4130buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4131or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4132truncated or discarded. The flags argument defaults to 0 and has the\n\
4133same meaning as for recv().\n\
4134\n\
4135The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4136The nbytes item is the total number of bytes of non-ancillary data\n\
4137written into the buffers. The ancdata item is a list of zero or more\n\
4138tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4139data (control messages) received: cmsg_level and cmsg_type are\n\
4140integers specifying the protocol level and protocol-specific type\n\
4141respectively, and cmsg_data is a bytes object holding the associated\n\
4142data. The msg_flags item is the bitwise OR of various flags\n\
4143indicating conditions on the received message; see your system\n\
4144documentation for details. If the receiving socket is unconnected,\n\
4145address is the address of the sending socket, if available; otherwise,\n\
4146its value is unspecified.\n\
4147\n\
4148If recvmsg_into() raises an exception after the system call returns,\n\
4149it will first attempt to close any file descriptors received via the\n\
4150SCM_RIGHTS mechanism.");
4151#endif /* CMSG_LEN */
4152
4153
Victor Stinner31bf2d52015-04-01 21:57:09 +02004154struct sock_send {
4155 char *buf;
4156 Py_ssize_t len;
4157 int flags;
4158 Py_ssize_t result;
4159};
4160
4161static int
4162sock_send_impl(PySocketSockObject *s, void *data)
4163{
4164 struct sock_send *ctx = data;
4165
4166#ifdef MS_WINDOWS
4167 if (ctx->len > INT_MAX)
4168 ctx->len = INT_MAX;
4169 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4170#else
4171 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4172#endif
4173 return (ctx->result >= 0);
4174}
4175
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004176/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004177
Guido van Rossum73624e91994-10-10 17:59:00 +00004178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004179sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004180{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004181 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004183 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4186 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 if (!IS_SELECTABLE(s)) {
4189 PyBuffer_Release(&pbuf);
4190 return select_error();
4191 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004192 ctx.buf = pbuf.buf;
4193 ctx.len = pbuf.len;
4194 ctx.flags = flags;
4195 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004196 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 return NULL;
4198 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004199 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004200
4201 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004202}
4203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004204PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004205"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004206\n\
4207Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004208argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004209sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004210
4211
4212/* s.sendall(data [,flags]) method */
4213
4214static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004215sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004218 Py_ssize_t len, n;
4219 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004221 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004222 int has_timeout = (s->sock_timeout > 0);
4223 _PyTime_t interval = s->sock_timeout;
4224 _PyTime_t deadline = 0;
4225 int deadline_initialized = 0;
4226 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4229 return NULL;
4230 buf = pbuf.buf;
4231 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 if (!IS_SELECTABLE(s)) {
4234 PyBuffer_Release(&pbuf);
4235 return select_error();
4236 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004239 if (has_timeout) {
4240 if (deadline_initialized) {
4241 /* recompute the timeout */
4242 interval = deadline - _PyTime_GetMonotonicClock();
4243 }
4244 else {
4245 deadline_initialized = 1;
4246 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4247 }
4248
4249 if (interval <= 0) {
4250 PyErr_SetString(socket_timeout, "timed out");
4251 goto done;
4252 }
4253 }
4254
Victor Stinner02f32ab2015-04-01 22:53:26 +02004255 ctx.buf = buf;
4256 ctx.len = len;
4257 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004258 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4259 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004260 n = ctx.result;
4261 assert(n >= 0);
4262
4263 buf += n;
4264 len -= n;
4265
4266 /* We must run our signal handlers before looping again.
4267 send() can return a successful partial write when it is
4268 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004269 if (PyErr_CheckSignals())
4270 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004271 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004273
Victor Stinner8912d142015-04-06 23:16:34 +02004274 Py_INCREF(Py_None);
4275 res = Py_None;
4276
4277done:
4278 PyBuffer_Release(&pbuf);
4279 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004280}
4281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004282PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004283"sendall(data[, flags])\n\
4284\n\
4285Send a data string to the socket. For the optional flags\n\
4286argument, see the Unix manual. This calls send() repeatedly\n\
4287until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004288to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004289
Guido van Rossum30a685f1991-06-27 15:51:29 +00004290
Victor Stinner31bf2d52015-04-01 21:57:09 +02004291struct sock_sendto {
4292 char *buf;
4293 Py_ssize_t len;
4294 int flags;
4295 int addrlen;
4296 sock_addr_t *addrbuf;
4297 Py_ssize_t result;
4298};
4299
4300static int
4301sock_sendto_impl(PySocketSockObject *s, void *data)
4302{
4303 struct sock_sendto *ctx = data;
4304
4305#ifdef MS_WINDOWS
4306 if (ctx->len > INT_MAX)
4307 ctx->len = INT_MAX;
4308 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4309 SAS2SA(ctx->addrbuf), ctx->addrlen);
4310#else
4311 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4312 SAS2SA(ctx->addrbuf), ctx->addrlen);
4313#endif
4314 return (ctx->result >= 0);
4315}
4316
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004317/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004318
Guido van Rossum73624e91994-10-10 17:59:00 +00004319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004320sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 Py_buffer pbuf;
4323 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004324 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004326 int addrlen, flags;
4327 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004330 arglen = PyTuple_Size(args);
4331 switch (arglen) {
4332 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004333 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4334 return NULL;
4335 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004336 break;
4337 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004338 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4339 &pbuf, &flags, &addro)) {
4340 return NULL;
4341 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004342 break;
4343 default:
4344 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004345 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004346 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004347 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 if (!IS_SELECTABLE(s)) {
4351 PyBuffer_Release(&pbuf);
4352 return select_error();
4353 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004354
Victor Stinnerd565fb92019-10-10 21:30:20 +02004355 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 PyBuffer_Release(&pbuf);
4357 return NULL;
4358 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004359
Steve Dowerb82e17e2019-05-23 08:45:22 -07004360 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4361 return NULL;
4362 }
4363
Victor Stinner31bf2d52015-04-01 21:57:09 +02004364 ctx.buf = pbuf.buf;
4365 ctx.len = pbuf.len;
4366 ctx.flags = flags;
4367 ctx.addrlen = addrlen;
4368 ctx.addrbuf = &addrbuf;
4369 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004370 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 return NULL;
4372 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004373 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004374
4375 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004376}
4377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004378PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004379"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004380\n\
4381Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004382For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004383
Guido van Rossum30a685f1991-06-27 15:51:29 +00004384
Victor Stinner35bee932015-04-02 12:28:07 +02004385/* The sendmsg() and recvmsg[_into]() methods require a working
4386 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4387#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004388struct sock_sendmsg {
4389 struct msghdr *msg;
4390 int flags;
4391 ssize_t result;
4392};
4393
4394static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004395sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4396 struct msghdr *msg,
4397 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4398 Py_ssize_t ndataparts, ndatabufs = 0;
4399 int result = -1;
4400 struct iovec *iovs = NULL;
4401 PyObject *data_fast = NULL;
4402 Py_buffer *databufs = NULL;
4403
4404 /* Fill in an iovec for each message part, and save the Py_buffer
4405 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004406 data_fast = PySequence_Fast(data_arg,
4407 "sendmsg() argument 1 must be an "
4408 "iterable");
4409 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004410 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004411 }
4412
Christian Heimesdffa3942016-09-05 23:54:41 +02004413 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4414 if (ndataparts > INT_MAX) {
4415 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4416 goto finally;
4417 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004418
Christian Heimesdffa3942016-09-05 23:54:41 +02004419 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004420 if (ndataparts > 0) {
4421 iovs = PyMem_New(struct iovec, ndataparts);
4422 if (iovs == NULL) {
4423 PyErr_NoMemory();
4424 goto finally;
4425 }
4426 msg->msg_iov = iovs;
4427
4428 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004429 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004430 PyErr_NoMemory();
4431 goto finally;
4432 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004433 }
4434 for (; ndatabufs < ndataparts; ndatabufs++) {
4435 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4436 "y*;sendmsg() argument 1 must be an iterable of "
4437 "bytes-like objects",
4438 &databufs[ndatabufs]))
4439 goto finally;
4440 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4441 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4442 }
4443 result = 0;
4444 finally:
4445 *databufsout = databufs;
4446 *ndatabufsout = ndatabufs;
4447 Py_XDECREF(data_fast);
4448 return result;
4449}
4450
4451static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004452sock_sendmsg_impl(PySocketSockObject *s, void *data)
4453{
4454 struct sock_sendmsg *ctx = data;
4455
4456 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4457 return (ctx->result >= 0);
4458}
4459
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004460/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4461
4462static PyObject *
4463sock_sendmsg(PySocketSockObject *s, PyObject *args)
4464{
Christian Heimesdffa3942016-09-05 23:54:41 +02004465 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004466 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004468 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004469 struct cmsginfo {
4470 int level;
4471 int type;
4472 Py_buffer data;
4473 } *cmsgs = NULL;
4474 void *controlbuf = NULL;
4475 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004476 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004477 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004478 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004479 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004480
4481 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004482 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004483 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004484 }
4485
4486 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004487
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004488 /* Parse destination address. */
4489 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004490 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004491 "sendmsg"))
4492 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004493 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004494 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004495 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4496 return NULL;
4497 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004498 msg.msg_name = &addrbuf;
4499 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004500 } else {
4501 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4502 return NULL;
4503 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004504 }
4505
4506 /* Fill in an iovec for each message part, and save the Py_buffer
4507 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004508 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004509 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004510 }
4511
4512 if (cmsg_arg == NULL)
4513 ncmsgs = 0;
4514 else {
4515 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4516 "sendmsg() argument 2 must be an "
4517 "iterable")) == NULL)
4518 goto finally;
4519 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4520 }
4521
4522#ifndef CMSG_SPACE
4523 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004524 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004525 "sending multiple control messages is not supported "
4526 "on this system");
4527 goto finally;
4528 }
4529#endif
4530 /* Save level, type and Py_buffer for each control message,
4531 and calculate total size. */
4532 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4533 PyErr_NoMemory();
4534 goto finally;
4535 }
4536 controllen = controllen_last = 0;
4537 while (ncmsgbufs < ncmsgs) {
4538 size_t bufsize, space;
4539
4540 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4541 "(iiy*):[sendmsg() ancillary data items]",
4542 &cmsgs[ncmsgbufs].level,
4543 &cmsgs[ncmsgbufs].type,
4544 &cmsgs[ncmsgbufs].data))
4545 goto finally;
4546 bufsize = cmsgs[ncmsgbufs++].data.len;
4547
4548#ifdef CMSG_SPACE
4549 if (!get_CMSG_SPACE(bufsize, &space)) {
4550#else
4551 if (!get_CMSG_LEN(bufsize, &space)) {
4552#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004553 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004554 goto finally;
4555 }
4556 controllen += space;
4557 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004558 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004559 goto finally;
4560 }
4561 controllen_last = controllen;
4562 }
4563
4564 /* Construct ancillary data block from control message info. */
4565 if (ncmsgbufs > 0) {
4566 struct cmsghdr *cmsgh = NULL;
4567
Victor Stinner52d61e42016-09-12 11:41:58 +02004568 controlbuf = PyMem_Malloc(controllen);
4569 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004570 PyErr_NoMemory();
4571 goto finally;
4572 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004573 msg.msg_control = controlbuf;
4574
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004575 msg.msg_controllen = controllen;
4576
4577 /* Need to zero out the buffer as a workaround for glibc's
4578 CMSG_NXTHDR() implementation. After getting the pointer to
4579 the next header, it checks its (uninitialized) cmsg_len
4580 member to see if the "message" fits in the buffer, and
4581 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004582 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004583 memset(controlbuf, 0, controllen);
4584
4585 for (i = 0; i < ncmsgbufs; i++) {
4586 size_t msg_len, data_len = cmsgs[i].data.len;
4587 int enough_space = 0;
4588
4589 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4590 if (cmsgh == NULL) {
4591 PyErr_Format(PyExc_RuntimeError,
4592 "unexpected NULL result from %s()",
4593 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4594 goto finally;
4595 }
4596 if (!get_CMSG_LEN(data_len, &msg_len)) {
4597 PyErr_SetString(PyExc_RuntimeError,
4598 "item size out of range for CMSG_LEN()");
4599 goto finally;
4600 }
4601 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4602 size_t space;
4603
4604 cmsgh->cmsg_len = msg_len;
4605 if (get_cmsg_data_space(&msg, cmsgh, &space))
4606 enough_space = (space >= data_len);
4607 }
4608 if (!enough_space) {
4609 PyErr_SetString(PyExc_RuntimeError,
4610 "ancillary data does not fit in calculated "
4611 "space");
4612 goto finally;
4613 }
4614 cmsgh->cmsg_level = cmsgs[i].level;
4615 cmsgh->cmsg_type = cmsgs[i].type;
4616 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4617 }
4618 }
4619
4620 /* Make the system call. */
4621 if (!IS_SELECTABLE(s)) {
4622 select_error();
4623 goto finally;
4624 }
4625
Victor Stinner31bf2d52015-04-01 21:57:09 +02004626 ctx.msg = &msg;
4627 ctx.flags = flags;
4628 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004629 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004630
4631 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004632
4633finally:
4634 PyMem_Free(controlbuf);
4635 for (i = 0; i < ncmsgbufs; i++)
4636 PyBuffer_Release(&cmsgs[i].data);
4637 PyMem_Free(cmsgs);
4638 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004639 PyMem_Free(msg.msg_iov);
4640 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004641 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004642 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004643 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004644 return retval;
4645}
4646
4647PyDoc_STRVAR(sendmsg_doc,
4648"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4649\n\
4650Send normal and ancillary data to the socket, gathering the\n\
4651non-ancillary data from a series of buffers and concatenating it into\n\
4652a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004653data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004654The ancdata argument specifies the ancillary data (control messages)\n\
4655as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4656cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4657protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004658is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004659argument defaults to 0 and has the same meaning as for send(). If\n\
4660address is supplied and not None, it sets a destination address for\n\
4661the message. The return value is the number of bytes of non-ancillary\n\
4662data sent.");
4663#endif /* CMSG_LEN */
4664
Christian Heimesdffa3942016-09-05 23:54:41 +02004665#ifdef HAVE_SOCKADDR_ALG
4666static PyObject*
4667sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4668{
4669 PyObject *retval = NULL;
4670
4671 Py_ssize_t i, ndatabufs = 0;
4672 Py_buffer *databufs = NULL;
4673 PyObject *data_arg = NULL;
4674
4675 Py_buffer iv = {NULL, NULL};
4676
4677 PyObject *opobj = NULL;
4678 int op = -1;
4679
4680 PyObject *assoclenobj = NULL;
4681 int assoclen = -1;
4682
4683 unsigned int *uiptr;
4684 int flags = 0;
4685
4686 struct msghdr msg;
4687 struct cmsghdr *header = NULL;
4688 struct af_alg_iv *alg_iv = NULL;
4689 struct sock_sendmsg ctx;
4690 Py_ssize_t controllen;
4691 void *controlbuf = NULL;
4692 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4693
4694 if (self->sock_family != AF_ALG) {
4695 PyErr_SetString(PyExc_OSError,
4696 "algset is only supported for AF_ALG");
4697 return NULL;
4698 }
4699
4700 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4701 "|O$O!y*O!i:sendmsg_afalg", keywords,
4702 &data_arg,
4703 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004704 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004705 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004706 }
4707
4708 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004709
4710 /* op is a required, keyword-only argument >= 0 */
4711 if (opobj != NULL) {
4712 op = _PyLong_AsInt(opobj);
4713 }
4714 if (op < 0) {
4715 /* override exception from _PyLong_AsInt() */
4716 PyErr_SetString(PyExc_TypeError,
4717 "Invalid or missing argument 'op'");
4718 goto finally;
4719 }
4720 /* assoclen is optional but must be >= 0 */
4721 if (assoclenobj != NULL) {
4722 assoclen = _PyLong_AsInt(assoclenobj);
4723 if (assoclen == -1 && PyErr_Occurred()) {
4724 goto finally;
4725 }
4726 if (assoclen < 0) {
4727 PyErr_SetString(PyExc_TypeError,
4728 "assoclen must be positive");
4729 goto finally;
4730 }
4731 }
4732
4733 controllen = CMSG_SPACE(4);
4734 if (iv.buf != NULL) {
4735 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4736 }
4737 if (assoclen >= 0) {
4738 controllen += CMSG_SPACE(4);
4739 }
4740
4741 controlbuf = PyMem_Malloc(controllen);
4742 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004743 PyErr_NoMemory();
4744 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004745 }
4746 memset(controlbuf, 0, controllen);
4747
Christian Heimesdffa3942016-09-05 23:54:41 +02004748 msg.msg_controllen = controllen;
4749 msg.msg_control = controlbuf;
4750
4751 /* Fill in an iovec for each message part, and save the Py_buffer
4752 structs to release afterwards. */
4753 if (data_arg != NULL) {
4754 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4755 goto finally;
4756 }
4757 }
4758
4759 /* set operation to encrypt or decrypt */
4760 header = CMSG_FIRSTHDR(&msg);
4761 if (header == NULL) {
4762 PyErr_SetString(PyExc_RuntimeError,
4763 "unexpected NULL result from CMSG_FIRSTHDR");
4764 goto finally;
4765 }
4766 header->cmsg_level = SOL_ALG;
4767 header->cmsg_type = ALG_SET_OP;
4768 header->cmsg_len = CMSG_LEN(4);
4769 uiptr = (void*)CMSG_DATA(header);
4770 *uiptr = (unsigned int)op;
4771
4772 /* set initialization vector */
4773 if (iv.buf != NULL) {
4774 header = CMSG_NXTHDR(&msg, header);
4775 if (header == NULL) {
4776 PyErr_SetString(PyExc_RuntimeError,
4777 "unexpected NULL result from CMSG_NXTHDR(iv)");
4778 goto finally;
4779 }
4780 header->cmsg_level = SOL_ALG;
4781 header->cmsg_type = ALG_SET_IV;
4782 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4783 alg_iv = (void*)CMSG_DATA(header);
4784 alg_iv->ivlen = iv.len;
4785 memcpy(alg_iv->iv, iv.buf, iv.len);
4786 }
4787
4788 /* set length of associated data for AEAD */
4789 if (assoclen >= 0) {
4790 header = CMSG_NXTHDR(&msg, header);
4791 if (header == NULL) {
4792 PyErr_SetString(PyExc_RuntimeError,
4793 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4794 goto finally;
4795 }
4796 header->cmsg_level = SOL_ALG;
4797 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4798 header->cmsg_len = CMSG_LEN(4);
4799 uiptr = (void*)CMSG_DATA(header);
4800 *uiptr = (unsigned int)assoclen;
4801 }
4802
4803 ctx.msg = &msg;
4804 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004805 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004806 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004807 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004808
4809 retval = PyLong_FromSsize_t(ctx.result);
4810
4811 finally:
4812 PyMem_Free(controlbuf);
4813 if (iv.buf != NULL) {
4814 PyBuffer_Release(&iv);
4815 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004816 PyMem_Free(msg.msg_iov);
4817 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004818 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004819 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004820 PyMem_Free(databufs);
4821 return retval;
4822}
4823
4824PyDoc_STRVAR(sendmsg_afalg_doc,
4825"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4826\n\
4827Set operation mode, IV and length of associated data for an AF_ALG\n\
4828operation socket.");
4829#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004830
Guido van Rossum30a685f1991-06-27 15:51:29 +00004831/* s.shutdown(how) method */
4832
Guido van Rossum73624e91994-10-10 17:59:00 +00004833static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004834sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 int how;
4837 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004838
Serhiy Storchaka78980432013-01-15 01:12:17 +02004839 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 if (how == -1 && PyErr_Occurred())
4841 return NULL;
4842 Py_BEGIN_ALLOW_THREADS
4843 res = shutdown(s->sock_fd, how);
4844 Py_END_ALLOW_THREADS
4845 if (res < 0)
4846 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004847 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004848}
4849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004850PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004851"shutdown(flag)\n\
4852\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004853Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4854of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004855
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004856#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004857static PyObject*
4858sock_ioctl(PySocketSockObject *s, PyObject *arg)
4859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 unsigned long cmd = SIO_RCVALL;
4861 PyObject *argO;
4862 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4865 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 switch (cmd) {
4868 case SIO_RCVALL: {
4869 unsigned int option = RCVALL_ON;
4870 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4871 return NULL;
4872 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4873 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4874 return set_error();
4875 }
4876 return PyLong_FromUnsignedLong(recv); }
4877 case SIO_KEEPALIVE_VALS: {
4878 struct tcp_keepalive ka;
4879 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4880 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4881 return NULL;
4882 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4883 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4884 return set_error();
4885 }
4886 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004887#if defined(SIO_LOOPBACK_FAST_PATH)
4888 case SIO_LOOPBACK_FAST_PATH: {
4889 unsigned int option;
4890 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4891 return NULL;
4892 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4893 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4894 return set_error();
4895 }
4896 return PyLong_FromUnsignedLong(recv); }
4897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004899 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 return NULL;
4901 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004902}
4903PyDoc_STRVAR(sock_ioctl_doc,
4904"ioctl(cmd, option) -> long\n\
4905\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004906Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4907SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004908SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4909SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004910#endif
4911
4912#if defined(MS_WINDOWS)
4913static PyObject*
4914sock_share(PySocketSockObject *s, PyObject *arg)
4915{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004916 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004917 DWORD processId;
4918 int result;
4919
4920 if (!PyArg_ParseTuple(arg, "I", &processId))
4921 return NULL;
4922
4923 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004924 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004925 Py_END_ALLOW_THREADS
4926 if (result == SOCKET_ERROR)
4927 return set_error();
4928 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4929}
4930PyDoc_STRVAR(sock_share_doc,
4931"share(process_id) -> bytes\n\
4932\n\
4933Share the socket with another process. The target process id\n\
4934must be provided and the resulting bytes object passed to the target\n\
4935process. There the shared socket can be instantiated by calling\n\
4936socket.fromshare().");
4937
Christian Heimesfaf2f632008-01-06 16:59:19 +00004938
4939#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004940
4941/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004942
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004943static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4945 accept_doc},
4946 {"bind", (PyCFunction)sock_bind, METH_O,
4947 bind_doc},
4948 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004949 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 {"connect", (PyCFunction)sock_connect, METH_O,
4951 connect_doc},
4952 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4953 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004954 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4955 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4957 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004958#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 {"getpeername", (PyCFunction)sock_getpeername,
4960 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 {"getsockname", (PyCFunction)sock_getsockname,
4963 METH_NOARGS, getsockname_doc},
4964 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4965 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004966#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4968 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004969#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004970#if defined(MS_WINDOWS)
4971 {"share", (PyCFunction)sock_share, METH_VARARGS,
4972 sock_share_doc},
4973#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004974 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 listen_doc},
4976 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4977 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004978 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 recv_into_doc},
4980 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4981 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004982 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 recvfrom_into_doc},
4984 {"send", (PyCFunction)sock_send, METH_VARARGS,
4985 send_doc},
4986 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4987 sendall_doc},
4988 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4989 sendto_doc},
4990 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4991 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004992 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4993 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4995 settimeout_doc},
4996 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4997 gettimeout_doc},
4998 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4999 setsockopt_doc},
5000 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
5001 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005002#ifdef CMSG_LEN
5003 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
5004 recvmsg_doc},
5005 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
5006 recvmsg_into_doc,},
5007 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
5008 sendmsg_doc},
5009#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02005010#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005011 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02005012 sendmsg_afalg_doc},
5013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005015};
5016
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005017/* SockObject members */
5018static PyMemberDef sock_memberlist[] = {
5019 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
5020 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
5021 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005022 {0},
5023};
Guido van Rossum30a685f1991-06-27 15:51:29 +00005024
Victor Stinner71694d52015-03-28 01:18:54 +01005025static PyGetSetDef sock_getsetlist[] = {
5026 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
5027 {NULL} /* sentinel */
5028};
5029
Guido van Rossum73624e91994-10-10 17:59:00 +00005030/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00005031 First close the file description. */
5032
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005033static void
Victor Stinner19a8e842016-03-21 16:36:48 +01005034sock_finalize(PySocketSockObject *s)
5035{
5036 SOCKET_T fd;
5037 PyObject *error_type, *error_value, *error_traceback;
5038
5039 /* Save the current exception, if any. */
5040 PyErr_Fetch(&error_type, &error_value, &error_traceback);
5041
Victor Stinnerd3afb622016-07-22 17:47:09 +02005042 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005043 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5044 /* Spurious errors can appear at shutdown */
5045 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5046 PyErr_WriteUnraisable((PyObject *)s);
5047 }
5048 }
5049
5050 /* Only close the socket *after* logging the ResourceWarning warning
5051 to allow the logger to call socket methods like
5052 socket.getsockname(). If the socket is closed before, socket
5053 methods fails with the EBADF error. */
5054 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005055 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005056
5057 /* We do not want to retry upon EINTR: see sock_close() */
5058 Py_BEGIN_ALLOW_THREADS
5059 (void) SOCKETCLOSE(fd);
5060 Py_END_ALLOW_THREADS
5061 }
5062
5063 /* Restore the saved exception. */
5064 PyErr_Restore(error_type, error_value, error_traceback);
5065}
5066
5067static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005068sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005069{
Victor Stinner19a8e842016-03-21 16:36:48 +01005070 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5071 return;
5072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005074}
5075
Guido van Rossum30a685f1991-06-27 15:51:29 +00005076
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005077static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005078sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005079{
Victor Stinnere254e532014-07-26 14:36:55 +02005080 long sock_fd;
5081 /* On Windows, this test is needed because SOCKET_T is unsigned */
5082 if (s->sock_fd == INVALID_SOCKET) {
5083 sock_fd = -1;
5084 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005085#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005086 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 /* this can occur on Win64, and actually there is a special
5088 ugly printf formatter for decimal pointer length integer
5089 printing, only bother if necessary*/
5090 PyErr_SetString(PyExc_OverflowError,
5091 "no printf formatter to display "
5092 "the socket descriptor in decimal");
5093 return NULL;
5094 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005095#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005096 else
5097 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 return PyUnicode_FromFormat(
5099 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005100 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 s->sock_type,
5102 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005103}
5104
5105
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005106/* Create a new, uninitialized socket object. */
5107
5108static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005109sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 new = type->tp_alloc(type, 0);
5114 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005115 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005116 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 ((PySocketSockObject *)new)->errorhandler = &set_error;
5118 }
5119 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005120}
5121
5122
5123/* Initialize a new socket object. */
5124
Victor Stinnerdaf45552013-08-28 00:53:59 +02005125#ifdef SOCK_CLOEXEC
5126/* socket() and socketpair() fail with EINVAL on Linux kernel older
5127 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5128static int sock_cloexec_works = -1;
5129#endif
5130
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005131/*ARGSUSED*/
5132static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005133sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 PySocketSockObject *s = (PySocketSockObject *)self;
5136 PyObject *fdobj = NULL;
5137 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005138 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005140#ifndef MS_WINDOWS
5141#ifdef SOCK_CLOEXEC
5142 int *atomic_flag_works = &sock_cloexec_works;
5143#else
5144 int *atomic_flag_works = NULL;
5145#endif
5146#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5149 "|iiiO:socket", keywords,
5150 &family, &type, &proto, &fdobj))
5151 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005152
Steve Dowerb82e17e2019-05-23 08:45:22 -07005153#ifdef MS_WINDOWS
5154 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005155 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005156#endif
5157 {
5158 if (PySys_Audit("socket.__new__", "Oiii",
5159 s, family, type, proto) < 0) {
5160 return -1;
5161 }
5162 }
5163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005165#ifdef MS_WINDOWS
5166 /* recreate a socket that was duplicated */
5167 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005168 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005169 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5170 PyErr_Format(PyExc_ValueError,
5171 "socket descriptor string has wrong size, "
5172 "should be %zu bytes.", sizeof(info));
5173 return -1;
5174 }
5175 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005176
Steve Dower63ba5cc2020-03-31 12:38:53 +01005177 if (PySys_Audit("socket.__new__", "Oiii", s,
5178 info.iAddressFamily, info.iSocketType,
5179 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005180 return -1;
5181 }
5182
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005183 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005184 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005185 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5186 Py_END_ALLOW_THREADS
5187 if (fd == INVALID_SOCKET) {
5188 set_error();
5189 return -1;
5190 }
5191 family = info.iAddressFamily;
5192 type = info.iSocketType;
5193 proto = info.iProtocol;
5194 }
5195 else
5196#endif
5197 {
Dima Tisneke9912702018-12-17 22:07:55 +09005198
5199 if (PyFloat_Check(fdobj)) {
5200 PyErr_SetString(PyExc_TypeError,
5201 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005202 return -1;
5203 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005204
Dima Tisneke9912702018-12-17 22:07:55 +09005205 fd = PyLong_AsSocket_t(fdobj);
5206 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5207 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005208#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005209 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005210#else
Dima Tisneke9912702018-12-17 22:07:55 +09005211 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005212#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005213 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5214 return -1;
5215 }
5216
5217 /* validate that passed file descriptor is valid and a socket. */
5218 sock_addr_t addrbuf;
5219 socklen_t addrlen = sizeof(sock_addr_t);
5220
5221 memset(&addrbuf, 0, addrlen);
5222 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5223 if (family == -1) {
5224 family = SAS2SA(&addrbuf)->sa_family;
5225 }
5226 } else {
5227#ifdef MS_WINDOWS
5228 /* getsockname() on an unbound socket is an error on Windows.
5229 Invalid descriptor and not a socket is same error code.
5230 Error out if family must be resolved, or bad descriptor. */
5231 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5232#else
5233 /* getsockname() is not supported for SOL_ALG on Linux. */
5234 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5235#endif
5236 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005237 return -1;
5238 }
5239 }
5240#ifdef SO_TYPE
5241 if (type == -1) {
5242 int tmp;
5243 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005244 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5245 (void *)&tmp, &slen) == 0)
5246 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005247 type = tmp;
5248 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005249 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005250 return -1;
5251 }
5252 }
5253#else
5254 type = SOCK_STREAM;
5255#endif
5256#ifdef SO_PROTOCOL
5257 if (proto == -1) {
5258 int tmp;
5259 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005260 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5261 (void *)&tmp, &slen) == 0)
5262 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005263 proto = tmp;
5264 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005265 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005266 return -1;
5267 }
5268 }
5269#else
5270 proto = 0;
5271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 }
5273 }
5274 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005275 /* No fd, default to AF_INET and SOCK_STREAM */
5276 if (family == -1) {
5277 family = AF_INET;
5278 }
5279 if (type == -1) {
5280 type = SOCK_STREAM;
5281 }
5282 if (proto == -1) {
5283 proto = 0;
5284 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005285#ifdef MS_WINDOWS
5286 /* Windows implementation */
5287#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5288#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5289#endif
5290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005292 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005293 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005294 NULL, 0,
5295 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5296 if (fd == INVALID_SOCKET) {
5297 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5298 support_wsa_no_inherit = 0;
5299 fd = socket(family, type, proto);
5300 }
5301 }
5302 else {
5303 fd = socket(family, type, proto);
5304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 if (fd == INVALID_SOCKET) {
5308 set_error();
5309 return -1;
5310 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005311
5312 if (!support_wsa_no_inherit) {
5313 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5314 closesocket(fd);
5315 PyErr_SetFromWindowsErr(0);
5316 return -1;
5317 }
5318 }
5319#else
5320 /* UNIX */
5321 Py_BEGIN_ALLOW_THREADS
5322#ifdef SOCK_CLOEXEC
5323 if (sock_cloexec_works != 0) {
5324 fd = socket(family, type | SOCK_CLOEXEC, proto);
5325 if (sock_cloexec_works == -1) {
5326 if (fd >= 0) {
5327 sock_cloexec_works = 1;
5328 }
5329 else if (errno == EINVAL) {
5330 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5331 sock_cloexec_works = 0;
5332 fd = socket(family, type, proto);
5333 }
5334 }
5335 }
5336 else
5337#endif
5338 {
5339 fd = socket(family, type, proto);
5340 }
5341 Py_END_ALLOW_THREADS
5342
5343 if (fd == INVALID_SOCKET) {
5344 set_error();
5345 return -1;
5346 }
5347
5348 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5349 SOCKETCLOSE(fd);
5350 return -1;
5351 }
5352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005354 if (init_sockobject(s, fd, family, type, proto) == -1) {
5355 SOCKETCLOSE(fd);
5356 return -1;
5357 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005360
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005361}
5362
5363
Guido van Rossumb6775db1994-08-01 11:34:53 +00005364/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005365
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005366static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5368 "_socket.socket", /* tp_name */
5369 sizeof(PySocketSockObject), /* tp_basicsize */
5370 0, /* tp_itemsize */
5371 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005372 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 0, /* tp_getattr */
5374 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005375 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 (reprfunc)sock_repr, /* tp_repr */
5377 0, /* tp_as_number */
5378 0, /* tp_as_sequence */
5379 0, /* tp_as_mapping */
5380 0, /* tp_hash */
5381 0, /* tp_call */
5382 0, /* tp_str */
5383 PyObject_GenericGetAttr, /* tp_getattro */
5384 0, /* tp_setattro */
5385 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005386 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 sock_doc, /* tp_doc */
5388 0, /* tp_traverse */
5389 0, /* tp_clear */
5390 0, /* tp_richcompare */
5391 0, /* tp_weaklistoffset */
5392 0, /* tp_iter */
5393 0, /* tp_iternext */
5394 sock_methods, /* tp_methods */
5395 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005396 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 0, /* tp_base */
5398 0, /* tp_dict */
5399 0, /* tp_descr_get */
5400 0, /* tp_descr_set */
5401 0, /* tp_dictoffset */
5402 sock_initobj, /* tp_init */
5403 PyType_GenericAlloc, /* tp_alloc */
5404 sock_new, /* tp_new */
5405 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005406 0, /* tp_is_gc */
5407 0, /* tp_bases */
5408 0, /* tp_mro */
5409 0, /* tp_cache */
5410 0, /* tp_subclasses */
5411 0, /* tp_weaklist */
5412 0, /* tp_del */
5413 0, /* tp_version_tag */
5414 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005415};
5416
Guido van Rossum30a685f1991-06-27 15:51:29 +00005417
Guido van Rossum81194471991-07-27 21:42:02 +00005418/* Python interface to gethostname(). */
5419
5420/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005421static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005422socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005423{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005424 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5425 return NULL;
5426 }
5427
Martin v. Löwis72f48422010-10-29 18:20:08 +00005428#ifdef MS_WINDOWS
5429 /* Don't use winsock's gethostname, as this returns the ANSI
5430 version of the hostname, whereas we need a Unicode string.
5431 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005432 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005433 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005434 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005435 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005436
5437 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005438 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005439
5440 if (GetLastError() != ERROR_MORE_DATA)
5441 return PyErr_SetFromWindowsErr(0);
5442
5443 if (size == 0)
5444 return PyUnicode_New(0, 0);
5445
5446 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5447 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005448 name = PyMem_New(wchar_t, size);
5449 if (!name) {
5450 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005451 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005452 }
Victor Stinner74168972011-11-17 01:11:36 +01005453 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5454 name,
5455 &size))
5456 {
5457 PyMem_Free(name);
5458 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005459 }
Victor Stinner74168972011-11-17 01:11:36 +01005460
5461 result = PyUnicode_FromWideChar(name, size);
5462 PyMem_Free(name);
5463 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005464#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 char buf[1024];
5466 int res;
5467 Py_BEGIN_ALLOW_THREADS
5468 res = gethostname(buf, (int) sizeof buf - 1);
5469 Py_END_ALLOW_THREADS
5470 if (res < 0)
5471 return set_error();
5472 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005473 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005474#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005475}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005477PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005478"gethostname() -> string\n\
5479\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005480Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005481
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005482#ifdef HAVE_SETHOSTNAME
5483PyDoc_STRVAR(sethostname_doc,
5484"sethostname(name)\n\n\
5485Sets the hostname to name.");
5486
5487static PyObject *
5488socket_sethostname(PyObject *self, PyObject *args)
5489{
5490 PyObject *hnobj;
5491 Py_buffer buf;
5492 int res, flag = 0;
5493
Christian Heimesd2774c72013-06-19 02:06:29 +02005494#ifdef _AIX
5495/* issue #18259, not declared in any useful header file */
5496extern int sethostname(const char *, size_t);
5497#endif
5498
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005499 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5500 PyErr_Clear();
5501 if (!PyArg_ParseTuple(args, "O&:sethostname",
5502 PyUnicode_FSConverter, &hnobj))
5503 return NULL;
5504 flag = 1;
5505 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005506
5507 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5508 return NULL;
5509 }
5510
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005511 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5512 if (!res) {
5513 res = sethostname(buf.buf, buf.len);
5514 PyBuffer_Release(&buf);
5515 }
5516 if (flag)
5517 Py_DECREF(hnobj);
5518 if (res)
5519 return set_error();
5520 Py_RETURN_NONE;
5521}
5522#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005523
Guido van Rossum30a685f1991-06-27 15:51:29 +00005524/* Python interface to gethostbyname(name). */
5525
5526/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005528socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005531 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005532 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005533
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005534 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005536 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5537 goto finally;
5538 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005539 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005540 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005541 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005542finally:
5543 PyMem_Free(name);
5544 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005545}
5546
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005547PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005548"gethostbyname(host) -> address\n\
5549\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005550Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005551
5552
Victor Stinner72400302016-01-28 15:41:01 +01005553static PyObject*
5554sock_decode_hostname(const char *name)
5555{
5556#ifdef MS_WINDOWS
5557 /* Issue #26227: gethostbyaddr() returns a string encoded
5558 * to the ANSI code page */
5559 return PyUnicode_DecodeFSDefault(name);
5560#else
5561 /* Decode from UTF-8 */
5562 return PyUnicode_FromString(name);
5563#endif
5564}
5565
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005566/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5567
5568static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005569gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 char **pch;
5572 PyObject *rtn_tuple = (PyObject *)NULL;
5573 PyObject *name_list = (PyObject *)NULL;
5574 PyObject *addr_list = (PyObject *)NULL;
5575 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005576 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 if (h == NULL) {
5579 /* Let's get real error message to return */
5580 set_herror(h_errno);
5581 return NULL;
5582 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 if (h->h_addrtype != af) {
5585 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005586 errno = EAFNOSUPPORT;
5587 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005588 return NULL;
5589 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 case AF_INET:
5594 if (alen < sizeof(struct sockaddr_in))
5595 return NULL;
5596 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005597
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005598#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 case AF_INET6:
5600 if (alen < sizeof(struct sockaddr_in6))
5601 return NULL;
5602 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005603#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 if ((name_list = PyList_New(0)) == NULL)
5608 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 if ((addr_list = PyList_New(0)) == NULL)
5611 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 /* SF #1511317: h_aliases can be NULL */
5614 if (h->h_aliases) {
5615 for (pch = h->h_aliases; *pch != NULL; pch++) {
5616 int status;
5617 tmp = PyUnicode_FromString(*pch);
5618 if (tmp == NULL)
5619 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 status = PyList_Append(name_list, tmp);
5622 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 if (status)
5625 goto err;
5626 }
5627 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5630 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 case AF_INET:
5635 {
5636 struct sockaddr_in sin;
5637 memset(&sin, 0, sizeof(sin));
5638 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005639#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005643 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 if (pch == h->h_addr_list && alen >= sizeof(sin))
5646 memcpy((char *) addr, &sin, sizeof(sin));
5647 break;
5648 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005649
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005650#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 case AF_INET6:
5652 {
5653 struct sockaddr_in6 sin6;
5654 memset(&sin6, 0, sizeof(sin6));
5655 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005656#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005660 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5663 memcpy((char *) addr, &sin6, sizeof(sin6));
5664 break;
5665 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005666#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005669 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 "unsupported address family");
5671 return NULL;
5672 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 if (tmp == NULL)
5675 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 status = PyList_Append(addr_list, tmp);
5678 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 if (status)
5681 goto err;
5682 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005683
Victor Stinner72400302016-01-28 15:41:01 +01005684 name = sock_decode_hostname(h->h_name);
5685 if (name == NULL)
5686 goto err;
5687 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005688
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005689 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 Py_XDECREF(name_list);
5691 Py_XDECREF(addr_list);
5692 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005693}
5694
5695
5696/* Python interface to gethostbyname_ex(name). */
5697
5698/*ARGSUSED*/
5699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005700socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 char *name;
5703 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005704 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005706 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005707#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005709#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005710 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 char buf[16384];
5713 int buf_len = (sizeof buf) - 1;
5714 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005715#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005716#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005718#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005719#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005720
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005721 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005723 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5724 goto finally;
5725 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005726 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005727 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005729#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005730#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005731 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005733#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005734 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005735#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 memset((void *) &data, '\0', sizeof(data));
5737 result = gethostbyname_r(name, &hp_allocated, &data);
5738 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005739#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005740#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005741#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005743#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005744 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005746#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 Py_END_ALLOW_THREADS
5748 /* Some C libraries would require addr.__ss_family instead of
5749 addr.ss_family.
5750 Therefore, we cast the sockaddr_storage into sockaddr to
5751 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005752 sa = SAS2SA(&addr);
5753 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005755#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005757#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005758finally:
5759 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005761}
5762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005763PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005764"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5765\n\
5766Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005767for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005768
5769
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005770/* Python interface to gethostbyaddr(IP). */
5771
5772/*ARGSUSED*/
5773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005774socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005775{
Charles-François Natali8b759652011-12-23 16:44:51 +01005776 sock_addr_t addr;
5777 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 char *ip_num;
5779 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005780 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005781#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005783#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005785#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 /* glibcs up to 2.10 assume that the buf argument to
5787 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5788 does not ensure. The attribute below instructs the compiler
5789 to maintain this alignment. */
5790 char buf[16384] Py_ALIGNED(8);
5791 int buf_len = (sizeof buf) - 1;
5792 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005793#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005794#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005796#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005797#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005798 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 int al;
5800 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005801
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005802 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005804 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5805 goto finally;
5806 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 af = AF_UNSPEC;
5808 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005809 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 af = sa->sa_family;
5811 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005812 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 switch (af) {
5814 case AF_INET:
5815 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5816 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5817 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005818#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819 case AF_INET6:
5820 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5821 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5822 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005825 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005826 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005827 }
5828 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005829#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005830#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005831 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 &hp_allocated, buf, buf_len,
5833 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005834#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 h = gethostbyaddr_r(ap, al, af,
5836 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005837#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 memset((void *) &data, '\0', sizeof(data));
5839 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5840 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005841#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005842#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005843#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005845#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005846 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005848#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005850 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005851#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005853#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005854finally:
5855 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005857}
5858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005859PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005860"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5861\n\
5862Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005863for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005864
Guido van Rossum30a685f1991-06-27 15:51:29 +00005865
5866/* Python interface to getservbyname(name).
5867 This only returns the port number, since the other info is already
5868 known or not useful (like the list of aliases). */
5869
5870/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005872socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005873{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005874 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 struct servent *sp;
5876 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5877 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005878
5879 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5880 return NULL;
5881 }
5882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 Py_BEGIN_ALLOW_THREADS
5884 sp = getservbyname(name, proto);
5885 Py_END_ALLOW_THREADS
5886 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005887 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 return NULL;
5889 }
5890 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005891}
5892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005893PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005894"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005895\n\
5896Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005897The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5898otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005899
Guido van Rossum30a685f1991-06-27 15:51:29 +00005900
Barry Warsaw11b91a02004-06-28 00:50:43 +00005901/* Python interface to getservbyport(port).
5902 This only returns the service name, since the other info is already
5903 known or not useful (like the list of aliases). */
5904
5905/*ARGSUSED*/
5906static PyObject *
5907socket_getservbyport(PyObject *self, PyObject *args)
5908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005910 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 struct servent *sp;
5912 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5913 return NULL;
5914 if (port < 0 || port > 0xffff) {
5915 PyErr_SetString(
5916 PyExc_OverflowError,
5917 "getservbyport: port must be 0-65535.");
5918 return NULL;
5919 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005920
5921 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5922 return NULL;
5923 }
5924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 Py_BEGIN_ALLOW_THREADS
5926 sp = getservbyport(htons((short)port), proto);
5927 Py_END_ALLOW_THREADS
5928 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005929 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 return NULL;
5931 }
5932 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005933}
5934
5935PyDoc_STRVAR(getservbyport_doc,
5936"getservbyport(port[, protocolname]) -> string\n\
5937\n\
5938Return the service name from a port number and protocol name.\n\
5939The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5940otherwise any protocol will match.");
5941
Guido van Rossum3901d851996-12-19 16:35:04 +00005942/* Python interface to getprotobyname(name).
5943 This only returns the protocol number, since the other info is
5944 already known or not useful (like the list of aliases). */
5945
5946/*ARGSUSED*/
5947static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005948socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005949{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005950 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 struct protoent *sp;
5952 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5953 return NULL;
5954 Py_BEGIN_ALLOW_THREADS
5955 sp = getprotobyname(name);
5956 Py_END_ALLOW_THREADS
5957 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005958 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 return NULL;
5960 }
5961 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005962}
5963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005964PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005965"getprotobyname(name) -> integer\n\
5966\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005967Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005968
Christian Heimesd0e31b92018-01-27 09:54:13 +01005969static PyObject *
5970socket_close(PyObject *self, PyObject *fdobj)
5971{
5972 SOCKET_T fd;
5973 int res;
5974
5975 fd = PyLong_AsSocket_t(fdobj);
5976 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5977 return NULL;
5978 Py_BEGIN_ALLOW_THREADS
5979 res = SOCKETCLOSE(fd);
5980 Py_END_ALLOW_THREADS
5981 /* bpo-30319: The peer can already have closed the connection.
5982 Python ignores ECONNRESET on close(). */
5983 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5984 return set_error();
5985 }
5986 Py_RETURN_NONE;
5987}
5988
5989PyDoc_STRVAR(close_doc,
5990"close(integer) -> None\n\
5991\n\
5992Close an integer socket file descriptor. This is like os.close(), but for\n\
5993sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005994
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005995#ifndef NO_DUP
5996/* dup() function for socket fds */
5997
5998static PyObject *
5999socket_dup(PyObject *self, PyObject *fdobj)
6000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 SOCKET_T fd, newfd;
6002 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006003#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006004 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006005#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 fd = PyLong_AsSocket_t(fdobj);
6008 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
6009 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006010
Victor Stinnerdaf45552013-08-28 00:53:59 +02006011#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006012 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02006013 return set_error();
6014
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006015 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006016 FROM_PROTOCOL_INFO,
6017 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 if (newfd == INVALID_SOCKET)
6019 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006020
Victor Stinnerdaf45552013-08-28 00:53:59 +02006021 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
6022 closesocket(newfd);
6023 PyErr_SetFromWindowsErr(0);
6024 return NULL;
6025 }
6026#else
6027 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
6028 newfd = _Py_dup(fd);
6029 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01006030 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006031#endif
6032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 newfdobj = PyLong_FromSocket_t(newfd);
6034 if (newfdobj == NULL)
6035 SOCKETCLOSE(newfd);
6036 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006037}
6038
6039PyDoc_STRVAR(dup_doc,
6040"dup(integer) -> integer\n\
6041\n\
6042Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
6043sockets; on some platforms os.dup() won't work for socket file descriptors.");
6044#endif
6045
6046
Dave Cole331708b2004-08-09 04:51:41 +00006047#ifdef HAVE_SOCKETPAIR
6048/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006049 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006050 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006051
6052/*ARGSUSED*/
6053static PyObject *
6054socket_socketpair(PyObject *self, PyObject *args)
6055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 PySocketSockObject *s0 = NULL, *s1 = NULL;
6057 SOCKET_T sv[2];
6058 int family, type = SOCK_STREAM, proto = 0;
6059 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006060#ifdef SOCK_CLOEXEC
6061 int *atomic_flag_works = &sock_cloexec_works;
6062#else
6063 int *atomic_flag_works = NULL;
6064#endif
6065 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006066
6067#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006069#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6073 &family, &type, &proto))
6074 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006077 Py_BEGIN_ALLOW_THREADS
6078#ifdef SOCK_CLOEXEC
6079 if (sock_cloexec_works != 0) {
6080 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6081 if (sock_cloexec_works == -1) {
6082 if (ret >= 0) {
6083 sock_cloexec_works = 1;
6084 }
6085 else if (errno == EINVAL) {
6086 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6087 sock_cloexec_works = 0;
6088 ret = socketpair(family, type, proto, sv);
6089 }
6090 }
6091 }
6092 else
6093#endif
6094 {
6095 ret = socketpair(family, type, proto, sv);
6096 }
6097 Py_END_ALLOW_THREADS
6098
6099 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006101
6102 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6103 goto finally;
6104 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6105 goto finally;
6106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 s0 = new_sockobject(sv[0], family, type, proto);
6108 if (s0 == NULL)
6109 goto finally;
6110 s1 = new_sockobject(sv[1], family, type, proto);
6111 if (s1 == NULL)
6112 goto finally;
6113 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006114
6115finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 if (res == NULL) {
6117 if (s0 == NULL)
6118 SOCKETCLOSE(sv[0]);
6119 if (s1 == NULL)
6120 SOCKETCLOSE(sv[1]);
6121 }
6122 Py_XDECREF(s0);
6123 Py_XDECREF(s1);
6124 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006125}
6126
6127PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006128"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006129\n\
6130Create a pair of socket objects from the sockets returned by the platform\n\
6131socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006132The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006133AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006134
6135#endif /* HAVE_SOCKETPAIR */
6136
6137
Guido van Rossum006bf911996-06-12 04:04:55 +00006138static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006139socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006140{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006141 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006142
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006143 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 return NULL;
6145 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006146 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006148 "ntohs: can't convert negative Python int to C "
6149 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 return NULL;
6151 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006152 if (x > 0xffff) {
6153 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6154 "ntohs: Python int too large to convert to C "
6155 "16-bit unsigned integer (The silent truncation "
6156 "is deprecated)",
6157 1)) {
6158 return NULL;
6159 }
6160 }
6161 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006162}
6163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006164PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006165"ntohs(integer) -> integer\n\
6166\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006167Convert a 16-bit unsigned integer from network to host byte order.\n\
6168Note that in case the received integer does not fit in 16-bit unsigned\n\
6169integer, but does fit in a positive C int, it is silently truncated to\n\
617016-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006171However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006172exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006173
6174
Guido van Rossum006bf911996-06-12 04:04:55 +00006175static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006176socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 if (PyLong_Check(arg)) {
6181 x = PyLong_AsUnsignedLong(arg);
6182 if (x == (unsigned long) -1 && PyErr_Occurred())
6183 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006184#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185 {
6186 unsigned long y;
6187 /* only want the trailing 32 bits */
6188 y = x & 0xFFFFFFFFUL;
6189 if (y ^ x)
6190 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006191 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 x = y;
6193 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 }
6196 else
6197 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006198 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006201}
6202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006203PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006204"ntohl(integer) -> integer\n\
6205\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006206Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006207
6208
Guido van Rossum006bf911996-06-12 04:04:55 +00006209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006210socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006211{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006212 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006213
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006214 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 return NULL;
6216 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006217 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006219 "htons: can't convert negative Python int to C "
6220 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 return NULL;
6222 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006223 if (x > 0xffff) {
6224 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6225 "htons: Python int too large to convert to C "
6226 "16-bit unsigned integer (The silent truncation "
6227 "is deprecated)",
6228 1)) {
6229 return NULL;
6230 }
6231 }
6232 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006233}
6234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006235PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006236"htons(integer) -> integer\n\
6237\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006238Convert a 16-bit unsigned integer from host to network byte order.\n\
6239Note that in case the received integer does not fit in 16-bit unsigned\n\
6240integer, but does fit in a positive C int, it is silently truncated to\n\
624116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006242However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006243exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006244
6245
Guido van Rossum006bf911996-06-12 04:04:55 +00006246static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006247socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 if (PyLong_Check(arg)) {
6252 x = PyLong_AsUnsignedLong(arg);
6253 if (x == (unsigned long) -1 && PyErr_Occurred())
6254 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006255#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 {
6257 unsigned long y;
6258 /* only want the trailing 32 bits */
6259 y = x & 0xFFFFFFFFUL;
6260 if (y ^ x)
6261 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006262 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 x = y;
6264 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 }
6267 else
6268 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006269 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 Py_TYPE(arg)->tp_name);
6271 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006272}
6273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006274PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006275"htonl(integer) -> integer\n\
6276\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006277Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006278
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006279/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006281PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006282"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006283\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006284Convert 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 +00006285binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006286
6287static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006288socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006289{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006290#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006292#endif
6293
6294#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006295#if (SIZEOF_INT != 4)
6296#error "Not sure if in_addr_t exists and int is not 32-bits."
6297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 /* Have to use inet_addr() instead */
6299 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006300#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006301 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6304 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006305
Tim Peters1df9fdd2003-02-13 03:13:40 +00006306
6307#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006308
6309#ifdef USE_INET_ATON_WEAKLINK
6310 if (inet_aton != NULL) {
6311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 if (inet_aton(ip_addr, &buf))
6313 return PyBytes_FromStringAndSize((char *)(&buf),
6314 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006315
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006316 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 "illegal IP address string passed to inet_aton");
6318 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006319
Thomas Wouters477c8d52006-05-27 19:21:47 +00006320#ifdef USE_INET_ATON_WEAKLINK
6321 } else {
6322#endif
6323
6324#endif
6325
6326#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328 /* special-case this address as inet_addr might return INADDR_NONE
6329 * for this */
6330 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006331 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006333
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006334 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006338 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339 "illegal IP address string passed to inet_aton");
6340 return NULL;
6341 }
6342 }
6343 return PyBytes_FromStringAndSize((char *) &packed_addr,
6344 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006345
6346#ifdef USE_INET_ATON_WEAKLINK
6347 }
6348#endif
6349
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006350#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006351}
6352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006353PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006354"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006355\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006356Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006357
6358static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006359socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006360{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006361 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006363
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006364 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 return NULL;
6366 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006367
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006368 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006369 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006371 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 return NULL;
6373 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006374
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006375 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6376 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006377
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006378 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006380}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006381
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006382#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006383
6384PyDoc_STRVAR(inet_pton_doc,
6385"inet_pton(af, ip) -> packed IP address string\n\
6386\n\
6387Convert an IP address from string format to a packed string suitable\n\
6388for use with low-level network functions.");
6389
6390static PyObject *
6391socket_inet_pton(PyObject *self, PyObject *args)
6392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006394 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006396#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006397 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006398#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6402 return NULL;
6403 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006404
Martin v. Löwis04697e82004-06-02 12:35:29 +00006405#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006407 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 "can't use AF_INET6, IPv6 is disabled");
6409 return NULL;
6410 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006411#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 retval = inet_pton(af, ip, packed);
6414 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006415 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 return NULL;
6417 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006418 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 "illegal IP address string passed to inet_pton");
6420 return NULL;
6421 } else if (af == AF_INET) {
6422 return PyBytes_FromStringAndSize(packed,
6423 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006424#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 } else if (af == AF_INET6) {
6426 return PyBytes_FromStringAndSize(packed,
6427 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006430 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431 return NULL;
6432 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006433}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006434
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006435PyDoc_STRVAR(inet_ntop_doc,
6436"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6437\n\
6438Convert a packed IP address of the given family to string format.");
6439
6440static PyObject *
6441socket_inet_ntop(PyObject *self, PyObject *args)
6442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006444 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006446#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006447 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006448#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006449 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006450#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006451
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006452 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 return NULL;
6454 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006457 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 PyErr_SetString(PyExc_ValueError,
6459 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006460 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 return NULL;
6462 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006463#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006465 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 PyErr_SetString(PyExc_ValueError,
6467 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006468 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469 return NULL;
6470 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 } else {
6473 PyErr_Format(PyExc_ValueError,
6474 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006475 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 return NULL;
6477 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006478
Коренберг Марк7766b962018-02-13 00:47:42 +05006479 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006480 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6481 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006483 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 return NULL;
6485 } else {
6486 return PyUnicode_FromString(retval);
6487 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006488}
6489
6490#endif /* HAVE_INET_PTON */
6491
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006492/* Python interface to getaddrinfo(host, port). */
6493
6494/*ARGSUSED*/
6495static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006496socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006497{
Victor Stinner77af1722011-05-26 14:05:59 +02006498 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006499 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 struct addrinfo hints, *res;
6501 struct addrinfo *res0 = NULL;
6502 PyObject *hobj = NULL;
6503 PyObject *pobj = (PyObject *)NULL;
6504 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006505 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506 int family, socktype, protocol, flags;
6507 int error;
6508 PyObject *all = (PyObject *)NULL;
6509 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006510
Georg Brandl6083a4b2013-10-14 06:51:46 +02006511 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006514 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 &protocol, &flags)) {
6516 return NULL;
6517 }
6518 if (hobj == Py_None) {
6519 hptr = NULL;
6520 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006521 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522 if (!idna)
6523 return NULL;
6524 assert(PyBytes_Check(idna));
6525 hptr = PyBytes_AS_STRING(idna);
6526 } else if (PyBytes_Check(hobj)) {
6527 hptr = PyBytes_AsString(hobj);
6528 } else {
6529 PyErr_SetString(PyExc_TypeError,
6530 "getaddrinfo() argument 1 must be string or None");
6531 return NULL;
6532 }
6533 if (PyLong_CheckExact(pobj)) {
6534 long value = PyLong_AsLong(pobj);
6535 if (value == -1 && PyErr_Occurred())
6536 goto err;
6537 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6538 pptr = pbuf;
6539 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006540 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006541 if (pptr == NULL)
6542 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006544 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 } else if (pobj == Py_None) {
6546 pptr = (char *)NULL;
6547 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006548 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549 goto err;
6550 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006551#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006552 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006553 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006554 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6555 * This workaround avoids a segfault in libsystem.
6556 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006557 pptr = "00";
6558 }
6559#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006560
6561 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6562 hobj, pobj, family, socktype, protocol) < 0) {
6563 return NULL;
6564 }
6565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 memset(&hints, 0, sizeof(hints));
6567 hints.ai_family = family;
6568 hints.ai_socktype = socktype;
6569 hints.ai_protocol = protocol;
6570 hints.ai_flags = flags;
6571 Py_BEGIN_ALLOW_THREADS
6572 ACQUIRE_GETADDRINFO_LOCK
6573 error = getaddrinfo(hptr, pptr, &hints, &res0);
6574 Py_END_ALLOW_THREADS
6575 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6576 if (error) {
6577 set_gaierror(error);
6578 goto err;
6579 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006580
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006581 all = PyList_New(0);
6582 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 goto err;
6584 for (res = res0; res; res = res->ai_next) {
6585 PyObject *single;
6586 PyObject *addr =
6587 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6588 if (addr == NULL)
6589 goto err;
6590 single = Py_BuildValue("iiisO", res->ai_family,
6591 res->ai_socktype, res->ai_protocol,
6592 res->ai_canonname ? res->ai_canonname : "",
6593 addr);
6594 Py_DECREF(addr);
6595 if (single == NULL)
6596 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006597
Zackery Spytz4c596d52018-11-14 15:39:01 -07006598 if (PyList_Append(all, single)) {
6599 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006601 }
6602 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 }
6604 Py_XDECREF(idna);
6605 if (res0)
6606 freeaddrinfo(res0);
6607 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006608 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 Py_XDECREF(all);
6610 Py_XDECREF(idna);
6611 if (res0)
6612 freeaddrinfo(res0);
6613 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006614}
6615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006616PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006617"getaddrinfo(host, port [, family, type, proto, flags])\n\
6618 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006619\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006620Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006621
6622/* Python interface to getnameinfo(sa, flags). */
6623
6624/*ARGSUSED*/
6625static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006626socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 PyObject *sa = (PyObject *)NULL;
6629 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006630 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006631 int port;
6632 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6634 struct addrinfo hints, *res = NULL;
6635 int error;
6636 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006637 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 flags = flowinfo = scope_id = 0;
6640 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6641 return NULL;
6642 if (!PyTuple_Check(sa)) {
6643 PyErr_SetString(PyExc_TypeError,
6644 "getnameinfo() argument 1 must be a tuple");
6645 return NULL;
6646 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006647 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006649 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006651 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006652 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006653 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006654 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006655 return NULL;
6656 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006657
6658 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6659 return NULL;
6660 }
6661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6663 memset(&hints, 0, sizeof(hints));
6664 hints.ai_family = AF_UNSPEC;
6665 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006666 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 Py_BEGIN_ALLOW_THREADS
6668 ACQUIRE_GETADDRINFO_LOCK
6669 error = getaddrinfo(hostp, pbuf, &hints, &res);
6670 Py_END_ALLOW_THREADS
6671 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6672 if (error) {
6673 set_gaierror(error);
6674 goto fail;
6675 }
6676 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006677 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678 "sockaddr resolved to multiple addresses");
6679 goto fail;
6680 }
6681 switch (res->ai_family) {
6682 case AF_INET:
6683 {
6684 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006685 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 "IPv4 sockaddr must be 2 tuple");
6687 goto fail;
6688 }
6689 break;
6690 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006691#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006692 case AF_INET6:
6693 {
6694 struct sockaddr_in6 *sin6;
6695 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006696 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 sin6->sin6_scope_id = scope_id;
6698 break;
6699 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006702 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6704 if (error) {
6705 set_gaierror(error);
6706 goto fail;
6707 }
Victor Stinner72400302016-01-28 15:41:01 +01006708
6709 name = sock_decode_hostname(hbuf);
6710 if (name == NULL)
6711 goto fail;
6712 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006713
6714fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715 if (res)
6716 freeaddrinfo(res);
6717 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006718}
6719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006720PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006721"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006722\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006723Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006724
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006725
6726/* Python API to getting and setting the default timeout value. */
6727
6728static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306729socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006730{
Victor Stinner71694d52015-03-28 01:18:54 +01006731 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006732 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 }
Victor Stinner71694d52015-03-28 01:18:54 +01006734 else {
6735 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6736 return PyFloat_FromDouble(seconds);
6737 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006738}
6739
6740PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006741"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006742\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006743Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006744A value of None indicates that new socket objects have no timeout.\n\
6745When the socket module is first imported, the default is None.");
6746
6747static PyObject *
6748socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6749{
Victor Stinner71694d52015-03-28 01:18:54 +01006750 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006751
Victor Stinner71694d52015-03-28 01:18:54 +01006752 if (socket_parse_timeout(&timeout, arg) < 0)
6753 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006756
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006757 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006758}
6759
6760PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006761"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006762\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006763Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006764A value of None indicates that new socket objects have no timeout.\n\
6765When the socket module is first imported, the default is None.");
6766
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006767#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006768/* Python API for getting interface indices and names */
6769
6770static PyObject *
6771socket_if_nameindex(PyObject *self, PyObject *arg)
6772{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006773 PyObject *list = PyList_New(0);
6774 if (list == NULL) {
6775 return NULL;
6776 }
6777#ifdef MS_WINDOWS
6778 PMIB_IF_TABLE2 tbl;
6779 int ret;
6780 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6781 Py_DECREF(list);
6782 // ret is used instead of GetLastError()
6783 return PyErr_SetFromWindowsErr(ret);
6784 }
6785 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6786 MIB_IF_ROW2 r = tbl->Table[i];
6787 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6788 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6789 Py_ARRAY_LENGTH(buf)))) {
6790 Py_DECREF(list);
6791 FreeMibTable(tbl);
6792 // ret is used instead of GetLastError()
6793 return PyErr_SetFromWindowsErr(ret);
6794 }
6795 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6796 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6797 Py_XDECREF(tuple);
6798 Py_DECREF(list);
6799 FreeMibTable(tbl);
6800 return NULL;
6801 }
6802 Py_DECREF(tuple);
6803 }
6804 FreeMibTable(tbl);
6805 return list;
6806#else
Charles-François Natali60713592011-05-20 16:55:06 +02006807 int i;
6808 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006809
Charles-François Natali60713592011-05-20 16:55:06 +02006810 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006811 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006812 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006813 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006814 return NULL;
6815 }
6816
Gregory P. Smithb474e672018-12-30 17:05:36 -08006817#ifdef _Py_MEMORY_SANITIZER
6818 __msan_unpoison(ni, sizeof(ni));
6819 __msan_unpoison(&ni[0], sizeof(ni[0]));
6820#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006821 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006822#ifdef _Py_MEMORY_SANITIZER
6823 /* This one isn't the end sentinel, the next one must exist. */
6824 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6825 /* Otherwise Py_BuildValue internals are flagged by MSan when
6826 they access the not-msan-tracked if_name string data. */
6827 {
6828 char *to_sanitize = ni[i].if_name;
6829 do {
6830 __msan_unpoison(to_sanitize, 1);
6831 } while (*to_sanitize++ != '\0');
6832 }
6833#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006834 PyObject *ni_tuple = Py_BuildValue("IO&",
6835 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006836
6837 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6838 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006839 Py_DECREF(list);
6840 if_freenameindex(ni);
6841 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006842 }
6843 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006844 }
6845
6846 if_freenameindex(ni);
6847 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006848#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006849}
6850
6851PyDoc_STRVAR(if_nameindex_doc,
6852"if_nameindex()\n\
6853\n\
6854Returns a list of network interface information (index, name) tuples.");
6855
Charles-François Natali60713592011-05-20 16:55:06 +02006856static PyObject *
6857socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006858{
Charles-François Natali60713592011-05-20 16:55:06 +02006859 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006860#ifdef MS_WINDOWS
6861 NET_IFINDEX index;
6862#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006863 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006864#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006865 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6866 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006867 return NULL;
6868
Charles-François Natali60713592011-05-20 16:55:06 +02006869 index = if_nametoindex(PyBytes_AS_STRING(oname));
6870 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006871 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006872 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006873 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006874 return NULL;
6875 }
6876
6877 return PyLong_FromUnsignedLong(index);
6878}
6879
6880PyDoc_STRVAR(if_nametoindex_doc,
6881"if_nametoindex(if_name)\n\
6882\n\
6883Returns the interface index corresponding to the interface name if_name.");
6884
Charles-François Natali60713592011-05-20 16:55:06 +02006885static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006886socket_if_indextoname(PyObject *self, PyObject *arg)
6887{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006888#ifdef MS_WINDOWS
6889 NET_IFINDEX index;
6890#else
Charles-François Natali60713592011-05-20 16:55:06 +02006891 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006892#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006893 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006894
Charles-François Natali60713592011-05-20 16:55:06 +02006895 index = PyLong_AsUnsignedLong(arg);
6896 if (index == (unsigned long) -1)
6897 return NULL;
6898
6899 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006900 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006901 return NULL;
6902 }
6903
Charles-François Natali60713592011-05-20 16:55:06 +02006904 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006905}
6906
6907PyDoc_STRVAR(if_indextoname_doc,
6908"if_indextoname(if_index)\n\
6909\n\
6910Returns the interface name corresponding to the interface index if_index.");
6911
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006912#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006913
6914
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006915#ifdef CMSG_LEN
6916/* Python interface to CMSG_LEN(length). */
6917
6918static PyObject *
6919socket_CMSG_LEN(PyObject *self, PyObject *args)
6920{
6921 Py_ssize_t length;
6922 size_t result;
6923
6924 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6925 return NULL;
6926 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6927 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6928 return NULL;
6929 }
6930 return PyLong_FromSize_t(result);
6931}
6932
6933PyDoc_STRVAR(CMSG_LEN_doc,
6934"CMSG_LEN(length) -> control message length\n\
6935\n\
6936Return the total length, without trailing padding, of an ancillary\n\
6937data item with associated data of the given length. This value can\n\
6938often be used as the buffer size for recvmsg() to receive a single\n\
6939item of ancillary data, but RFC 3542 requires portable applications to\n\
6940use CMSG_SPACE() and thus include space for padding, even when the\n\
6941item will be the last in the buffer. Raises OverflowError if length\n\
6942is outside the permissible range of values.");
6943
6944
6945#ifdef CMSG_SPACE
6946/* Python interface to CMSG_SPACE(length). */
6947
6948static PyObject *
6949socket_CMSG_SPACE(PyObject *self, PyObject *args)
6950{
6951 Py_ssize_t length;
6952 size_t result;
6953
6954 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6955 return NULL;
6956 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6957 PyErr_SetString(PyExc_OverflowError,
6958 "CMSG_SPACE() argument out of range");
6959 return NULL;
6960 }
6961 return PyLong_FromSize_t(result);
6962}
6963
6964PyDoc_STRVAR(CMSG_SPACE_doc,
6965"CMSG_SPACE(length) -> buffer size\n\
6966\n\
6967Return the buffer size needed for recvmsg() to receive an ancillary\n\
6968data item with associated data of the given length, along with any\n\
6969trailing padding. The buffer space needed to receive multiple items\n\
6970is the sum of the CMSG_SPACE() values for their associated data\n\
6971lengths. Raises OverflowError if length is outside the permissible\n\
6972range of values.");
6973#endif /* CMSG_SPACE */
6974#endif /* CMSG_LEN */
6975
6976
Guido van Rossum30a685f1991-06-27 15:51:29 +00006977/* List of functions exported by this module. */
6978
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006979static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 {"gethostbyname", socket_gethostbyname,
6981 METH_VARARGS, gethostbyname_doc},
6982 {"gethostbyname_ex", socket_gethostbyname_ex,
6983 METH_VARARGS, ghbn_ex_doc},
6984 {"gethostbyaddr", socket_gethostbyaddr,
6985 METH_VARARGS, gethostbyaddr_doc},
6986 {"gethostname", socket_gethostname,
6987 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006988#ifdef HAVE_SETHOSTNAME
6989 {"sethostname", socket_sethostname,
6990 METH_VARARGS, sethostname_doc},
6991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992 {"getservbyname", socket_getservbyname,
6993 METH_VARARGS, getservbyname_doc},
6994 {"getservbyport", socket_getservbyport,
6995 METH_VARARGS, getservbyport_doc},
6996 {"getprotobyname", socket_getprotobyname,
6997 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006998 {"close", socket_close,
6999 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007000#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001 {"dup", socket_dup,
7002 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007003#endif
Dave Cole331708b2004-08-09 04:51:41 +00007004#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005 {"socketpair", socket_socketpair,
7006 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00007007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008 {"ntohs", socket_ntohs,
7009 METH_VARARGS, ntohs_doc},
7010 {"ntohl", socket_ntohl,
7011 METH_O, ntohl_doc},
7012 {"htons", socket_htons,
7013 METH_VARARGS, htons_doc},
7014 {"htonl", socket_htonl,
7015 METH_O, htonl_doc},
7016 {"inet_aton", socket_inet_aton,
7017 METH_VARARGS, inet_aton_doc},
7018 {"inet_ntoa", socket_inet_ntoa,
7019 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03007020#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021 {"inet_pton", socket_inet_pton,
7022 METH_VARARGS, inet_pton_doc},
7023 {"inet_ntop", socket_inet_ntop,
7024 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007025#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02007026 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00007027 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028 {"getnameinfo", socket_getnameinfo,
7029 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05307030 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031 METH_NOARGS, getdefaulttimeout_doc},
7032 {"setdefaulttimeout", socket_setdefaulttimeout,
7033 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06007034#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07007035 {"if_nameindex", socket_if_nameindex,
7036 METH_NOARGS, if_nameindex_doc},
7037 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02007038 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07007039 {"if_indextoname", socket_if_indextoname,
7040 METH_O, if_indextoname_doc},
7041#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007042#ifdef CMSG_LEN
7043 {"CMSG_LEN", socket_CMSG_LEN,
7044 METH_VARARGS, CMSG_LEN_doc},
7045#ifdef CMSG_SPACE
7046 {"CMSG_SPACE", socket_CMSG_SPACE,
7047 METH_VARARGS, CMSG_SPACE_doc},
7048#endif
7049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007051};
7052
Guido van Rossum30a685f1991-06-27 15:51:29 +00007053
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007054#ifdef MS_WINDOWS
7055#define OS_INIT_DEFINED
7056
7057/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007058
7059static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007060os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007063}
7064
7065static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007066os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007068 WSADATA WSAData;
7069 int ret;
7070 ret = WSAStartup(0x0101, &WSAData);
7071 switch (ret) {
7072 case 0: /* No error */
7073 Py_AtExit(os_cleanup);
7074 return 1; /* Success */
7075 case WSASYSNOTREADY:
7076 PyErr_SetString(PyExc_ImportError,
7077 "WSAStartup failed: network not ready");
7078 break;
7079 case WSAVERNOTSUPPORTED:
7080 case WSAEINVAL:
7081 PyErr_SetString(
7082 PyExc_ImportError,
7083 "WSAStartup failed: requested version not supported");
7084 break;
7085 default:
7086 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7087 break;
7088 }
7089 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007090}
7091
Guido van Rossum8d665e61996-06-26 18:22:49 +00007092#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007093
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007094
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007095
7096#ifndef OS_INIT_DEFINED
7097static int
7098os_init(void)
7099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007101}
7102#endif
7103
7104
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007105/* C API table - always add new things to the end for binary
7106 compatibility. */
7107static
7108PySocketModule_APIObject PySocketModuleAPI =
7109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007111 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007113};
7114
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007115
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007116/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007117
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007118 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007119 "socket.py" which implements some additional functionality.
7120 The import of "_socket" may fail with an ImportError exception if
7121 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007122 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007123 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007124*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007125
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007126PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007127"Implementation module for socket operations.\n\
7128\n\
7129See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007130
Martin v. Löwis1a214512008-06-11 05:26:20 +00007131static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132 PyModuleDef_HEAD_INIT,
7133 PySocket_MODULE_NAME,
7134 socket_doc,
7135 -1,
7136 socket_methods,
7137 NULL,
7138 NULL,
7139 NULL,
7140 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007141};
7142
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007143PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007144PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 if (!os_init())
7149 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007150
Victor Stinnerdaf45552013-08-28 00:53:59 +02007151#ifdef MS_WINDOWS
7152 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007153 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007154 }
7155#endif
7156
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007157 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158 m = PyModule_Create(&socketmodule);
7159 if (m == NULL)
7160 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007161
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007162 Py_INCREF(PyExc_OSError);
7163 PySocketModuleAPI.error = PyExc_OSError;
7164 Py_INCREF(PyExc_OSError);
7165 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007167 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 if (socket_herror == NULL)
7169 return NULL;
7170 Py_INCREF(socket_herror);
7171 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007172 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007173 NULL);
7174 if (socket_gaierror == NULL)
7175 return NULL;
7176 Py_INCREF(socket_gaierror);
7177 PyModule_AddObject(m, "gaierror", socket_gaierror);
7178 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007179 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 if (socket_timeout == NULL)
7181 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007182 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183 Py_INCREF(socket_timeout);
7184 PyModule_AddObject(m, "timeout", socket_timeout);
7185 Py_INCREF((PyObject *)&sock_type);
7186 if (PyModule_AddObject(m, "SocketType",
7187 (PyObject *)&sock_type) != 0)
7188 return NULL;
7189 Py_INCREF((PyObject *)&sock_type);
7190 if (PyModule_AddObject(m, "socket",
7191 (PyObject *)&sock_type) != 0)
7192 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007193
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007194#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007196#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 Py_INCREF(has_ipv6);
7200 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 /* Export C API */
7203 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7204 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7205 ) != 0)
7206 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007209#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007211#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007213#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007215#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007216#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007219#endif
7220#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007222#endif
7223#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007226#endif
7227#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007230#endif
7231#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007234#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007235#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007238#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007239#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007242#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007243#ifdef HAVE_SOCKADDR_ALG
7244 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7245#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007246#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007249#endif
7250#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007252#endif
7253#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007256#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007257#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007260#endif
7261#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007264#endif
7265#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007268#endif
7269#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007272#endif
7273#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, AF_NETLINK);
7276 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007277#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007279#endif
7280#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007282#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7284 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007285#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007287#endif
7288#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007290#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007291#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007293#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007294#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007296#endif
7297#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007299#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007301#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007303#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007304#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007306#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007307#ifdef NETLINK_CRYPTO
7308 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7309#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007310#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007311
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007312#ifdef AF_QIPCRTR
7313 /* Qualcomm IPCROUTER */
7314 PyModule_AddIntMacro(m, AF_QIPCRTR);
7315#endif
7316
caaveryeffc12f2017-09-06 18:18:10 -04007317#ifdef AF_VSOCK
7318 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7319 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7320 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7321 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7322 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7323 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7324 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7325 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7326 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7327#endif
7328
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007329#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007332#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007333#ifdef AF_LINK
7334 PyModule_AddIntMacro(m, AF_LINK);
7335#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007336#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007339#endif
7340#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007343#endif
7344#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007347#endif
7348#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007349 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007351#endif
7352#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007355#endif
7356#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007359#endif
7360#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007361 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007363#endif
7364#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007367#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007368
Hye-Shik Chang81268602004-02-02 06:05:24 +00007369#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007371#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007373#endif /* BTPROTO_L2CAP */
7374#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, BTPROTO_HCI);
7376 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007377#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007379#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007382#endif /* !__FreeBSD__ */
7383#endif /* !__NetBSD__ && !__DragonFly__ */
7384#endif /* BTPROTO_HCI */
7385#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007387#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7389 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007390#ifdef BTPROTO_SCO
7391 PyModule_AddIntMacro(m, BTPROTO_SCO);
7392#endif /* BTPROTO_SCO */
7393#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007394
Charles-François Natali47413c12011-10-06 19:47:44 +02007395#ifdef AF_CAN
7396 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007398#endif
7399#ifdef PF_CAN
7400 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007402#endif
7403
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007404/* Reliable Datagram Sockets */
7405#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007407#endif
7408#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007410#endif
7411
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007412/* Kernel event messages */
7413#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007414 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007415#endif
7416#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007418#endif
7419
Antoine Pitroub156a462010-10-27 20:13:57 +00007420#ifdef AF_PACKET
7421 PyModule_AddIntMacro(m, AF_PACKET);
7422#endif
7423#ifdef PF_PACKET
7424 PyModule_AddIntMacro(m, PF_PACKET);
7425#endif
7426#ifdef PACKET_HOST
7427 PyModule_AddIntMacro(m, PACKET_HOST);
7428#endif
7429#ifdef PACKET_BROADCAST
7430 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7431#endif
7432#ifdef PACKET_MULTICAST
7433 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7434#endif
7435#ifdef PACKET_OTHERHOST
7436 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7437#endif
7438#ifdef PACKET_OUTGOING
7439 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7440#endif
7441#ifdef PACKET_LOOPBACK
7442 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7443#endif
7444#ifdef PACKET_FASTROUTE
7445 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007446#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007447
Christian Heimes043d6f62008-01-07 17:19:16 +00007448#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007451 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7453 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7454 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007455
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7457 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7458 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, SOL_TIPC);
7462 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7463 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7464 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7465 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007466
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7468 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7469 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7470 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7474 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007475#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007478#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7480 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7481 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7482 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7483 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7484 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007485#endif
7486
Christian Heimesdffa3942016-09-05 23:54:41 +02007487#ifdef HAVE_SOCKADDR_ALG
7488 /* Socket options */
7489 PyModule_AddIntMacro(m, ALG_SET_KEY);
7490 PyModule_AddIntMacro(m, ALG_SET_IV);
7491 PyModule_AddIntMacro(m, ALG_SET_OP);
7492 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7493 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7494 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7495
7496 /* Operations */
7497 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7498 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7499 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7500 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7501#endif
7502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, SOCK_STREAM);
7505 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007506/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007507#ifdef SOCK_RAW
7508 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007510#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007512#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007514#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007515#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007517#endif
7518#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007520#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007530#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007531#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007533#endif
7534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007538#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007541#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007547#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007550#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007552#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007553#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007554#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007556#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007570#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007584#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007585#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007587#endif
7588#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007590#endif
7591#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007593#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007594#ifdef SO_PASSSEC
7595 PyModule_AddIntMacro(m, SO_PASSSEC);
7596#endif
7597#ifdef SO_PEERSEC
7598 PyModule_AddIntMacro(m, SO_PEERSEC);
7599#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007600#ifdef SO_BINDTODEVICE
7601 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7602#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007603#ifdef SO_PRIORITY
7604 PyModule_AddIntMacro(m, SO_PRIORITY);
7605#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007606#ifdef SO_MARK
7607 PyModule_AddIntMacro(m, SO_MARK);
7608#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007609#ifdef SO_DOMAIN
7610 PyModule_AddIntMacro(m, SO_DOMAIN);
7611#endif
7612#ifdef SO_PROTOCOL
7613 PyModule_AddIntMacro(m, SO_PROTOCOL);
7614#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616 /* Maximum number of connections for "listen" */
7617#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007619#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007620 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007621#endif
7622
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007623 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007624#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007626#endif
7627#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007629#endif
7630#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007632#endif
7633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007634 /* Flags for send, recv */
7635#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007641#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007664#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007665#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007667#endif
7668#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007670#endif
7671#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007673#endif
7674#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007676#endif
7677#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007679#endif
7680#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007682#endif
7683#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007685#endif
7686#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007687 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007688#endif
7689#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007690 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007691#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007692#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007694#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 /* Protocol level and numbers, usable for [gs]etsockopt */
7697#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007702#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007708#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007711#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007717#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007725#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007726 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007728 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007729#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007730#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007731 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007732#endif
7733#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007734 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7735 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007736#endif
7737#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7739 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7740 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007741
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7743 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7744 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007745#ifdef CAN_ISOTP
7746 PyModule_AddIntMacro(m, CAN_ISOTP);
7747#endif
karl ding360371f2020-04-29 15:31:19 -07007748#ifdef CAN_J1939
7749 PyModule_AddIntMacro(m, CAN_J1939);
7750#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007751#endif
7752#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7754 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7755 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7756 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007757#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007758#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7759 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7760#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007761#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7762 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7763#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007764#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007765 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007766
7767 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007768 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7769 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7770 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7771 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7772 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7773 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7774 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7775 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7776 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7777 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7778 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7779 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007780
7781 /* BCM flags */
7782 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7783 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7784 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7785 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7786 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7787 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7788 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7789 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7790 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7791 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7792 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7793#ifdef CAN_FD_FRAME
7794 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7795 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7796#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007797#endif
karl ding360371f2020-04-29 15:31:19 -07007798#ifdef HAVE_LINUX_CAN_J1939_H
7799 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7800 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7801 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7802 PyModule_AddIntMacro(m, J1939_NO_NAME);
7803 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7804 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7805 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7806 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7807 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7808 PyModule_AddIntMacro(m, J1939_NO_PGN);
7809
7810 /* J1939 socket options */
7811 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7812 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7813 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7814 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7815
7816 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7817 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7818 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7819 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7820
7821 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7822 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7823
7824 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7825 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7826
7827 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7828#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007829#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007830 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007831#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007832#ifdef HAVE_SOCKADDR_ALG
7833 PyModule_AddIntMacro(m, SOL_ALG);
7834#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007835#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007837#endif
7838#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007839 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007840#endif
7841#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007842 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007843#endif
7844#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007845 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007846#endif
7847#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007848 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007849#endif
7850#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007851 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007853#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007854 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007855#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007856 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007858#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007861#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007863#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007864 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007866#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007867 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007869#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007872#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007875#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007876 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007878#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007883#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007884 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007886#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007887 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007889#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007890 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007892#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007893 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007894#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007895 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007896#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007897#ifdef IPPROTO_UDPLITE
7898 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7899 #ifndef UDPLITE_SEND_CSCOV
7900 #define UDPLITE_SEND_CSCOV 10
7901 #endif
7902 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7903 #ifndef UDPLITE_RECV_CSCOV
7904 #define UDPLITE_RECV_CSCOV 11
7905 #endif
7906 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007908#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007909 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007912 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007914#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007915 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007918 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007920#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007921 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007923#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007924 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007926#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007927 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007929#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007930 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007932#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007933 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007936 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007938#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007939 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007941#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007942 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007945 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007947#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007948 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007950#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007953#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007954 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007956#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007959#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007960 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007962#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007963 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007964#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007965#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007966 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007968#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007970#endif
7971/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007972#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007974#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007975 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007977#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007978 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007979#endif
7980
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007981#ifdef MS_WINDOWS
7982 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7983 PyModule_AddIntMacro(m, IPPROTO_ST);
7984 PyModule_AddIntMacro(m, IPPROTO_CBT);
7985 PyModule_AddIntMacro(m, IPPROTO_IGP);
7986 PyModule_AddIntMacro(m, IPPROTO_RDP);
7987 PyModule_AddIntMacro(m, IPPROTO_PGM);
7988 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7989 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7990#endif
7991
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007992#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007993 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007994#endif
7995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007996 /* Some port configuration */
7997#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007998 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007999#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008000 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008002#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008003 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008004#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008005 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008006#endif
8007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008008 /* Some reserved IP v.4 addresses */
8009#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008010 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008012 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008014#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008015 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008016#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008017 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008019#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008020 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008021#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008022 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008023#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008024#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008025 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008026#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008029#ifdef INADDR_ALLHOSTS_GROUP
8030 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
8031 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008032#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008033 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008035#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008036 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008037#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008038 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008040#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008042#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008043 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008044#endif
8045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008046 /* IPv4 [gs]etsockopt options */
8047#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008048 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008050#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008051 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008053#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008054 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008056#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008057 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008059#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008062#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008063 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008065#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008066 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008068#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008071#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008072 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008074#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008075 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008077#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008078 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008080#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008081 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008083#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008084 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008086#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008087 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008089#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008090 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008092#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008093 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008094#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008095#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008096 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008097#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008099 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8100#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008103#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008106#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008109#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008112#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008115#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008117#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008118 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008119#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008120 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008122 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008123#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008124 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008125#endif
8126#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008127 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008128#endif
8129#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008130 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008131#endif
8132#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008133 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008134#endif
8135#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008136 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008137#endif
8138#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008139 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008140#endif
8141#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008142 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008143#endif
8144#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008146#endif
8147#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008149#endif
8150#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008151 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008152#endif
8153#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008154 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008155#endif
8156#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008157 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008158#endif
8159#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008160 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008161#endif
8162#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008163 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008164#endif
8165#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008166 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008167#endif
8168#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008169 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008170#endif
8171#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008172 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008173#endif
8174#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008175 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008176#endif
8177#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008178 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008179#endif
8180#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008181 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008182#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008184 /* TCP options */
8185#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008186 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008188#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008189 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008191#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008192 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008194#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008195 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008197#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008198 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008200#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008201 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008203#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008204 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008206#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008207 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008209#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008210 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008212#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008213 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008215#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008216 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008218#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008219 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008220#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008221#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008222 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008223#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008224#ifdef TCP_CONGESTION
8225 PyModule_AddIntMacro(m, TCP_CONGESTION);
8226#endif
8227#ifdef TCP_USER_TIMEOUT
8228 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8229#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008230#ifdef TCP_NOTSENT_LOWAT
8231 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8232#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008234 /* IPX options */
8235#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008236 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008237#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008238
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008239/* Reliable Datagram Sockets */
8240#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008241 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008242#endif
8243#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008244 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008245#endif
8246#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008248#endif
8249#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008250 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008251#endif
8252#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008253 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008254#endif
8255#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008256 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008257#endif
8258#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008259 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008260#endif
8261#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008263#endif
8264#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008265 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008266#endif
8267#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008268 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008269#endif
8270#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008271 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008272#endif
8273#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008274 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008275#endif
8276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008277 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008278#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008279 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008280#endif
8281#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008282 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008283#endif
8284#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008285 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008286#endif
8287#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008288 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008289#endif
8290#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008291 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008292#endif
8293#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008294 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008295#endif
8296#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008297 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008298#endif
8299#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008300 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008301#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008302#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008303 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008304#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008305#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008306 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008307#endif
8308#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008309 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008310#endif
8311#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008312 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008313#endif
8314#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008315 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008316#endif
8317#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008318 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008319#endif
8320#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008321 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008322#endif
8323#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008324 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008325#endif
8326#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008327 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008328#endif
8329#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008330 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008331#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008332#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008333 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008334#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008335#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008336 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008337#endif
8338#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008339 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008340#endif
8341#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008342 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008343#endif
8344#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008345 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008346#endif
8347#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008348 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008349#endif
8350#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008351 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008352#endif
8353#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008354 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008355#endif
8356#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008357 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008358#endif
8359#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008360 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008361#endif
8362#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008363 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008364#endif
8365#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008366 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008367#endif
8368#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008369 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008370#endif
8371#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008372 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008373#endif
8374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008375 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008376#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008377 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008378#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008379 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008380#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008381 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008382#endif
8383#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008384 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008385#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008386 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008387#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008388 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008389#endif
8390#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008391 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008392#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008393 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008394#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008395 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008396#endif
8397
Christian Heimesfaf2f632008-01-06 16:59:19 +00008398#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008399 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008400 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8401#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008402 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008403#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008404 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008405 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8406#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008407 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008408#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008409 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008410 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008411 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008412 PyObject *tmp;
8413 tmp = PyLong_FromUnsignedLong(codes[i]);
8414 if (tmp == NULL)
8415 return NULL;
8416 PyModule_AddObject(m, names[i], tmp);
8417 }
8418 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008419 PyModule_AddIntMacro(m, RCVALL_OFF);
8420 PyModule_AddIntMacro(m, RCVALL_ON);
8421 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008422#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008423 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008424#endif
8425#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008426 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008427#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008428#endif /* _MSTCPIP_ */
8429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008430 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008431#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008432 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008433#endif
animalize19e7d482018-02-27 02:10:36 +08008434
8435#ifdef MS_WINDOWS
8436 /* remove some flags on older version Windows during run-time */
8437 remove_unusable_flags(m);
8438#endif
8439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008440 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008441}