blob: 9db8535eb34349986da4c2a60546f5a19df3a875 [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
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000476#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000477#define EAFNOSUPPORT WSAEAFNOSUPPORT
478#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000480
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000481#ifndef SOCKETCLOSE
482#define SOCKETCLOSE close
483#endif
484
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000485#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000486#define USE_BLUETOOTH 1
487#if defined(__FreeBSD__)
488#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
489#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000490#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000491#define SOL_HCI SOL_HCI_RAW
492#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000493#define sockaddr_l2 sockaddr_l2cap
494#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000495#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000496#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
497#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000498#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000499#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000500#define sockaddr_l2 sockaddr_bt
501#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000502#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000503#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000504#define SOL_HCI BTPROTO_HCI
505#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
507#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000508#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000509#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000510#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000511#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
512#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000513#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000514#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
515#endif
516#endif
517
Greg Bowser8fbece12019-08-02 16:29:52 -0400518#ifdef MS_WINDOWS
519#define sockaddr_rc SOCKADDR_BTH_REDEF
520
521#define USE_BLUETOOTH 1
522#define AF_BLUETOOTH AF_BTH
523#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
524#define _BT_RC_MEMB(sa, memb) ((sa)->memb)
525#endif
526
Charles-François Natali8b759652011-12-23 16:44:51 +0100527/* Convert "sock_addr_t *" to "struct sockaddr *". */
528#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000529
Martin v. Löwise9416172003-05-03 10:12:45 +0000530/*
531 * Constants for getnameinfo()
532 */
533#if !defined(NI_MAXHOST)
534#define NI_MAXHOST 1025
535#endif
536#if !defined(NI_MAXSERV)
537#define NI_MAXSERV 32
538#endif
539
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000540#ifndef INVALID_SOCKET /* MS defines this */
541#define INVALID_SOCKET (-1)
542#endif
543
Charles-François Natali0cc86852013-09-13 19:53:08 +0200544#ifndef INADDR_NONE
545#define INADDR_NONE (-1)
546#endif
547
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000548/* XXX There's a problem here: *static* functions are not supposed to have
549 a Py prefix (or use CapitalizedWords). Later... */
550
Guido van Rossum30a685f1991-06-27 15:51:29 +0000551/* Global variable holding the exception type for errors detected
552 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000553static PyObject *socket_herror;
554static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000555static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556
Tim Peters643a7fc2002-02-17 04:13:21 +0000557/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000558 The sock_type variable contains pointers to various functions,
559 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000560 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000561static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000562
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000563#if defined(HAVE_POLL_H)
564#include <poll.h>
565#elif defined(HAVE_SYS_POLL_H)
566#include <sys/poll.h>
567#endif
568
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000569/* Largest value to try to store in a socklen_t (used when handling
570 ancillary data). POSIX requires socklen_t to hold at least
571 (2**31)-1 and recommends against storing larger values, but
572 socklen_t was originally int in the BSD interface, so to be on the
573 safe side we use the smaller of (2**31)-1 and INT_MAX. */
574#if INT_MAX > 0x7fffffff
575#define SOCKLEN_T_LIMIT 0x7fffffff
576#else
577#define SOCKLEN_T_LIMIT INT_MAX
578#endif
579
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200580#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000581/* Instead of select(), we'll use poll() since poll() works on any fd. */
582#define IS_SELECTABLE(s) 1
583/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000584#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200585/* If there's no timeout left, we don't have to call select, so it's a safe,
586 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100587#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000588#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000589
590static PyObject*
591select_error(void)
592{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200593 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000595}
596
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000597#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000598#ifndef WSAEAGAIN
599#define WSAEAGAIN WSAEWOULDBLOCK
600#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000601#define CHECK_ERRNO(expected) \
602 (WSAGetLastError() == WSA ## expected)
603#else
604#define CHECK_ERRNO(expected) \
605 (errno == expected)
606#endif
607
Victor Stinnerdaf45552013-08-28 00:53:59 +0200608#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200609# define GET_SOCK_ERROR WSAGetLastError()
610# define SET_SOCK_ERROR(err) WSASetLastError(err)
611# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
612# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
613#else
614# define GET_SOCK_ERROR errno
615# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
616# define SOCK_TIMEOUT_ERR EWOULDBLOCK
617# define SOCK_INPROGRESS_ERR EINPROGRESS
618#endif
619
Erik Janssens874809e2018-09-05 08:29:42 +0200620#ifdef _MSC_VER
621# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
622#else
623# define SUPPRESS_DEPRECATED_CALL
624#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200625
626#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200627/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
628static int support_wsa_no_inherit = -1;
629#endif
630
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631/* Convenience function to raise an error according to errno
632 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633
Guido van Rossum73624e91994-10-10 17:59:00 +0000634static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000635set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000637#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 int err_no = WSAGetLastError();
639 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
640 recognizes the error codes used by both GetLastError() and
641 WSAGetLastError */
642 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200643 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000644#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000645
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200646 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647}
648
Guido van Rossum30a685f1991-06-27 15:51:29 +0000649
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000651set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000654
655#ifdef HAVE_HSTRERROR
Andy Lestere63117a2020-03-05 22:43:36 -0600656 v = Py_BuildValue("(is)", h_error, hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 if (v != NULL) {
661 PyErr_SetObject(socket_herror, v);
662 Py_DECREF(v);
663 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666}
667
668
669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000670set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673
Martin v. Löwis272cb402002-03-01 08:31:07 +0000674#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* EAI_SYSTEM is not available on Windows XP. */
676 if (error == EAI_SYSTEM)
677 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000678#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000679
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000680#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000682#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 if (v != NULL) {
686 PyErr_SetObject(socket_gaierror, v);
687 Py_DECREF(v);
688 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000691}
692
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000693/* Function to perform the setting of socket blocking mode
694 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000695static int
696internal_setblocking(PySocketSockObject *s, int block)
697{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400698 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200699#ifdef MS_WINDOWS
700 u_long arg;
701#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100702#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100703 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100704 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000705#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000708#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100709#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200711 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400712 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100713#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200715 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400716 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100718 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 else
Victor Stinner9a954832013-12-04 00:41:24 +0100720 new_delay_flag = delay_flag | O_NONBLOCK;
721 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200722 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400723 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100724#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000725#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200726 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200727 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400728 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000729#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400730
731 result = 0;
732
733 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000735
Yury Selivanovfa22b292016-10-18 16:03:52 -0400736 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200737#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400738 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200739#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400740 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200741#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400742 }
743
744 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000745}
746
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000747static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200748internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
749 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100752#ifdef HAVE_POLL
753 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200754 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100755#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200756 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200757 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100758#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000759
Victor Stinnerb7df3142015-03-27 22:59:32 +0100760 /* must be called with the GIL held */
761 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100762
Victor Stinner416f2e62015-03-31 13:56:29 +0200763 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200764 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200767 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 /* Prefer poll, if available, since you can poll() any fd
771 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000772#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100773 pollfd.fd = s->sock_fd;
774 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 if (connect) {
776 /* On Windows, the socket becomes writable on connection success,
777 but a connection failure is notified as an error. On POSIX, the
778 socket becomes writable on connection success or on connection
779 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200780 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200781 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000782
Victor Stinner71694d52015-03-28 01:18:54 +0100783 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200784 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200785 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000786
Artem Khramov28146202019-08-15 03:21:48 +0600787 /* On some OSes, typically BSD-based ones, the timeout parameter of the
788 poll() syscall, when negative, must be exactly INFTIM, where defined,
789 or -1. See issue 37811. */
790 if (ms < 0) {
791#ifdef INFTIM
792 ms = INFTIM;
793#else
794 ms = -1;
795#endif
796 }
797
Victor Stinner71694d52015-03-28 01:18:54 +0100798 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200799 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100800 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000801#else
Victor Stinnerced11742015-04-09 10:27:25 +0200802 if (interval >= 0) {
803 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
804 tvp = &tv;
805 }
806 else
807 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000808
Victor Stinner71694d52015-03-28 01:18:54 +0100809 FD_ZERO(&fds);
810 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200811 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 if (connect) {
813 /* On Windows, the socket becomes writable on connection success,
814 but a connection failure is notified as an error. On POSIX, the
815 socket becomes writable on connection success or on connection
816 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200817 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 }
Victor Stinner71694d52015-03-28 01:18:54 +0100819
820 /* See if the socket is ready */
821 Py_BEGIN_ALLOW_THREADS;
822 if (writing)
823 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200824 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100825 else
826 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200827 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100828 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000829#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 if (n < 0)
832 return -1;
833 if (n == 0)
834 return 1;
835 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000836}
837
Victor Stinner31bf2d52015-04-01 21:57:09 +0200838/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000839
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 On error, raise an exception and return -1 if err is set, or fill err and
841 return -1 otherwise. If a signal was received and the signal handler raised
842 an exception, return -1, and set err to -1 if err is set.
843
844 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100845
Victor Stinner31bf2d52015-04-01 21:57:09 +0200846 If the socket has a timeout, wait until the socket is ready before calling
847 the function: wait until the socket is writable if writing is nonzero, wait
848 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100849
Victor Stinner81c41db2015-04-02 11:50:57 +0200850 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851 the function, except if the signal handler raised an exception (PEP 475).
852
853 When the function is retried, recompute the timeout using a monotonic clock.
854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855 sock_call_ex() must be called with the GIL held. The socket function is
856 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200857static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200858sock_call_ex(PySocketSockObject *s,
859 int writing,
860 int (*sock_func) (PySocketSockObject *s, void *data),
861 void *data,
862 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200863 int *err,
864 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200865{
Victor Stinner8912d142015-04-06 23:16:34 +0200866 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200867 _PyTime_t deadline = 0;
868 int deadline_initialized = 0;
869 int res;
870
871 /* sock_call() must be called with the GIL held. */
872 assert(PyGILState_Check());
873
874 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200875 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200876 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200877 /* For connect(), poll even for blocking socket. The connection
878 runs asynchronously. */
879 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200881 _PyTime_t interval;
882
Victor Stinner81c41db2015-04-02 11:50:57 +0200883 if (deadline_initialized) {
884 /* recompute the timeout */
885 interval = deadline - _PyTime_GetMonotonicClock();
886 }
887 else {
888 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200889 deadline = _PyTime_GetMonotonicClock() + timeout;
890 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200891 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200892
Victor Stinner10550cd2015-04-03 13:22:27 +0200893 if (interval >= 0)
894 res = internal_select(s, writing, interval, connect);
895 else
896 res = 1;
897 }
898 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200899 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200900 }
901
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200903 if (err)
904 *err = GET_SOCK_ERROR;
905
Victor Stinner31bf2d52015-04-01 21:57:09 +0200906 if (CHECK_ERRNO(EINTR)) {
907 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200908 if (PyErr_CheckSignals()) {
909 if (err)
910 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200911 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200912 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200913
914 /* retry select() */
915 continue;
916 }
917
918 /* select() failed */
919 s->errorhandler();
920 return -1;
921 }
922
923 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200924 if (err)
925 *err = SOCK_TIMEOUT_ERR;
926 else
927 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200928 return -1;
929 }
930
931 /* the socket is ready */
932 }
933
Victor Stinner81c41db2015-04-02 11:50:57 +0200934 /* inner loop to retry sock_func() when sock_func() is interrupted
935 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200936 while (1) {
937 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200938 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200939 Py_END_ALLOW_THREADS
940
941 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200942 /* sock_func() succeeded */
943 if (err)
944 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200945 return 0;
946 }
947
Victor Stinner81c41db2015-04-02 11:50:57 +0200948 if (err)
949 *err = GET_SOCK_ERROR;
950
Victor Stinner31bf2d52015-04-01 21:57:09 +0200951 if (!CHECK_ERRNO(EINTR))
952 break;
953
Victor Stinner81c41db2015-04-02 11:50:57 +0200954 /* sock_func() was interrupted by a signal */
955 if (PyErr_CheckSignals()) {
956 if (err)
957 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200958 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200959 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200960
Victor Stinner81c41db2015-04-02 11:50:57 +0200961 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200962 }
963
964 if (s->sock_timeout > 0
965 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200966 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200967
968 For example, select() could indicate a socket is ready for
969 reading, but the data then discarded by the OS because of a
970 wrong checksum.
971
972 Loop on select() to recheck for socket readyness. */
973 continue;
974 }
975
Victor Stinner81c41db2015-04-02 11:50:57 +0200976 /* sock_func() failed */
977 if (!err)
978 s->errorhandler();
979 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000980 return -1;
981 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200982}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000983
Victor Stinner81c41db2015-04-02 11:50:57 +0200984static int
985sock_call(PySocketSockObject *s,
986 int writing,
987 int (*func) (PySocketSockObject *s, void *data),
988 void *data)
989{
Victor Stinner8912d142015-04-06 23:16:34 +0200990 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200991}
992
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000993
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000994/* Initialize a new socket object. */
995
Victor Stinner88ed6402015-04-09 10:23:12 +0200996/* Default timeout for new sockets */
997static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000998
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200999static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001000init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 s->sock_fd = fd;
1004 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -05001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -05001007
1008 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
1009 on some OSes as part of socket.type. We want to reset them here,
1010 to make socket.type be set to the same value on all platforms.
1011 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
1012 not portable.
1013 */
1014#ifdef SOCK_NONBLOCK
1015 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
1016#endif
1017#ifdef SOCK_CLOEXEC
1018 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1019#endif
1020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001024#ifdef SOCK_NONBLOCK
1025 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001026 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001027 else
1028#endif
1029 {
1030 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001031 if (defaulttimeout >= 0) {
1032 if (internal_setblocking(s, 0) == -1) {
1033 return -1;
1034 }
1035 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001036 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001037 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001038}
1039
1040
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041/* Create a new socket object.
1042 This just creates the object and initializes it.
1043 If the creation fails, return NULL and set an exception (implicit
1044 in NEWOBJ()). */
1045
Guido van Rossum73624e91994-10-10 17:59:00 +00001046static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001047new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 PySocketSockObject *s;
1050 s = (PySocketSockObject *)
1051 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001052 if (s == NULL)
1053 return NULL;
1054 if (init_sockobject(s, fd, family, type, proto) == -1) {
1055 Py_DECREF(s);
1056 return NULL;
1057 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059}
1060
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061
Guido van Rossum48a680c2001-03-02 06:34:14 +00001062/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001063 thread to be in gethostbyname or getaddrinfo */
1064#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001065static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001066#endif
1067
1068
Guido van Rossum30a685f1991-06-27 15:51:29 +00001069/* Convert a string specifying a host name or one of a few symbolic
1070 names to a numeric IP address. This usually calls gethostbyname()
1071 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001072 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073 an error occurred; then an exception is raised. */
1074
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001075static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001076setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 struct addrinfo hints, *res;
1079 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1082 if (name[0] == '\0') {
1083 int siz;
1084 memset(&hints, 0, sizeof(hints));
1085 hints.ai_family = af;
1086 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1087 hints.ai_flags = AI_PASSIVE;
1088 Py_BEGIN_ALLOW_THREADS
1089 ACQUIRE_GETADDRINFO_LOCK
1090 error = getaddrinfo(NULL, "0", &hints, &res);
1091 Py_END_ALLOW_THREADS
1092 /* We assume that those thread-unsafe getaddrinfo() versions
1093 *are* safe regarding their return value, ie. that a
1094 subsequent call to getaddrinfo() does not destroy the
1095 outcome of the first call. */
1096 RELEASE_GETADDRINFO_LOCK
1097 if (error) {
1098 set_gaierror(error);
1099 return -1;
1100 }
1101 switch (res->ai_family) {
1102 case AF_INET:
1103 siz = 4;
1104 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001105#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 case AF_INET6:
1107 siz = 16;
1108 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 default:
1111 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001112 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 "unsupported address family");
1114 return -1;
1115 }
1116 if (res->ai_next) {
1117 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001118 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 "wildcard resolved to multiple address");
1120 return -1;
1121 }
1122 if (res->ai_addrlen < addr_ret_size)
1123 addr_ret_size = res->ai_addrlen;
1124 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1125 freeaddrinfo(res);
1126 return siz;
1127 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001128 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001129 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001130 if (strcmp(name, "255.255.255.255") == 0 ||
1131 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 struct sockaddr_in *sin;
1133 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001134 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 "address family mismatched");
1136 return -1;
1137 }
1138 sin = (struct sockaddr_in *)addr_ret;
1139 memset((void *) sin, '\0', sizeof(*sin));
1140 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001141#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 sin->sin_addr.s_addr = INADDR_BROADCAST;
1145 return sizeof(sin->sin_addr);
1146 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001147
1148 /* avoid a name resolution in case of numeric address */
1149#ifdef HAVE_INET_PTON
1150 /* check for an IPv4 address */
1151 if (af == AF_UNSPEC || af == AF_INET) {
1152 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1153 memset(sin, 0, sizeof(*sin));
1154 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1155 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001156#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001157 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001158#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001159 return 4;
1160 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001162#ifdef ENABLE_IPV6
1163 /* check for an IPv6 address - if the address contains a scope ID, we
1164 * fallback to getaddrinfo(), which can handle translation from interface
1165 * name to interface index */
1166 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1167 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1168 memset(sin, 0, sizeof(*sin));
1169 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1170 sin->sin6_family = AF_INET6;
1171#ifdef HAVE_SOCKADDR_SA_LEN
1172 sin->sin6_len = sizeof(*sin);
1173#endif
1174 return 16;
1175 }
1176 }
1177#endif /* ENABLE_IPV6 */
1178#else /* HAVE_INET_PTON */
1179 /* check for an IPv4 address */
1180 if (af == AF_INET || af == AF_UNSPEC) {
1181 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1182 memset(sin, 0, sizeof(*sin));
1183 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1184 sin->sin_family = AF_INET;
1185#ifdef HAVE_SOCKADDR_SA_LEN
1186 sin->sin_len = sizeof(*sin);
1187#endif
1188 return 4;
1189 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001190 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001191#endif /* HAVE_INET_PTON */
1192
1193 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 memset(&hints, 0, sizeof(hints));
1195 hints.ai_family = af;
1196 Py_BEGIN_ALLOW_THREADS
1197 ACQUIRE_GETADDRINFO_LOCK
1198 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001199#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 if (error == EAI_NONAME && af == AF_UNSPEC) {
1201 /* On Tru64 V5.1, numeric-to-addr conversion fails
1202 if no address family is given. Assume IPv4 for now.*/
1203 hints.ai_family = AF_INET;
1204 error = getaddrinfo(name, NULL, &hints, &res);
1205 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 Py_END_ALLOW_THREADS
1208 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1209 if (error) {
1210 set_gaierror(error);
1211 return -1;
1212 }
1213 if (res->ai_addrlen < addr_ret_size)
1214 addr_ret_size = res->ai_addrlen;
1215 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1216 freeaddrinfo(res);
1217 switch (addr_ret->sa_family) {
1218 case AF_INET:
1219 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001220#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 case AF_INET6:
1222 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001225 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 return -1;
1227 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228}
1229
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
Коренберг Марк7766b962018-02-13 00:47:42 +05001231/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001232
Guido van Rossum73624e91994-10-10 17:59:00 +00001233static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001234make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235{
Коренберг Марк7766b962018-02-13 00:47:42 +05001236 char buf[INET_ADDRSTRLEN];
1237 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1238 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 return NULL;
1240 }
1241 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242}
1243
Коренберг Марк7766b962018-02-13 00:47:42 +05001244#ifdef ENABLE_IPV6
1245/* Convert IPv6 sockaddr to a Python str. */
1246
1247static PyObject *
1248make_ipv6_addr(const struct sockaddr_in6 *addr)
1249{
1250 char buf[INET6_ADDRSTRLEN];
1251 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1252 PyErr_SetFromErrno(PyExc_OSError);
1253 return NULL;
1254 }
1255 return PyUnicode_FromString(buf);
1256}
1257#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001259#ifdef USE_BLUETOOTH
1260/* Convert a string representation of a Bluetooth address into a numeric
1261 address. Returns the length (6), or raises an exception and returns -1 if
1262 an error occurred. */
1263
1264static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001265setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 unsigned int b0, b1, b2, b3, b4, b5;
1268 char ch;
1269 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1272 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1273 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001274
1275#ifdef MS_WINDOWS
1276 *bdaddr = (ULONGLONG)(b0 & 0xFF);
1277 *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8);
1278 *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16);
1279 *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24);
1280 *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32);
1281 *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40);
1282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 bdaddr->b[0] = b0;
1284 bdaddr->b[1] = b1;
1285 bdaddr->b[2] = b2;
1286 bdaddr->b[3] = b3;
1287 bdaddr->b[4] = b4;
1288 bdaddr->b[5] = b5;
Greg Bowser8fbece12019-08-02 16:29:52 -04001289#endif
1290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 return 6;
1292 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001293 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 return -1;
1295 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001296}
1297
1298/* Create a string representation of the Bluetooth address. This is always a
1299 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1300 value (zero padded if necessary). */
1301
1302static PyObject *
1303makebdaddr(bdaddr_t *bdaddr)
1304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306
Greg Bowser8fbece12019-08-02 16:29:52 -04001307#ifdef MS_WINDOWS
1308 int i;
1309 unsigned int octets[6];
1310
1311 for (i = 0; i < 6; ++i) {
1312 octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
1313 }
1314
1315 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1316 octets[5], octets[4], octets[3],
1317 octets[2], octets[1], octets[0]);
1318#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1320 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1321 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Greg Bowser8fbece12019-08-02 16:29:52 -04001322#endif
1323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001325}
1326#endif
1327
1328
Guido van Rossum30a685f1991-06-27 15:51:29 +00001329/* Create an object representing the given socket address,
1330 suitable for passing it back to bind(), connect() etc.
1331 The family field of the sockaddr structure is inspected
1332 to determine what kind of address it really is. */
1333
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001335static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001336makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 if (addrlen == 0) {
1339 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001340 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 case AF_INET:
1346 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001347 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1348 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 PyObject *ret = NULL;
1350 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1352 Py_DECREF(addrobj);
1353 }
1354 return ret;
1355 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001357#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case AF_UNIX:
1359 {
1360 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001361#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001362 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1363 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1364 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 }
1366 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001367#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 {
1369 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001370 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 }
1372 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001373#endif /* AF_UNIX */
1374
Martin v. Löwis11017b12006-01-14 18:12:57 +00001375#if defined(AF_NETLINK)
1376 case AF_NETLINK:
1377 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1379 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001380 }
1381#endif /* AF_NETLINK */
1382
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001383#if defined(AF_QIPCRTR)
1384 case AF_QIPCRTR:
1385 {
1386 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1387 return Py_BuildValue("II", a->sq_node, a->sq_port);
1388 }
1389#endif /* AF_QIPCRTR */
1390
caaveryeffc12f2017-09-06 18:18:10 -04001391#if defined(AF_VSOCK)
1392 case AF_VSOCK:
1393 {
1394 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1395 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1396 }
1397#endif /* AF_VSOCK */
1398
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001399#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 case AF_INET6:
1401 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001402 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1403 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyObject *ret = NULL;
1405 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001406 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 addrobj,
1408 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001409 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 a->sin6_scope_id);
1411 Py_DECREF(addrobj);
1412 }
1413 return ret;
1414 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001415#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001417#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 case AF_BLUETOOTH:
1419 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001420
Greg Bowser8fbece12019-08-02 16:29:52 -04001421#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 case BTPROTO_L2CAP:
1423 {
1424 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1425 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1426 PyObject *ret = NULL;
1427 if (addrobj) {
1428 ret = Py_BuildValue("Oi",
1429 addrobj,
1430 _BT_L2_MEMB(a, psm));
1431 Py_DECREF(addrobj);
1432 }
1433 return ret;
1434 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001435
Greg Bowser8fbece12019-08-02 16:29:52 -04001436#endif /* BTPROTO_L2CAP */
1437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 case BTPROTO_RFCOMM:
1439 {
1440 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1441 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1442 PyObject *ret = NULL;
1443 if (addrobj) {
1444 ret = Py_BuildValue("Oi",
1445 addrobj,
1446 _BT_RC_MEMB(a, channel));
1447 Py_DECREF(addrobj);
1448 }
1449 return ret;
1450 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001451
Greg Bowser8fbece12019-08-02 16:29:52 -04001452#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 case BTPROTO_HCI:
1454 {
1455 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001456#if defined(__NetBSD__) || defined(__DragonFly__)
1457 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001458#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 PyObject *ret = NULL;
1460 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1461 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001462#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001464
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001465#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 case BTPROTO_SCO:
1467 {
1468 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1469 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1470 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001471#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04001472#endif /* BTPROTO_HCI */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 default:
1475 PyErr_SetString(PyExc_ValueError,
1476 "Unknown Bluetooth protocol");
1477 return NULL;
1478 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001479#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001480
Antoine Pitroub156a462010-10-27 20:13:57 +00001481#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 case AF_PACKET:
1483 {
1484 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001485 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 struct ifreq ifr;
1487 /* need to look up interface name give index */
1488 if (a->sll_ifindex) {
1489 ifr.ifr_ifindex = a->sll_ifindex;
1490 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1491 ifname = ifr.ifr_name;
1492 }
1493 return Py_BuildValue("shbhy#",
1494 ifname,
1495 ntohs(a->sll_protocol),
1496 a->sll_pkttype,
1497 a->sll_hatype,
1498 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001499 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001501#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502
Christian Heimes043d6f62008-01-07 17:19:16 +00001503#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 case AF_TIPC:
1505 {
1506 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1507 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1508 return Py_BuildValue("IIIII",
1509 a->addrtype,
1510 a->addr.nameseq.type,
1511 a->addr.nameseq.lower,
1512 a->addr.nameseq.upper,
1513 a->scope);
1514 } else if (a->addrtype == TIPC_ADDR_NAME) {
1515 return Py_BuildValue("IIIII",
1516 a->addrtype,
1517 a->addr.name.name.type,
1518 a->addr.name.name.instance,
1519 a->addr.name.name.instance,
1520 a->scope);
1521 } else if (a->addrtype == TIPC_ADDR_ID) {
1522 return Py_BuildValue("IIIII",
1523 a->addrtype,
1524 a->addr.id.node,
1525 a->addr.id.ref,
1526 0,
1527 a->scope);
1528 } else {
1529 PyErr_SetString(PyExc_ValueError,
1530 "Invalid address type");
1531 return NULL;
1532 }
1533 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001534#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001535
Serhiy Storchakad3187152017-11-09 18:00:38 +02001536#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001537 case AF_CAN:
1538 {
1539 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001540 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001541 struct ifreq ifr;
1542 /* need to look up interface name given index */
1543 if (a->can_ifindex) {
1544 ifr.ifr_ifindex = a->can_ifindex;
1545 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1546 ifname = ifr.ifr_name;
1547 }
1548
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001549 switch (proto) {
1550#ifdef CAN_ISOTP
1551 case CAN_ISOTP:
1552 {
1553 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1554 ifname,
1555 a->can_addr.tp.rx_id,
1556 a->can_addr.tp.tx_id);
1557 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001558#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001559 default:
1560 {
bggardner954900a2019-09-12 06:02:48 -04001561 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001562 ifname);
1563 }
1564 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001565 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001566#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001567
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001568#ifdef PF_SYSTEM
1569 case PF_SYSTEM:
1570 switch(proto) {
1571#ifdef SYSPROTO_CONTROL
1572 case SYSPROTO_CONTROL:
1573 {
1574 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1575 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1576 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001577#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001578 default:
1579 PyErr_SetString(PyExc_ValueError,
1580 "Invalid address type");
1581 return 0;
1582 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001583#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001584
Christian Heimesdffa3942016-09-05 23:54:41 +02001585#ifdef HAVE_SOCKADDR_ALG
1586 case AF_ALG:
1587 {
1588 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1589 return Py_BuildValue("s#s#HH",
1590 a->salg_type,
1591 strnlen((const char*)a->salg_type,
1592 sizeof(a->salg_type)),
1593 a->salg_name,
1594 strnlen((const char*)a->salg_name,
1595 sizeof(a->salg_name)),
1596 a->salg_feat,
1597 a->salg_mask);
1598 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001599#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 default:
1604 /* If we don't know the address family, don't raise an
1605 exception -- return it as an (int, bytes) tuple. */
1606 return Py_BuildValue("iy#",
1607 addr->sa_family,
1608 addr->sa_data,
1609 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001612}
1613
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001614/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1615 (in particular, numeric IP addresses). */
1616struct maybe_idna {
1617 PyObject *obj;
1618 char *buf;
1619};
1620
1621static void
1622idna_cleanup(struct maybe_idna *data)
1623{
1624 Py_CLEAR(data->obj);
1625}
1626
1627static int
1628idna_converter(PyObject *obj, struct maybe_idna *data)
1629{
1630 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001631 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001632 if (obj == NULL) {
1633 idna_cleanup(data);
1634 return 1;
1635 }
1636 data->obj = NULL;
1637 len = -1;
1638 if (PyBytes_Check(obj)) {
1639 data->buf = PyBytes_AsString(obj);
1640 len = PyBytes_Size(obj);
1641 }
1642 else if (PyByteArray_Check(obj)) {
1643 data->buf = PyByteArray_AsString(obj);
1644 len = PyByteArray_Size(obj);
1645 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001646 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001647 if (PyUnicode_READY(obj) == -1) {
1648 return 0;
1649 }
1650 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001651 data->buf = PyUnicode_DATA(obj);
1652 len = PyUnicode_GET_LENGTH(obj);
1653 }
1654 else {
1655 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1656 if (!obj2) {
1657 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1658 return 0;
1659 }
1660 assert(PyBytes_Check(obj2));
1661 data->obj = obj2;
1662 data->buf = PyBytes_AS_STRING(obj2);
1663 len = PyBytes_GET_SIZE(obj2);
1664 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001665 }
1666 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001667 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001668 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001669 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001670 }
1671 if (strlen(data->buf) != len) {
1672 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001673 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001674 return 0;
1675 }
1676 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001677}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678
1679/* Parse a socket address argument according to the socket object's
1680 address family. Return 1 if the address was in the proper format,
1681 0 of not. The address is returned through addr_ret, its length
1682 through len_ret. */
1683
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001684static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001685getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001686 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001689
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001690#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 case AF_UNIX:
1692 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001693 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001694 int retval = 0;
1695
1696 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1697 allow embedded nulls on Linux. */
1698 if (PyUnicode_Check(args)) {
1699 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1700 return 0;
1701 }
1702 else
1703 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001704 if (!PyArg_Parse(args, "y*", &path)) {
1705 Py_DECREF(args);
1706 return retval;
1707 }
1708 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001709
Victor Stinnerd565fb92019-10-10 21:30:20 +02001710 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001711#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001712 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001714 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001715 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001717 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 }
1719 }
1720 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001721#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 {
1723 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001724 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001727 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001729 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 }
1731 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001732 memcpy(addr->sun_path, path.buf, path.len);
1733 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001734 retval = 1;
1735 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001736 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001737 Py_DECREF(args);
1738 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001740#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001741
Martin v. Löwis11017b12006-01-14 18:12:57 +00001742#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 case AF_NETLINK:
1744 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001746 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (!PyTuple_Check(args)) {
1748 PyErr_Format(
1749 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001750 "%s(): AF_NETLINK address must be tuple, not %.500s",
1751 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 return 0;
1753 }
Oren Milman735171e2018-09-11 19:51:29 +03001754 if (!PyArg_ParseTuple(args,
1755 "II;AF_NETLINK address must be a pair "
1756 "(pid, groups)",
1757 &pid, &groups))
1758 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001760 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 addr->nl_family = AF_NETLINK;
1762 addr->nl_pid = pid;
1763 addr->nl_groups = groups;
1764 *len_ret = sizeof(*addr);
1765 return 1;
1766 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001767#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001768
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001769#if defined(AF_QIPCRTR)
1770 case AF_QIPCRTR:
1771 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001772 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001773 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001774 if (!PyTuple_Check(args)) {
1775 PyErr_Format(
1776 PyExc_TypeError,
1777 "getsockaddrarg: "
1778 "AF_QIPCRTR address must be tuple, not %.500s",
1779 Py_TYPE(args)->tp_name);
1780 return 0;
1781 }
1782 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1783 return 0;
1784 addr->sq_family = AF_QIPCRTR;
1785 addr->sq_node = node;
1786 addr->sq_port = port;
1787 *len_ret = sizeof(*addr);
1788 return 1;
1789 }
1790#endif /* AF_QIPCRTR */
1791
caaveryeffc12f2017-09-06 18:18:10 -04001792#if defined(AF_VSOCK)
1793 case AF_VSOCK:
1794 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001795 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001796 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001797 memset(addr, 0, sizeof(struct sockaddr_vm));
1798 if (!PyTuple_Check(args)) {
1799 PyErr_Format(
1800 PyExc_TypeError,
1801 "getsockaddrarg: "
1802 "AF_VSOCK address must be tuple, not %.500s",
1803 Py_TYPE(args)->tp_name);
1804 return 0;
1805 }
1806 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1807 return 0;
1808 addr->svm_family = s->sock_family;
1809 addr->svm_port = port;
1810 addr->svm_cid = cid;
1811 *len_ret = sizeof(*addr);
1812 return 1;
1813 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001814#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001815
1816
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001817#ifdef AF_RDS
1818 case AF_RDS:
1819 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001820#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 case AF_INET:
1823 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001824 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 int port, result;
1826 if (!PyTuple_Check(args)) {
1827 PyErr_Format(
1828 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001829 "%s(): AF_INET address must be tuple, not %.500s",
1830 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 0;
1832 }
Oren Milman735171e2018-09-11 19:51:29 +03001833 if (!PyArg_ParseTuple(args,
1834 "O&i;AF_INET address must be a pair "
1835 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001836 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001837 {
1838 assert(PyErr_Occurred());
1839 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1840 PyErr_Format(PyExc_OverflowError,
1841 "%s(): port must be 0-65535.", caller);
1842 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001844 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001845 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001846 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001848 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 if (result < 0)
1850 return 0;
1851 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001852 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001854 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 return 0;
1856 }
1857 addr->sin_family = AF_INET;
1858 addr->sin_port = htons((short)port);
1859 *len_ret = sizeof *addr;
1860 return 1;
1861 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001862
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001863#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 case AF_INET6:
1865 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001866 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001867 int port, result;
1868 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 flowinfo = scope_id = 0;
1870 if (!PyTuple_Check(args)) {
1871 PyErr_Format(
1872 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001873 "%s(): AF_INET6 address must be tuple, not %.500s",
1874 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 return 0;
1876 }
Oren Milman735171e2018-09-11 19:51:29 +03001877 if (!PyArg_ParseTuple(args,
1878 "O&i|II;AF_INET6 address must be a tuple "
1879 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001880 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001881 &scope_id))
1882 {
1883 assert(PyErr_Occurred());
1884 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1885 PyErr_Format(PyExc_OverflowError,
1886 "%s(): port must be 0-65535.", caller);
1887 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 return 0;
1889 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001890 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001891 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001893 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 if (result < 0)
1895 return 0;
1896 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001897 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001899 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 return 0;
1901 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001902 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001903 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001904 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001905 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001906 return 0;
1907 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 addr->sin6_family = s->sock_family;
1909 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001910 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 addr->sin6_scope_id = scope_id;
1912 *len_ret = sizeof *addr;
1913 return 1;
1914 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001915#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001916
Hye-Shik Chang81268602004-02-02 06:05:24 +00001917#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 case AF_BLUETOOTH:
1919 {
1920 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001921#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 case BTPROTO_L2CAP:
1923 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001924 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001925
Victor Stinnerd565fb92019-10-10 21:30:20 +02001926 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 memset(addr, 0, sizeof(struct sockaddr_l2));
1928 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1929 if (!PyArg_ParseTuple(args, "si", &straddr,
1930 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001931 PyErr_Format(PyExc_OSError,
1932 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 return 0;
1934 }
1935 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1936 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 *len_ret = sizeof *addr;
1939 return 1;
1940 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001941#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 case BTPROTO_RFCOMM:
1943 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001944 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001945 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1947 if (!PyArg_ParseTuple(args, "si", &straddr,
1948 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001949 PyErr_Format(PyExc_OSError,
1950 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 return 0;
1952 }
1953 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1954 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 *len_ret = sizeof *addr;
1957 return 1;
1958 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001959#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 case BTPROTO_HCI:
1961 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001962 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001963#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001964 const char *straddr;
1965 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1966 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001967 PyErr_Format(PyExc_OSError, "%s: "
1968 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001969 return 0;
1970 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001971 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001972 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1973 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001974#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1976 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001977 PyErr_Format(PyExc_OSError,
1978 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 return 0;
1980 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001981#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 *len_ret = sizeof *addr;
1983 return 1;
1984 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001985#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 case BTPROTO_SCO:
1987 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001988 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001989
Victor Stinnerd565fb92019-10-10 21:30:20 +02001990 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1992 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001993 PyErr_Format(PyExc_OSError,
1994 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 return 0;
1996 }
1997 straddr = PyBytes_AS_STRING(args);
1998 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1999 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 *len_ret = sizeof *addr;
2002 return 1;
2003 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002004#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002005#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 default:
Oren Milman735171e2018-09-11 19:51:29 +03002007 PyErr_Format(PyExc_OSError,
2008 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 return 0;
2010 }
2011 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002012#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002013
Antoine Pitroub156a462010-10-27 20:13:57 +00002014#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 case AF_PACKET:
2016 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002018 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 int protoNumber;
2020 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04002021 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002022 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 if (!PyTuple_Check(args)) {
2025 PyErr_Format(
2026 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002027 "%s(): AF_PACKET address must be tuple, not %.500s",
2028 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 return 0;
2030 }
Oren Milman735171e2018-09-11 19:51:29 +03002031 /* XXX: improve the default error message according to the
2032 documentation of AF_PACKET, which would be added as part
2033 of bpo-25041. */
2034 if (!PyArg_ParseTuple(args,
2035 "si|iiy*;AF_PACKET address must be a tuple of "
2036 "two to five elements",
2037 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002038 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002039 {
2040 assert(PyErr_Occurred());
2041 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2042 PyErr_Format(PyExc_OverflowError,
2043 "%s(): address argument out of range", caller);
2044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002046 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2048 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2049 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2050 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002051 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 return 0;
2053 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002054 if (haddr.buf && haddr.len > 8) {
2055 PyErr_SetString(PyExc_ValueError,
2056 "Hardware address must be 8 bytes or less");
2057 PyBuffer_Release(&haddr);
2058 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 }
2060 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002061 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002063 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002064 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return 0;
2066 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002067 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 addr->sll_family = AF_PACKET;
2069 addr->sll_protocol = htons((short)protoNumber);
2070 addr->sll_ifindex = ifr.ifr_ifindex;
2071 addr->sll_pkttype = pkttype;
2072 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002073 if (haddr.buf) {
2074 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2075 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002077 else
2078 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002080 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 return 1;
2082 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002083#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002084
Christian Heimes043d6f62008-01-07 17:19:16 +00002085#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 case AF_TIPC:
2087 {
2088 unsigned int atype, v1, v2, v3;
2089 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 if (!PyTuple_Check(args)) {
2092 PyErr_Format(
2093 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002094 "%s(): AF_TIPC address must be tuple, not %.500s",
2095 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 return 0;
2097 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002100 "IIII|I;AF_TIPC address must be a tuple "
2101 "(addr_type, v1, v2, v3[, scope])",
2102 &atype, &v1, &v2, &v3, &scope))
2103 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002105 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002106
Victor Stinnerd565fb92019-10-10 21:30:20 +02002107 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 addr->family = AF_TIPC;
2111 addr->scope = scope;
2112 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 if (atype == TIPC_ADDR_NAMESEQ) {
2115 addr->addr.nameseq.type = v1;
2116 addr->addr.nameseq.lower = v2;
2117 addr->addr.nameseq.upper = v3;
2118 } else if (atype == TIPC_ADDR_NAME) {
2119 addr->addr.name.name.type = v1;
2120 addr->addr.name.name.instance = v2;
2121 } else if (atype == TIPC_ADDR_ID) {
2122 addr->addr.id.node = v1;
2123 addr->addr.id.ref = v2;
2124 } else {
2125 /* Shouldn't happen */
2126 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2127 return 0;
2128 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 return 1;
2133 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002134#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002135
Serhiy Storchakad3187152017-11-09 18:00:38 +02002136#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002137 case AF_CAN:
2138 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002139#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002140 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002141 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002142#endif
2143#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002144 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002145#endif
2146#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002147 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002148 PyObject *interfaceName;
2149 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002150 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002151 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002152
Oren Milman735171e2018-09-11 19:51:29 +03002153 if (!PyTuple_Check(args)) {
2154 PyErr_Format(PyExc_TypeError,
2155 "%s(): AF_CAN address must be tuple, not %.500s",
2156 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002157 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002158 }
2159 if (!PyArg_ParseTuple(args,
2160 "O&;AF_CAN address must be a tuple "
2161 "(interface, )",
2162 PyUnicode_FSConverter, &interfaceName))
2163 {
2164 return 0;
2165 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002166
2167 len = PyBytes_GET_SIZE(interfaceName);
2168
2169 if (len == 0) {
2170 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002171 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002172 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2173 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002174 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2175 s->errorhandler();
2176 Py_DECREF(interfaceName);
2177 return 0;
2178 }
2179 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002180 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002181 "AF_CAN interface name too long");
2182 Py_DECREF(interfaceName);
2183 return 0;
2184 }
2185
2186 addr->can_family = AF_CAN;
2187 addr->can_ifindex = ifr.ifr_ifindex;
2188
2189 *len_ret = sizeof(*addr);
2190 Py_DECREF(interfaceName);
2191 return 1;
2192 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002193#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002194
2195#ifdef CAN_ISOTP
2196 case CAN_ISOTP:
2197 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002198 PyObject *interfaceName;
2199 struct ifreq ifr;
2200 Py_ssize_t len;
2201 unsigned long int rx_id, tx_id;
2202
Victor Stinnerd565fb92019-10-10 21:30:20 +02002203 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002204
2205 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2206 &interfaceName,
2207 &rx_id,
2208 &tx_id))
2209 return 0;
2210
2211 len = PyBytes_GET_SIZE(interfaceName);
2212
2213 if (len == 0) {
2214 ifr.ifr_ifindex = 0;
2215 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2216 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2217 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2218 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2219 s->errorhandler();
2220 Py_DECREF(interfaceName);
2221 return 0;
2222 }
2223 } else {
2224 PyErr_SetString(PyExc_OSError,
2225 "AF_CAN interface name too long");
2226 Py_DECREF(interfaceName);
2227 return 0;
2228 }
2229
2230 addr->can_family = AF_CAN;
2231 addr->can_ifindex = ifr.ifr_ifindex;
2232 addr->can_addr.tp.rx_id = rx_id;
2233 addr->can_addr.tp.tx_id = tx_id;
2234
2235 *len_ret = sizeof(*addr);
2236 Py_DECREF(interfaceName);
2237 return 1;
2238 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002239#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002240 default:
Oren Milman735171e2018-09-11 19:51:29 +03002241 PyErr_Format(PyExc_OSError,
2242 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002243 return 0;
2244 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002245#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002246
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002247#ifdef PF_SYSTEM
2248 case PF_SYSTEM:
2249 switch (s->sock_proto) {
2250#ifdef SYSPROTO_CONTROL
2251 case SYSPROTO_CONTROL:
2252 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002253 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002254 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002255 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002256
2257 if (PyUnicode_Check(args)) {
2258 struct ctl_info info;
2259 PyObject *ctl_name;
2260
2261 if (!PyArg_Parse(args, "O&",
2262 PyUnicode_FSConverter, &ctl_name)) {
2263 return 0;
2264 }
2265
Victor Stinnerf50e1872015-03-20 11:32:24 +01002266 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002267 PyErr_SetString(PyExc_ValueError,
2268 "provided string is too long");
2269 Py_DECREF(ctl_name);
2270 return 0;
2271 }
2272 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2273 sizeof(info.ctl_name));
2274 Py_DECREF(ctl_name);
2275
2276 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2277 PyErr_SetString(PyExc_OSError,
2278 "cannot find kernel control with provided name");
2279 return 0;
2280 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002281
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002282 addr->sc_id = info.ctl_id;
2283 addr->sc_unit = 0;
2284 } else if (!PyArg_ParseTuple(args, "II",
2285 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002286 PyErr_Format(PyExc_TypeError,
2287 "%s(): PF_SYSTEM address must be a str or "
2288 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002289 return 0;
2290 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002291
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002292 *len_ret = sizeof(*addr);
2293 return 1;
2294 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002295#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002296 default:
Oren Milman735171e2018-09-11 19:51:29 +03002297 PyErr_Format(PyExc_OSError,
2298 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002299 return 0;
2300 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002301#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002302#ifdef HAVE_SOCKADDR_ALG
2303 case AF_ALG:
2304 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002305 const char *type;
2306 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002307 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002308
2309 memset(sa, 0, sizeof(*sa));
2310 sa->salg_family = AF_ALG;
2311
Oren Milman735171e2018-09-11 19:51:29 +03002312 if (!PyTuple_Check(args)) {
2313 PyErr_Format(PyExc_TypeError,
2314 "%s(): AF_ALG address must be tuple, not %.500s",
2315 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002316 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002317 }
2318 if (!PyArg_ParseTuple(args,
2319 "ss|HH;AF_ALG address must be a tuple "
2320 "(type, name[, feat[, mask]])",
2321 &type, &name, &sa->salg_feat, &sa->salg_mask))
2322 {
2323 return 0;
2324 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002325 /* sockaddr_alg has fixed-sized char arrays for type, and name
2326 * both must be NULL terminated.
2327 */
2328 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002329 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2330 return 0;
2331 }
2332 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002333 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002334 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2335 return 0;
2336 }
2337 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2338
2339 *len_ret = sizeof(*sa);
2340 return 1;
2341 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002342#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 default:
Oren Milman735171e2018-09-11 19:51:29 +03002347 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002351}
2352
Guido van Rossum30a685f1991-06-27 15:51:29 +00002353
Guido van Rossum48a680c2001-03-02 06:34:14 +00002354/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002355 Return 1 if the family is known, 0 otherwise. The length is returned
2356 through len_ret. */
2357
2358static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002359getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002362
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002363#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 case AF_UNIX:
2365 {
2366 *len_ret = sizeof (struct sockaddr_un);
2367 return 1;
2368 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002369#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002370
Martin v. Löwis11017b12006-01-14 18:12:57 +00002371#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002372 case AF_NETLINK:
2373 {
2374 *len_ret = sizeof (struct sockaddr_nl);
2375 return 1;
2376 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002377#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002378
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002379#if defined(AF_QIPCRTR)
2380 case AF_QIPCRTR:
2381 {
2382 *len_ret = sizeof (struct sockaddr_qrtr);
2383 return 1;
2384 }
2385#endif /* AF_QIPCRTR */
2386
caaveryeffc12f2017-09-06 18:18:10 -04002387#if defined(AF_VSOCK)
2388 case AF_VSOCK:
2389 {
2390 *len_ret = sizeof (struct sockaddr_vm);
2391 return 1;
2392 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002393#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002394
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002395#ifdef AF_RDS
2396 case AF_RDS:
2397 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002398#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 case AF_INET:
2401 {
2402 *len_ret = sizeof (struct sockaddr_in);
2403 return 1;
2404 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002405
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002406#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 case AF_INET6:
2408 {
2409 *len_ret = sizeof (struct sockaddr_in6);
2410 return 1;
2411 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002412#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002413
Hye-Shik Chang81268602004-02-02 06:05:24 +00002414#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 case AF_BLUETOOTH:
2416 {
2417 switch(s->sock_proto)
2418 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002419
Greg Bowser8fbece12019-08-02 16:29:52 -04002420#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 case BTPROTO_L2CAP:
2422 *len_ret = sizeof (struct sockaddr_l2);
2423 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002424#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 case BTPROTO_RFCOMM:
2426 *len_ret = sizeof (struct sockaddr_rc);
2427 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002428#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 case BTPROTO_HCI:
2430 *len_ret = sizeof (struct sockaddr_hci);
2431 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002432#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 case BTPROTO_SCO:
2434 *len_ret = sizeof (struct sockaddr_sco);
2435 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002436#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002437#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002439 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 "unknown BT protocol");
2441 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 }
2444 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002445#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002446
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002447#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 case AF_PACKET:
2449 {
2450 *len_ret = sizeof (struct sockaddr_ll);
2451 return 1;
2452 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002453#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002454
Christian Heimes043d6f62008-01-07 17:19:16 +00002455#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 case AF_TIPC:
2457 {
2458 *len_ret = sizeof (struct sockaddr_tipc);
2459 return 1;
2460 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002461#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002462
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002463#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002464 case AF_CAN:
2465 {
2466 *len_ret = sizeof (struct sockaddr_can);
2467 return 1;
2468 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002469#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002470
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002471#ifdef PF_SYSTEM
2472 case PF_SYSTEM:
2473 switch(s->sock_proto) {
2474#ifdef SYSPROTO_CONTROL
2475 case SYSPROTO_CONTROL:
2476 *len_ret = sizeof (struct sockaddr_ctl);
2477 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002478#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002479 default:
2480 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2481 "unknown PF_SYSTEM protocol");
2482 return 0;
2483 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002484#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002485#ifdef HAVE_SOCKADDR_ALG
2486 case AF_ALG:
2487 {
2488 *len_ret = sizeof (struct sockaddr_alg);
2489 return 1;
2490 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002491#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002496 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002500}
2501
2502
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002503/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2504 Currently, these methods are only compiled if the RFC 2292/3542
2505 CMSG_LEN() macro is available. Older systems seem to have used
2506 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2507 it may be possible to define CMSG_LEN() that way if it's not
2508 provided. Some architectures might need extra padding after the
2509 cmsghdr, however, and CMSG_LEN() would have to take account of
2510 this. */
2511#ifdef CMSG_LEN
2512/* If length is in range, set *result to CMSG_LEN(length) and return
2513 true; otherwise, return false. */
2514static int
2515get_CMSG_LEN(size_t length, size_t *result)
2516{
2517 size_t tmp;
2518
2519 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2520 return 0;
2521 tmp = CMSG_LEN(length);
2522 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2523 return 0;
2524 *result = tmp;
2525 return 1;
2526}
2527
2528#ifdef CMSG_SPACE
2529/* If length is in range, set *result to CMSG_SPACE(length) and return
2530 true; otherwise, return false. */
2531static int
2532get_CMSG_SPACE(size_t length, size_t *result)
2533{
2534 size_t tmp;
2535
2536 /* Use CMSG_SPACE(1) here in order to take account of the padding
2537 necessary before *and* after the data. */
2538 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2539 return 0;
2540 tmp = CMSG_SPACE(length);
2541 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2542 return 0;
2543 *result = tmp;
2544 return 1;
2545}
2546#endif
2547
2548/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2549 pointer in msg->msg_control with at least "space" bytes after it,
2550 and its cmsg_len member inside the buffer. */
2551static int
2552cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2553{
2554 size_t cmsg_offset;
2555 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2556 sizeof(cmsgh->cmsg_len));
2557
Charles-François Natali466517d2011-08-28 18:23:43 +02002558 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002559 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002560 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002561 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2562 annoying under OS X as it's unsigned there and so it triggers a
2563 tautological comparison warning under Clang when compared against 0.
2564 Since the check is valid on other platforms, silence the warning under
2565 Clang. */
2566 #ifdef __clang__
2567 #pragma clang diagnostic push
2568 #pragma clang diagnostic ignored "-Wtautological-compare"
2569 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002570 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002571 #pragma GCC diagnostic push
2572 #pragma GCC diagnostic ignored "-Wtype-limits"
2573 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002574 if (msg->msg_controllen < 0)
2575 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002576 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002577 #pragma GCC diagnostic pop
2578 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002579 #ifdef __clang__
2580 #pragma clang diagnostic pop
2581 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002582 if (space < cmsg_len_end)
2583 space = cmsg_len_end;
2584 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2585 return (cmsg_offset <= (size_t)-1 - space &&
2586 cmsg_offset + space <= msg->msg_controllen);
2587}
2588
2589/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2590 *space to number of bytes following it in the buffer and return
2591 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2592 msg->msg_controllen are valid. */
2593static int
2594get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2595{
2596 size_t data_offset;
2597 char *data_ptr;
2598
2599 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2600 return 0;
2601 data_offset = data_ptr - (char *)msg->msg_control;
2602 if (data_offset > msg->msg_controllen)
2603 return 0;
2604 *space = msg->msg_controllen - data_offset;
2605 return 1;
2606}
2607
2608/* If cmsgh is invalid or not contained in the buffer pointed to by
2609 msg->msg_control, return -1. If cmsgh is valid and its associated
2610 data is entirely contained in the buffer, set *data_len to the
2611 length of the associated data and return 0. If only part of the
2612 associated data is contained in the buffer but cmsgh is otherwise
2613 valid, set *data_len to the length contained in the buffer and
2614 return 1. */
2615static int
2616get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2617{
2618 size_t space, cmsg_data_len;
2619
2620 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2621 cmsgh->cmsg_len < CMSG_LEN(0))
2622 return -1;
2623 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2624 if (!get_cmsg_data_space(msg, cmsgh, &space))
2625 return -1;
2626 if (space >= cmsg_data_len) {
2627 *data_len = cmsg_data_len;
2628 return 0;
2629 }
2630 *data_len = space;
2631 return 1;
2632}
2633#endif /* CMSG_LEN */
2634
2635
Victor Stinner31bf2d52015-04-01 21:57:09 +02002636struct sock_accept {
2637 socklen_t *addrlen;
2638 sock_addr_t *addrbuf;
2639 SOCKET_T result;
2640};
2641
2642#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2643/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2644static int accept4_works = -1;
2645#endif
2646
2647static int
2648sock_accept_impl(PySocketSockObject *s, void *data)
2649{
2650 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002651 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2652 socklen_t *paddrlen = ctx->addrlen;
2653#ifdef HAVE_SOCKADDR_ALG
2654 /* AF_ALG does not support accept() with addr and raises
2655 * ECONNABORTED instead. */
2656 if (s->sock_family == AF_ALG) {
2657 addr = NULL;
2658 paddrlen = NULL;
2659 *ctx->addrlen = 0;
2660 }
2661#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002662
2663#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2664 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002665 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002666 SOCK_CLOEXEC);
2667 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2668 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2669 accept4_works = (errno != ENOSYS);
2670 }
2671 }
2672 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002673 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002674#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002675 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002676#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002677
2678#ifdef MS_WINDOWS
2679 return (ctx->result != INVALID_SOCKET);
2680#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002681 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002682#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002683}
2684
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002685/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002686
Guido van Rossum73624e91994-10-10 17:59:00 +00002687static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302688sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002691 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 socklen_t addrlen;
2693 PyObject *sock = NULL;
2694 PyObject *addr = NULL;
2695 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002696 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 if (!getsockaddrlen(s, &addrlen))
2699 return NULL;
2700 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 if (!IS_SELECTABLE(s))
2703 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002704
Victor Stinner31bf2d52015-04-01 21:57:09 +02002705 ctx.addrlen = &addrlen;
2706 ctx.addrbuf = &addrbuf;
2707 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002709 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002710
Victor Stinnerdaf45552013-08-28 00:53:59 +02002711#ifdef MS_WINDOWS
2712 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2713 PyErr_SetFromWindowsErr(0);
2714 SOCKETCLOSE(newfd);
2715 goto finally;
2716 }
2717#else
2718
2719#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2720 if (!accept4_works)
2721#endif
2722 {
2723 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2724 SOCKETCLOSE(newfd);
2725 goto finally;
2726 }
2727 }
2728#endif
2729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 sock = PyLong_FromSocket_t(newfd);
2731 if (sock == NULL) {
2732 SOCKETCLOSE(newfd);
2733 goto finally;
2734 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2737 addrlen, s->sock_proto);
2738 if (addr == NULL)
2739 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002742
Guido van Rossum67f7a382002-06-06 21:08:16 +00002743finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 Py_XDECREF(sock);
2745 Py_XDECREF(addr);
2746 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002747}
2748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002749PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002750"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002751\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002752Wait for an incoming connection. Return a new socket file descriptor\n\
2753representing the connection, and the address of the client.\n\
2754For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002755
Guido van Rossum11ba0942002-06-13 15:07:44 +00002756/* s.setblocking(flag) method. Argument:
2757 False -- non-blocking mode; same as settimeout(0)
2758 True -- blocking mode; same as settimeout(None)
2759*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002760
Guido van Rossum73624e91994-10-10 17:59:00 +00002761static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002763{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002764 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 block = PyLong_AsLong(arg);
2767 if (block == -1 && PyErr_Occurred())
2768 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002769
Victor Stinner9001d802015-04-06 23:06:01 +02002770 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002771 if (internal_setblocking(s, block) == -1) {
2772 return NULL;
2773 }
2774 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002775}
Guido van Rossume4485b01994-09-07 14:32:49 +00002776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002777PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002778"setblocking(flag)\n\
2779\n\
2780Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002781setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002782setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002783
Yury Selivanovf11b4602018-01-28 17:27:38 -05002784/* s.getblocking() method.
2785 Returns True if socket is in blocking mode,
2786 False if it is in non-blocking mode.
2787*/
2788static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302789sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002790{
2791 if (s->sock_timeout) {
2792 Py_RETURN_TRUE;
2793 }
2794 else {
2795 Py_RETURN_FALSE;
2796 }
2797}
2798
2799PyDoc_STRVAR(getblocking_doc,
2800"getblocking()\n\
2801\n\
2802Returns True if socket is in blocking mode, or False if it\n\
2803is in non-blocking mode.");
2804
Victor Stinner71694d52015-03-28 01:18:54 +01002805static int
2806socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2807{
2808#ifdef MS_WINDOWS
2809 struct timeval tv;
2810#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002811#ifndef HAVE_POLL
2812 _PyTime_t ms;
2813#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002814 int overflow = 0;
2815
2816 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002817 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002818 return 0;
2819 }
2820
Victor Stinner869e1772015-03-30 03:49:14 +02002821 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002822 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002823 return -1;
2824
2825 if (*timeout < 0) {
2826 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2827 return -1;
2828 }
2829
2830#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002831 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002832#endif
2833#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002834 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002835 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002836#endif
2837 if (overflow) {
2838 PyErr_SetString(PyExc_OverflowError,
2839 "timeout doesn't fit into C timeval");
2840 return -1;
2841 }
2842
2843 return 0;
2844}
2845
Guido van Rossum11ba0942002-06-13 15:07:44 +00002846/* s.settimeout(timeout) method. Argument:
2847 None -- no timeout, blocking mode; same as setblocking(True)
2848 0.0 -- non-blocking mode; same as setblocking(False)
2849 > 0 -- timeout mode; operations time out after timeout seconds
2850 < 0 -- illegal; raises an exception
2851*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002853sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002854{
Victor Stinner71694d52015-03-28 01:18:54 +01002855 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002856
Victor Stinner71694d52015-03-28 01:18:54 +01002857 if (socket_parse_timeout(&timeout, arg) < 0)
2858 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002861
2862 int block = timeout < 0;
2863 /* Blocking mode for a Python socket object means that operations
2864 like :meth:`recv` or :meth:`sendall` will block the execution of
2865 the current thread until they are complete or aborted with a
2866 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2867 the underlying FD is in a blocking mode. When timeout is a positive
2868 number, the FD is in a non-blocking mode, and socket ops are
2869 implemented with a `select()` call.
2870
2871 When timeout is 0.0, the FD is in a non-blocking mode.
2872
2873 This table summarizes all states in which the socket object and
2874 its underlying FD can be:
2875
2876 ==================== ===================== ==============
2877 `gettimeout()` `getblocking()` FD
2878 ==================== ===================== ==============
2879 ``None`` ``True`` blocking
2880 ``0.0`` ``False`` non-blocking
2881 ``> 0`` ``True`` non-blocking
2882 */
2883
2884 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002885 return NULL;
2886 }
2887 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002888}
2889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002890PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002891"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002892\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002893Set a timeout on socket operations. 'timeout' can be a float,\n\
2894giving in seconds, or None. Setting a timeout of None disables\n\
2895the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002896Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002897
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002898/* s.gettimeout() method.
2899 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002900static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302901sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902{
Victor Stinner71694d52015-03-28 01:18:54 +01002903 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002904 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 }
Victor Stinner71694d52015-03-28 01:18:54 +01002906 else {
2907 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2908 return PyFloat_FromDouble(seconds);
2909 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002910}
2911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002912PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002913"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914\n\
oldkaa0735f2018-02-02 16:52:55 +08002915Returns the timeout in seconds (float) associated with socket\n\
2916operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002917operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002918
Guido van Rossumaee08791992-09-08 09:05:33 +00002919/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002920 With an integer third argument, sets an integer optval with optlen=4.
2921 With None as third argument and an integer fourth argument, set
2922 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002923 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002924 use optional built-in module 'struct' to encode the string.
2925*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002926
Guido van Rossum73624e91994-10-10 17:59:00 +00002927static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002928sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 int level;
2931 int optname;
2932 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002933 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002935 unsigned int optlen;
2936 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002937
caaveryeffc12f2017-09-06 18:18:10 -04002938#ifdef AF_VSOCK
2939 if (s->sock_family == AF_VSOCK) {
2940 uint64_t vflag; // Must be set width of 64 bits
2941 /* setsockopt(level, opt, flag) */
2942 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2943 &level, &optname, &vflag)) {
2944 // level should always be set to AF_VSOCK
2945 res = setsockopt(s->sock_fd, level, optname,
2946 (void*)&vflag, sizeof vflag);
2947 goto done;
2948 }
2949 return NULL;
2950 }
2951#endif
2952
Christian Heimesdffa3942016-09-05 23:54:41 +02002953 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if (PyArg_ParseTuple(args, "iii:setsockopt",
2955 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002956 res = setsockopt(s->sock_fd, level, optname,
2957 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002958 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002960
2961 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002962 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002963 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2964 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2965 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002966 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002967 NULL, (socklen_t)optlen);
2968 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002970
2971 PyErr_Clear();
2972 /* setsockopt(level, opt, buffer) */
2973 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2974 &level, &optname, &optval))
2975 return NULL;
2976
2977#ifdef MS_WINDOWS
2978 if (optval.len > INT_MAX) {
2979 PyBuffer_Release(&optval);
2980 PyErr_Format(PyExc_OverflowError,
2981 "socket option is larger than %i bytes",
2982 INT_MAX);
2983 return NULL;
2984 }
2985 res = setsockopt(s->sock_fd, level, optname,
2986 optval.buf, (int)optval.len);
2987#else
2988 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2989#endif
2990 PyBuffer_Release(&optval);
2991
2992done:
Victor Stinnercc739322016-03-23 21:35:29 +01002993 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002995 }
2996
2997 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002998}
2999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003000PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003001"setsockopt(level, option, value: int)\n\
3002setsockopt(level, option, value: buffer)\n\
3003setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003004\n\
3005Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003006The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003007None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003008
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003009
Guido van Rossumaee08791992-09-08 09:05:33 +00003010/* s.getsockopt() method.
3011 With two arguments, retrieves an integer option.
3012 With a third integer argument, retrieves a string buffer of that size;
3013 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003014
Guido van Rossum73624e91994-10-10 17:59:00 +00003015static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 int level;
3019 int optname;
3020 int res;
3021 PyObject *buf;
3022 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003023 int flag = 0;
3024 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3027 &level, &optname, &buflen))
3028 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003031#ifdef AF_VSOCK
3032 if (s->sock_family == AF_VSOCK) {
3033 uint64_t vflag = 0; // Must be set width of 64 bits
3034 flagsize = sizeof vflag;
3035 res = getsockopt(s->sock_fd, level, optname,
3036 (void *)&vflag, &flagsize);
3037 if (res < 0)
3038 return s->errorhandler();
3039 return PyLong_FromUnsignedLong(vflag);
3040 }
3041#endif
3042 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 res = getsockopt(s->sock_fd, level, optname,
3044 (void *)&flag, &flagsize);
3045 if (res < 0)
3046 return s->errorhandler();
3047 return PyLong_FromLong(flag);
3048 }
caaveryeffc12f2017-09-06 18:18:10 -04003049#ifdef AF_VSOCK
3050 if (s->sock_family == AF_VSOCK) {
3051 PyErr_SetString(PyExc_OSError,
3052 "getsockopt string buffer not allowed");
3053 return NULL;
3054 }
3055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003057 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 "getsockopt buflen out of range");
3059 return NULL;
3060 }
3061 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3062 if (buf == NULL)
3063 return NULL;
3064 res = getsockopt(s->sock_fd, level, optname,
3065 (void *)PyBytes_AS_STRING(buf), &buflen);
3066 if (res < 0) {
3067 Py_DECREF(buf);
3068 return s->errorhandler();
3069 }
3070 _PyBytes_Resize(&buf, buflen);
3071 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003072}
3073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003074PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003075"getsockopt(level, option[, buffersize]) -> value\n\
3076\n\
3077Get a socket option. See the Unix manual for level and option.\n\
3078If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003079string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003080
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003081
Fred Drake728819a2000-07-01 03:40:12 +00003082/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003083
Guido van Rossum73624e91994-10-10 17:59:00 +00003084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003085sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 sock_addr_t addrbuf;
3088 int addrlen;
3089 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003090
Victor Stinnerd565fb92019-10-10 21:30:20 +02003091 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003093 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003094
3095 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3096 return NULL;
3097 }
3098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 Py_BEGIN_ALLOW_THREADS
3100 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3101 Py_END_ALLOW_THREADS
3102 if (res < 0)
3103 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003104 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003105}
3106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003107PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108"bind(address)\n\
3109\n\
3110Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003111pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003112sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003113
Guido van Rossum30a685f1991-06-27 15:51:29 +00003114
3115/* s.close() method.
3116 Set the file descriptor to -1 so operations tried subsequently
3117 will surely fail. */
3118
Guido van Rossum73624e91994-10-10 17:59:00 +00003119static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303120sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003123 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003124
Victor Stinner19a8e842016-03-21 16:36:48 +01003125 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003126 if (fd != INVALID_SOCKET) {
3127 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003128
3129 /* We do not want to retry upon EINTR: see
3130 http://lwn.net/Articles/576478/ and
3131 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3132 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003134 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003136 /* bpo-30319: The peer can already have closed the connection.
3137 Python ignores ECONNRESET on close(). */
3138 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003139 return s->errorhandler();
3140 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003142 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003143}
3144
Christian Heimesd0e31b92018-01-27 09:54:13 +01003145PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003146"close()\n\
3147\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003148Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003149
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003150static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303151sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003152{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003153 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003154 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003155 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003156}
3157
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003158PyDoc_STRVAR(detach_doc,
3159"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003160\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003161Close the socket object without closing the underlying file descriptor.\n\
3162The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003163can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003164
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003165static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003166sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003167{
Victor Stinner81c41db2015-04-02 11:50:57 +02003168 int err;
3169 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003170
Victor Stinner81c41db2015-04-02 11:50:57 +02003171 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3172 /* getsockopt() failed */
3173 return 0;
3174 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003175
Victor Stinner81c41db2015-04-02 11:50:57 +02003176 if (err == EISCONN)
3177 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003178 if (err != 0) {
3179 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3180 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003181 return 0;
3182 }
3183 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003184}
3185
3186static int
3187internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3188 int raise)
3189{
3190 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003191
3192 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003194 Py_END_ALLOW_THREADS
3195
Victor Stinner70a46f62015-03-31 22:03:59 +02003196 if (!res) {
3197 /* connect() succeeded, the socket is connected */
3198 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003200
Victor Stinner81c41db2015-04-02 11:50:57 +02003201 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003202
Victor Stinner81c41db2015-04-02 11:50:57 +02003203 /* save error, PyErr_CheckSignals() can replace it */
3204 err = GET_SOCK_ERROR;
3205 if (CHECK_ERRNO(EINTR)) {
3206 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003207 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003208
3209 /* Issue #23618: when connect() fails with EINTR, the connection is
3210 running asynchronously.
3211
3212 If the socket is blocking or has a timeout, wait until the
3213 connection completes, fails or timed out using select(), and then
3214 get the connection status using getsockopt(SO_ERROR).
3215
3216 If the socket is non-blocking, raise InterruptedError. The caller is
3217 responsible to wait until the connection completes, fails or timed
3218 out (it's the case in asyncio for example). */
3219 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3220 }
3221 else {
3222 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3223 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003224 }
3225
Victor Stinner81c41db2015-04-02 11:50:57 +02003226 if (!wait_connect) {
3227 if (raise) {
3228 /* restore error, maybe replaced by PyErr_CheckSignals() */
3229 SET_SOCK_ERROR(err);
3230 s->errorhandler();
3231 return -1;
3232 }
3233 else
3234 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003235 }
3236
Victor Stinner81c41db2015-04-02 11:50:57 +02003237 if (raise) {
3238 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003239 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3240 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003241 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003242 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003243 else {
3244 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003245 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3246 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003247 return err;
3248 }
3249 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003250}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003251
Fred Drake728819a2000-07-01 03:40:12 +00003252/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003253
Guido van Rossum73624e91994-10-10 17:59:00 +00003254static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003255sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 sock_addr_t addrbuf;
3258 int addrlen;
3259 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003260
Victor Stinnerd565fb92019-10-10 21:30:20 +02003261 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003263 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003264
Steve Dowerb82e17e2019-05-23 08:45:22 -07003265 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3266 return NULL;
3267 }
3268
Victor Stinner81c41db2015-04-02 11:50:57 +02003269 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003270 if (res < 0)
3271 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003272
Victor Stinneree699e92015-03-31 21:28:42 +02003273 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003274}
3275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003276PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003277"connect(address)\n\
3278\n\
3279Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003280is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003281
Guido van Rossum30a685f1991-06-27 15:51:29 +00003282
Fred Drake728819a2000-07-01 03:40:12 +00003283/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003284
3285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003286sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 sock_addr_t addrbuf;
3289 int addrlen;
3290 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003291
Victor Stinnerd565fb92019-10-10 21:30:20 +02003292 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003294 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003295
Steve Dowerb82e17e2019-05-23 08:45:22 -07003296 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3297 return NULL;
3298 }
3299
Victor Stinner81c41db2015-04-02 11:50:57 +02003300 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003301 if (res < 0)
3302 return NULL;
3303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003305}
3306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003307PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003308"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003309\n\
3310This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003311instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003312
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003313
Guido van Rossumed233a51992-06-23 09:07:03 +00003314/* s.fileno() method */
3315
Guido van Rossum73624e91994-10-10 17:59:00 +00003316static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303317sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003320}
3321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003322PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003323"fileno() -> integer\n\
3324\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003325Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003326
Guido van Rossumed233a51992-06-23 09:07:03 +00003327
Guido van Rossumc89705d1992-11-26 08:54:07 +00003328/* s.getsockname() method */
3329
Guido van Rossum73624e91994-10-10 17:59:00 +00003330static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303331sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 sock_addr_t addrbuf;
3334 int res;
3335 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 if (!getsockaddrlen(s, &addrlen))
3338 return NULL;
3339 memset(&addrbuf, 0, addrlen);
3340 Py_BEGIN_ALLOW_THREADS
3341 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3342 Py_END_ALLOW_THREADS
3343 if (res < 0)
3344 return s->errorhandler();
3345 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3346 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003347}
3348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003350"getsockname() -> address info\n\
3351\n\
3352Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003353info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003354
Guido van Rossumc89705d1992-11-26 08:54:07 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003357/* s.getpeername() method */
3358
Guido van Rossum73624e91994-10-10 17:59:00 +00003359static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303360sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003361{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 sock_addr_t addrbuf;
3363 int res;
3364 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 if (!getsockaddrlen(s, &addrlen))
3367 return NULL;
3368 memset(&addrbuf, 0, addrlen);
3369 Py_BEGIN_ALLOW_THREADS
3370 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3371 Py_END_ALLOW_THREADS
3372 if (res < 0)
3373 return s->errorhandler();
3374 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3375 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003376}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003378PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003379"getpeername() -> address info\n\
3380\n\
3381Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003382info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003383
Guido van Rossumb6775db1994-08-01 11:34:53 +00003384#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003385
3386
Guido van Rossum30a685f1991-06-27 15:51:29 +00003387/* s.listen(n) method */
3388
Guido van Rossum73624e91994-10-10 17:59:00 +00003389static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003390sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003391{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003392 /* We try to choose a default backlog high enough to avoid connection drops
3393 * for common workloads, yet not too high to limit resource usage. */
3394 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003396
Charles-François Natali644b8f52014-05-22 19:45:39 +01003397 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003401 /* To avoid problems on systems that don't allow a negative backlog
3402 * (which doesn't make sense anyway) we force a minimum value of 0. */
3403 if (backlog < 0)
3404 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 res = listen(s->sock_fd, backlog);
3406 Py_END_ALLOW_THREADS
3407 if (res < 0)
3408 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003409 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003410}
3411
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003412PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003413"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003414\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003415Enable a server to accept connections. If backlog is specified, it must be\n\
3416at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003417unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003418connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003419
Victor Stinner31bf2d52015-04-01 21:57:09 +02003420struct sock_recv {
3421 char *cbuf;
3422 Py_ssize_t len;
3423 int flags;
3424 Py_ssize_t result;
3425};
3426
3427static int
3428sock_recv_impl(PySocketSockObject *s, void *data)
3429{
3430 struct sock_recv *ctx = data;
3431
3432#ifdef MS_WINDOWS
3433 if (ctx->len > INT_MAX)
3434 ctx->len = INT_MAX;
3435 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3436#else
3437 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3438#endif
3439 return (ctx->result >= 0);
3440}
3441
Guido van Rossum82a5c661998-07-07 20:45:43 +00003442
Thomas Wouters477c8d52006-05-27 19:21:47 +00003443/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003444 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003445 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003446 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003447 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003448 * also possible that we return a number of bytes smaller than the request
3449 * bytes.
3450 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003451
Antoine Pitrou19467d22010-08-17 19:33:30 +00003452static Py_ssize_t
3453sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003454{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003455 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 if (!IS_SELECTABLE(s)) {
3458 select_error();
3459 return -1;
3460 }
3461 if (len == 0) {
3462 /* If 0 bytes were requested, do nothing. */
3463 return 0;
3464 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003465
Victor Stinner31bf2d52015-04-01 21:57:09 +02003466 ctx.cbuf = cbuf;
3467 ctx.len = len;
3468 ctx.flags = flags;
3469 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003471
3472 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003473}
3474
Guido van Rossum48a680c2001-03-02 06:34:14 +00003475
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003476/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003477
Guido van Rossum73624e91994-10-10 17:59:00 +00003478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003479sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003480{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003481 Py_ssize_t recvlen, outlen;
3482 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003484
Antoine Pitrou19467d22010-08-17 19:33:30 +00003485 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 if (recvlen < 0) {
3489 PyErr_SetString(PyExc_ValueError,
3490 "negative buffersize in recv");
3491 return NULL;
3492 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 /* Allocate a new string. */
3495 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3496 if (buf == NULL)
3497 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 /* Call the guts */
3500 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3501 if (outlen < 0) {
3502 /* An error occurred, release the string and return an
3503 error. */
3504 Py_DECREF(buf);
3505 return NULL;
3506 }
3507 if (outlen != recvlen) {
3508 /* We did not read as many bytes as we anticipated, resize the
3509 string if possible and be successful. */
3510 _PyBytes_Resize(&buf, outlen);
3511 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003514}
3515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003516PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003517"recv(buffersize[, flags]) -> data\n\
3518\n\
3519Receive up to buffersize bytes from the socket. For the optional flags\n\
3520argument, see the Unix manual. When no data is available, block until\n\
3521at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003522the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003523
Guido van Rossum30a685f1991-06-27 15:51:29 +00003524
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003525/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003526
Thomas Wouters477c8d52006-05-27 19:21:47 +00003527static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003528sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003531
Antoine Pitrou19467d22010-08-17 19:33:30 +00003532 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 Py_buffer pbuf;
3534 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003535 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003537 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003538 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 &pbuf, &recvlen, &flags))
3540 return NULL;
3541 buf = pbuf.buf;
3542 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 if (recvlen < 0) {
3545 PyBuffer_Release(&pbuf);
3546 PyErr_SetString(PyExc_ValueError,
3547 "negative buffersize in recv_into");
3548 return NULL;
3549 }
3550 if (recvlen == 0) {
3551 /* If nbytes was not specified, use the buffer's length */
3552 recvlen = buflen;
3553 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 /* Check if the buffer is large enough */
3556 if (buflen < recvlen) {
3557 PyBuffer_Release(&pbuf);
3558 PyErr_SetString(PyExc_ValueError,
3559 "buffer too small for requested bytes");
3560 return NULL;
3561 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 /* Call the guts */
3564 readlen = sock_recv_guts(s, buf, recvlen, flags);
3565 if (readlen < 0) {
3566 /* Return an error. */
3567 PyBuffer_Release(&pbuf);
3568 return NULL;
3569 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 PyBuffer_Release(&pbuf);
3572 /* Return the number of bytes read. Note that we do not do anything
3573 special here in the case that readlen < recvlen. */
3574 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575}
3576
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003577PyDoc_STRVAR(recv_into_doc,
3578"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003579\n\
oldkaa0735f2018-02-02 16:52:55 +08003580A version of recv() that stores its data into a buffer rather than creating\n\
3581a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003582is not specified (or 0), receive up to the size available in the given buffer.\n\
3583\n\
3584See recv() for documentation about the flags.");
3585
Victor Stinner31bf2d52015-04-01 21:57:09 +02003586struct sock_recvfrom {
3587 char* cbuf;
3588 Py_ssize_t len;
3589 int flags;
3590 socklen_t *addrlen;
3591 sock_addr_t *addrbuf;
3592 Py_ssize_t result;
3593};
3594
3595static int
3596sock_recvfrom_impl(PySocketSockObject *s, void *data)
3597{
3598 struct sock_recvfrom *ctx = data;
3599
3600 memset(ctx->addrbuf, 0, *ctx->addrlen);
3601
3602#ifdef MS_WINDOWS
3603 if (ctx->len > INT_MAX)
3604 ctx->len = INT_MAX;
3605 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3606 SAS2SA(ctx->addrbuf), ctx->addrlen);
3607#else
3608 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3609 SAS2SA(ctx->addrbuf), ctx->addrlen);
3610#endif
3611 return (ctx->result >= 0);
3612}
3613
Thomas Wouters477c8d52006-05-27 19:21:47 +00003614
3615/*
Christian Heimes99170a52007-12-19 02:07:34 +00003616 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3617 * into a char buffer. If you have any inc/def ref to do to the objects that
3618 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003619 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003620 * that it is also possible that we return a number of bytes smaller than the
3621 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003622 *
3623 * 'addr' is a return value for the address object. Note that you must decref
3624 * it yourself.
3625 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003626static Py_ssize_t
3627sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003632 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 if (!getsockaddrlen(s, &addrlen))
3637 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 if (!IS_SELECTABLE(s)) {
3640 select_error();
3641 return -1;
3642 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003643
Victor Stinner31bf2d52015-04-01 21:57:09 +02003644 ctx.cbuf = cbuf;
3645 ctx.len = len;
3646 ctx.flags = flags;
3647 ctx.addrbuf = &addrbuf;
3648 ctx.addrlen = &addrlen;
3649 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003651
Victor Stinner31bf2d52015-04-01 21:57:09 +02003652 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3653 s->sock_proto);
3654 if (*addr == NULL)
3655 return -1;
3656
3657 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003658}
3659
3660/* s.recvfrom(nbytes [,flags]) method */
3661
3662static PyObject *
3663sock_recvfrom(PySocketSockObject *s, PyObject *args)
3664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 PyObject *buf = NULL;
3666 PyObject *addr = NULL;
3667 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003668 int flags = 0;
3669 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003670
Antoine Pitrou19467d22010-08-17 19:33:30 +00003671 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 if (recvlen < 0) {
3675 PyErr_SetString(PyExc_ValueError,
3676 "negative buffersize in recvfrom");
3677 return NULL;
3678 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3681 if (buf == NULL)
3682 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3685 recvlen, flags, &addr);
3686 if (outlen < 0) {
3687 goto finally;
3688 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 if (outlen != recvlen) {
3691 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003692 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003694 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 goto finally;
3696 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003699
3700finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 Py_XDECREF(buf);
3702 Py_XDECREF(addr);
3703 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003704}
3705
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003706PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003707"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3708\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003709Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003710
Thomas Wouters477c8d52006-05-27 19:21:47 +00003711
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003712/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003713
3714static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003715sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003718
Antoine Pitrou19467d22010-08-17 19:33:30 +00003719 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 Py_buffer pbuf;
3721 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003722 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003725
Antoine Pitrou19467d22010-08-17 19:33:30 +00003726 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003727 kwlist, &pbuf,
3728 &recvlen, &flags))
3729 return NULL;
3730 buf = pbuf.buf;
3731 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 if (recvlen < 0) {
3734 PyBuffer_Release(&pbuf);
3735 PyErr_SetString(PyExc_ValueError,
3736 "negative buffersize in recvfrom_into");
3737 return NULL;
3738 }
3739 if (recvlen == 0) {
3740 /* If nbytes was not specified, use the buffer's length */
3741 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003742 } else if (recvlen > buflen) {
3743 PyBuffer_Release(&pbuf);
3744 PyErr_SetString(PyExc_ValueError,
3745 "nbytes is greater than the length of the buffer");
3746 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3750 if (readlen < 0) {
3751 PyBuffer_Release(&pbuf);
3752 /* Return an error */
3753 Py_XDECREF(addr);
3754 return NULL;
3755 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 PyBuffer_Release(&pbuf);
3758 /* Return the number of bytes read and the address. Note that we do
3759 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003760 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003761}
3762
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003763PyDoc_STRVAR(recvfrom_into_doc,
3764"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003765\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003766Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003767
Victor Stinner35bee932015-04-02 12:28:07 +02003768/* The sendmsg() and recvmsg[_into]() methods require a working
3769 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3770#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003771struct sock_recvmsg {
3772 struct msghdr *msg;
3773 int flags;
3774 ssize_t result;
3775};
3776
3777static int
3778sock_recvmsg_impl(PySocketSockObject *s, void *data)
3779{
3780 struct sock_recvmsg *ctx = data;
3781
3782 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3783 return (ctx->result >= 0);
3784}
3785
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003786/*
3787 * Call recvmsg() with the supplied iovec structures, flags, and
3788 * ancillary data buffer size (controllen). Returns the tuple return
3789 * value for recvmsg() or recvmsg_into(), with the first item provided
3790 * by the supplied makeval() function. makeval() will be called with
3791 * the length read and makeval_data as arguments, and must return a
3792 * new reference (which will be decrefed if there is a subsequent
3793 * error). On error, closes any file descriptors received via
3794 * SCM_RIGHTS.
3795 */
3796static PyObject *
3797sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3798 int flags, Py_ssize_t controllen,
3799 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3800{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003801 sock_addr_t addrbuf;
3802 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003803 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003804 PyObject *cmsg_list = NULL, *retval = NULL;
3805 void *controlbuf = NULL;
3806 struct cmsghdr *cmsgh;
3807 size_t cmsgdatalen = 0;
3808 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003809 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003810
3811 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3812 ignored" when the socket is connected (Linux fills them in
3813 anyway for AF_UNIX sockets at least). Normally msg_namelen
3814 seems to be set to 0 if there's no address, but try to
3815 initialize msg_name to something that won't be mistaken for a
3816 real address if that doesn't happen. */
3817 if (!getsockaddrlen(s, &addrbuflen))
3818 return NULL;
3819 memset(&addrbuf, 0, addrbuflen);
3820 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3821
3822 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3823 PyErr_SetString(PyExc_ValueError,
3824 "invalid ancillary data buffer length");
3825 return NULL;
3826 }
3827 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3828 return PyErr_NoMemory();
3829
3830 /* Make the system call. */
3831 if (!IS_SELECTABLE(s)) {
3832 select_error();
3833 goto finally;
3834 }
3835
Victor Stinner31bf2d52015-04-01 21:57:09 +02003836 msg.msg_name = SAS2SA(&addrbuf);
3837 msg.msg_namelen = addrbuflen;
3838 msg.msg_iov = iov;
3839 msg.msg_iovlen = iovlen;
3840 msg.msg_control = controlbuf;
3841 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003842
Victor Stinner31bf2d52015-04-01 21:57:09 +02003843 ctx.msg = &msg;
3844 ctx.flags = flags;
3845 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003846 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003847
3848 /* Make list of (level, type, data) tuples from control messages. */
3849 if ((cmsg_list = PyList_New(0)) == NULL)
3850 goto err_closefds;
3851 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3852 implementations didn't do so. */
3853 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3854 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3855 PyObject *bytes, *tuple;
3856 int tmp;
3857
3858 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3859 if (cmsg_status != 0) {
3860 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3861 "received malformed or improperly-truncated "
3862 "ancillary data", 1) == -1)
3863 goto err_closefds;
3864 }
3865 if (cmsg_status < 0)
3866 break;
3867 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003868 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869 goto err_closefds;
3870 }
3871
3872 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3873 cmsgdatalen);
3874 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3875 (int)cmsgh->cmsg_type, bytes);
3876 if (tuple == NULL)
3877 goto err_closefds;
3878 tmp = PyList_Append(cmsg_list, tuple);
3879 Py_DECREF(tuple);
3880 if (tmp != 0)
3881 goto err_closefds;
3882
3883 if (cmsg_status != 0)
3884 break;
3885 }
3886
3887 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003888 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003889 cmsg_list,
3890 (int)msg.msg_flags,
3891 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3892 ((msg.msg_namelen > addrbuflen) ?
3893 addrbuflen : msg.msg_namelen),
3894 s->sock_proto));
3895 if (retval == NULL)
3896 goto err_closefds;
3897
3898finally:
3899 Py_XDECREF(cmsg_list);
3900 PyMem_Free(controlbuf);
3901 return retval;
3902
3903err_closefds:
3904#ifdef SCM_RIGHTS
3905 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3906 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3907 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3908 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3909 if (cmsg_status < 0)
3910 break;
3911 if (cmsgh->cmsg_level == SOL_SOCKET &&
3912 cmsgh->cmsg_type == SCM_RIGHTS) {
3913 size_t numfds;
3914 int *fdp;
3915
3916 numfds = cmsgdatalen / sizeof(int);
3917 fdp = (int *)CMSG_DATA(cmsgh);
3918 while (numfds-- > 0)
3919 close(*fdp++);
3920 }
3921 if (cmsg_status != 0)
3922 break;
3923 }
3924#endif /* SCM_RIGHTS */
3925 goto finally;
3926}
3927
3928
3929static PyObject *
3930makeval_recvmsg(ssize_t received, void *data)
3931{
3932 PyObject **buf = data;
3933
3934 if (received < PyBytes_GET_SIZE(*buf))
3935 _PyBytes_Resize(buf, received);
3936 Py_XINCREF(*buf);
3937 return *buf;
3938}
3939
3940/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3941
3942static PyObject *
3943sock_recvmsg(PySocketSockObject *s, PyObject *args)
3944{
3945 Py_ssize_t bufsize, ancbufsize = 0;
3946 int flags = 0;
3947 struct iovec iov;
3948 PyObject *buf = NULL, *retval = NULL;
3949
3950 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3951 return NULL;
3952
3953 if (bufsize < 0) {
3954 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3955 return NULL;
3956 }
3957 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3958 return NULL;
3959 iov.iov_base = PyBytes_AS_STRING(buf);
3960 iov.iov_len = bufsize;
3961
3962 /* Note that we're passing a pointer to *our pointer* to the bytes
3963 object here (&buf); makeval_recvmsg() may incref the object, or
3964 deallocate it and set our pointer to NULL. */
3965 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3966 &makeval_recvmsg, &buf);
3967 Py_XDECREF(buf);
3968 return retval;
3969}
3970
3971PyDoc_STRVAR(recvmsg_doc,
3972"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3973\n\
3974Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3975socket. The ancbufsize argument sets the size in bytes of the\n\
3976internal buffer used to receive the ancillary data; it defaults to 0,\n\
3977meaning that no ancillary data will be received. Appropriate buffer\n\
3978sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3979CMSG_LEN(), and items which do not fit into the buffer might be\n\
3980truncated or discarded. The flags argument defaults to 0 and has the\n\
3981same meaning as for recv().\n\
3982\n\
3983The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3984The data item is a bytes object holding the non-ancillary data\n\
3985received. The ancdata item is a list of zero or more tuples\n\
3986(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3987(control messages) received: cmsg_level and cmsg_type are integers\n\
3988specifying the protocol level and protocol-specific type respectively,\n\
3989and cmsg_data is a bytes object holding the associated data. The\n\
3990msg_flags item is the bitwise OR of various flags indicating\n\
3991conditions on the received message; see your system documentation for\n\
3992details. If the receiving socket is unconnected, address is the\n\
3993address of the sending socket, if available; otherwise, its value is\n\
3994unspecified.\n\
3995\n\
3996If recvmsg() raises an exception after the system call returns, it\n\
3997will first attempt to close any file descriptors received via the\n\
3998SCM_RIGHTS mechanism.");
3999
4000
4001static PyObject *
4002makeval_recvmsg_into(ssize_t received, void *data)
4003{
4004 return PyLong_FromSsize_t(received);
4005}
4006
4007/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4008
4009static PyObject *
4010sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4011{
4012 Py_ssize_t ancbufsize = 0;
4013 int flags = 0;
4014 struct iovec *iovs = NULL;
4015 Py_ssize_t i, nitems, nbufs = 0;
4016 Py_buffer *bufs = NULL;
4017 PyObject *buffers_arg, *fast, *retval = NULL;
4018
4019 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4020 &buffers_arg, &ancbufsize, &flags))
4021 return NULL;
4022
4023 if ((fast = PySequence_Fast(buffers_arg,
4024 "recvmsg_into() argument 1 must be an "
4025 "iterable")) == NULL)
4026 return NULL;
4027 nitems = PySequence_Fast_GET_SIZE(fast);
4028 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004029 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004030 goto finally;
4031 }
4032
4033 /* Fill in an iovec for each item, and save the Py_buffer
4034 structs to release afterwards. */
4035 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4036 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4037 PyErr_NoMemory();
4038 goto finally;
4039 }
4040 for (; nbufs < nitems; nbufs++) {
4041 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4042 "w*;recvmsg_into() argument 1 must be an iterable "
4043 "of single-segment read-write buffers",
4044 &bufs[nbufs]))
4045 goto finally;
4046 iovs[nbufs].iov_base = bufs[nbufs].buf;
4047 iovs[nbufs].iov_len = bufs[nbufs].len;
4048 }
4049
4050 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4051 &makeval_recvmsg_into, NULL);
4052finally:
4053 for (i = 0; i < nbufs; i++)
4054 PyBuffer_Release(&bufs[i]);
4055 PyMem_Free(bufs);
4056 PyMem_Free(iovs);
4057 Py_DECREF(fast);
4058 return retval;
4059}
4060
4061PyDoc_STRVAR(recvmsg_into_doc,
4062"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4063\n\
4064Receive normal data and ancillary data from the socket, scattering the\n\
4065non-ancillary data into a series of buffers. The buffers argument\n\
4066must be an iterable of objects that export writable buffers\n\
4067(e.g. bytearray objects); these will be filled with successive chunks\n\
4068of the non-ancillary data until it has all been written or there are\n\
4069no more buffers. The ancbufsize argument sets the size in bytes of\n\
4070the internal buffer used to receive the ancillary data; it defaults to\n\
40710, meaning that no ancillary data will be received. Appropriate\n\
4072buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4073or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4074truncated or discarded. The flags argument defaults to 0 and has the\n\
4075same meaning as for recv().\n\
4076\n\
4077The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4078The nbytes item is the total number of bytes of non-ancillary data\n\
4079written into the buffers. The ancdata item is a list of zero or more\n\
4080tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4081data (control messages) received: cmsg_level and cmsg_type are\n\
4082integers specifying the protocol level and protocol-specific type\n\
4083respectively, and cmsg_data is a bytes object holding the associated\n\
4084data. The msg_flags item is the bitwise OR of various flags\n\
4085indicating conditions on the received message; see your system\n\
4086documentation for details. If the receiving socket is unconnected,\n\
4087address is the address of the sending socket, if available; otherwise,\n\
4088its value is unspecified.\n\
4089\n\
4090If recvmsg_into() raises an exception after the system call returns,\n\
4091it will first attempt to close any file descriptors received via the\n\
4092SCM_RIGHTS mechanism.");
4093#endif /* CMSG_LEN */
4094
4095
Victor Stinner31bf2d52015-04-01 21:57:09 +02004096struct sock_send {
4097 char *buf;
4098 Py_ssize_t len;
4099 int flags;
4100 Py_ssize_t result;
4101};
4102
4103static int
4104sock_send_impl(PySocketSockObject *s, void *data)
4105{
4106 struct sock_send *ctx = data;
4107
4108#ifdef MS_WINDOWS
4109 if (ctx->len > INT_MAX)
4110 ctx->len = INT_MAX;
4111 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4112#else
4113 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4114#endif
4115 return (ctx->result >= 0);
4116}
4117
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004118/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004119
Guido van Rossum73624e91994-10-10 17:59:00 +00004120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004121sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004122{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004123 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004125 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4128 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 if (!IS_SELECTABLE(s)) {
4131 PyBuffer_Release(&pbuf);
4132 return select_error();
4133 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004134 ctx.buf = pbuf.buf;
4135 ctx.len = pbuf.len;
4136 ctx.flags = flags;
4137 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004138 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 return NULL;
4140 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004141 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004142
4143 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004144}
4145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004146PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004147"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004148\n\
4149Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004150argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004151sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004152
4153
4154/* s.sendall(data [,flags]) method */
4155
4156static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004157sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004160 Py_ssize_t len, n;
4161 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004163 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004164 int has_timeout = (s->sock_timeout > 0);
4165 _PyTime_t interval = s->sock_timeout;
4166 _PyTime_t deadline = 0;
4167 int deadline_initialized = 0;
4168 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4171 return NULL;
4172 buf = pbuf.buf;
4173 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (!IS_SELECTABLE(s)) {
4176 PyBuffer_Release(&pbuf);
4177 return select_error();
4178 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004181 if (has_timeout) {
4182 if (deadline_initialized) {
4183 /* recompute the timeout */
4184 interval = deadline - _PyTime_GetMonotonicClock();
4185 }
4186 else {
4187 deadline_initialized = 1;
4188 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4189 }
4190
4191 if (interval <= 0) {
4192 PyErr_SetString(socket_timeout, "timed out");
4193 goto done;
4194 }
4195 }
4196
Victor Stinner02f32ab2015-04-01 22:53:26 +02004197 ctx.buf = buf;
4198 ctx.len = len;
4199 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004200 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4201 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004202 n = ctx.result;
4203 assert(n >= 0);
4204
4205 buf += n;
4206 len -= n;
4207
4208 /* We must run our signal handlers before looping again.
4209 send() can return a successful partial write when it is
4210 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004211 if (PyErr_CheckSignals())
4212 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004213 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004215
Victor Stinner8912d142015-04-06 23:16:34 +02004216 Py_INCREF(Py_None);
4217 res = Py_None;
4218
4219done:
4220 PyBuffer_Release(&pbuf);
4221 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004222}
4223
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004224PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004225"sendall(data[, flags])\n\
4226\n\
4227Send a data string to the socket. For the optional flags\n\
4228argument, see the Unix manual. This calls send() repeatedly\n\
4229until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004230to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004231
Guido van Rossum30a685f1991-06-27 15:51:29 +00004232
Victor Stinner31bf2d52015-04-01 21:57:09 +02004233struct sock_sendto {
4234 char *buf;
4235 Py_ssize_t len;
4236 int flags;
4237 int addrlen;
4238 sock_addr_t *addrbuf;
4239 Py_ssize_t result;
4240};
4241
4242static int
4243sock_sendto_impl(PySocketSockObject *s, void *data)
4244{
4245 struct sock_sendto *ctx = data;
4246
4247#ifdef MS_WINDOWS
4248 if (ctx->len > INT_MAX)
4249 ctx->len = INT_MAX;
4250 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4251 SAS2SA(ctx->addrbuf), ctx->addrlen);
4252#else
4253 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4254 SAS2SA(ctx->addrbuf), ctx->addrlen);
4255#endif
4256 return (ctx->result >= 0);
4257}
4258
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004259/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004260
Guido van Rossum73624e91994-10-10 17:59:00 +00004261static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004262sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 Py_buffer pbuf;
4265 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004266 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004268 int addrlen, flags;
4269 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004272 arglen = PyTuple_Size(args);
4273 switch (arglen) {
4274 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004275 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4276 return NULL;
4277 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004278 break;
4279 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004280 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4281 &pbuf, &flags, &addro)) {
4282 return NULL;
4283 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004284 break;
4285 default:
4286 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004287 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004288 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004289 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 if (!IS_SELECTABLE(s)) {
4293 PyBuffer_Release(&pbuf);
4294 return select_error();
4295 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004296
Victor Stinnerd565fb92019-10-10 21:30:20 +02004297 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 PyBuffer_Release(&pbuf);
4299 return NULL;
4300 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004301
Steve Dowerb82e17e2019-05-23 08:45:22 -07004302 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4303 return NULL;
4304 }
4305
Victor Stinner31bf2d52015-04-01 21:57:09 +02004306 ctx.buf = pbuf.buf;
4307 ctx.len = pbuf.len;
4308 ctx.flags = flags;
4309 ctx.addrlen = addrlen;
4310 ctx.addrbuf = &addrbuf;
4311 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004312 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 return NULL;
4314 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004315 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004316
4317 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004318}
4319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004320PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004321"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004322\n\
4323Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004324For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004325
Guido van Rossum30a685f1991-06-27 15:51:29 +00004326
Victor Stinner35bee932015-04-02 12:28:07 +02004327/* The sendmsg() and recvmsg[_into]() methods require a working
4328 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4329#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004330struct sock_sendmsg {
4331 struct msghdr *msg;
4332 int flags;
4333 ssize_t result;
4334};
4335
4336static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004337sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4338 struct msghdr *msg,
4339 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4340 Py_ssize_t ndataparts, ndatabufs = 0;
4341 int result = -1;
4342 struct iovec *iovs = NULL;
4343 PyObject *data_fast = NULL;
4344 Py_buffer *databufs = NULL;
4345
4346 /* Fill in an iovec for each message part, and save the Py_buffer
4347 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004348 data_fast = PySequence_Fast(data_arg,
4349 "sendmsg() argument 1 must be an "
4350 "iterable");
4351 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004352 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004353 }
4354
Christian Heimesdffa3942016-09-05 23:54:41 +02004355 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4356 if (ndataparts > INT_MAX) {
4357 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4358 goto finally;
4359 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004360
Christian Heimesdffa3942016-09-05 23:54:41 +02004361 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004362 if (ndataparts > 0) {
4363 iovs = PyMem_New(struct iovec, ndataparts);
4364 if (iovs == NULL) {
4365 PyErr_NoMemory();
4366 goto finally;
4367 }
4368 msg->msg_iov = iovs;
4369
4370 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004371 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004372 PyErr_NoMemory();
4373 goto finally;
4374 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004375 }
4376 for (; ndatabufs < ndataparts; ndatabufs++) {
4377 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4378 "y*;sendmsg() argument 1 must be an iterable of "
4379 "bytes-like objects",
4380 &databufs[ndatabufs]))
4381 goto finally;
4382 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4383 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4384 }
4385 result = 0;
4386 finally:
4387 *databufsout = databufs;
4388 *ndatabufsout = ndatabufs;
4389 Py_XDECREF(data_fast);
4390 return result;
4391}
4392
4393static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004394sock_sendmsg_impl(PySocketSockObject *s, void *data)
4395{
4396 struct sock_sendmsg *ctx = data;
4397
4398 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4399 return (ctx->result >= 0);
4400}
4401
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004402/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4403
4404static PyObject *
4405sock_sendmsg(PySocketSockObject *s, PyObject *args)
4406{
Christian Heimesdffa3942016-09-05 23:54:41 +02004407 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004408 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004409 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004410 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004411 struct cmsginfo {
4412 int level;
4413 int type;
4414 Py_buffer data;
4415 } *cmsgs = NULL;
4416 void *controlbuf = NULL;
4417 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004418 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004419 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004420 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004421 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004422
4423 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004424 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004426 }
4427
4428 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004430 /* Parse destination address. */
4431 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004432 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004433 "sendmsg"))
4434 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004435 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004436 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004437 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4438 return NULL;
4439 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440 msg.msg_name = &addrbuf;
4441 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004442 } else {
4443 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4444 return NULL;
4445 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004446 }
4447
4448 /* Fill in an iovec for each message part, and save the Py_buffer
4449 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004450 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004451 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004452 }
4453
4454 if (cmsg_arg == NULL)
4455 ncmsgs = 0;
4456 else {
4457 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4458 "sendmsg() argument 2 must be an "
4459 "iterable")) == NULL)
4460 goto finally;
4461 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4462 }
4463
4464#ifndef CMSG_SPACE
4465 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004466 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467 "sending multiple control messages is not supported "
4468 "on this system");
4469 goto finally;
4470 }
4471#endif
4472 /* Save level, type and Py_buffer for each control message,
4473 and calculate total size. */
4474 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4475 PyErr_NoMemory();
4476 goto finally;
4477 }
4478 controllen = controllen_last = 0;
4479 while (ncmsgbufs < ncmsgs) {
4480 size_t bufsize, space;
4481
4482 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4483 "(iiy*):[sendmsg() ancillary data items]",
4484 &cmsgs[ncmsgbufs].level,
4485 &cmsgs[ncmsgbufs].type,
4486 &cmsgs[ncmsgbufs].data))
4487 goto finally;
4488 bufsize = cmsgs[ncmsgbufs++].data.len;
4489
4490#ifdef CMSG_SPACE
4491 if (!get_CMSG_SPACE(bufsize, &space)) {
4492#else
4493 if (!get_CMSG_LEN(bufsize, &space)) {
4494#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004495 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004496 goto finally;
4497 }
4498 controllen += space;
4499 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004500 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004501 goto finally;
4502 }
4503 controllen_last = controllen;
4504 }
4505
4506 /* Construct ancillary data block from control message info. */
4507 if (ncmsgbufs > 0) {
4508 struct cmsghdr *cmsgh = NULL;
4509
Victor Stinner52d61e42016-09-12 11:41:58 +02004510 controlbuf = PyMem_Malloc(controllen);
4511 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004512 PyErr_NoMemory();
4513 goto finally;
4514 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004515 msg.msg_control = controlbuf;
4516
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004517 msg.msg_controllen = controllen;
4518
4519 /* Need to zero out the buffer as a workaround for glibc's
4520 CMSG_NXTHDR() implementation. After getting the pointer to
4521 the next header, it checks its (uninitialized) cmsg_len
4522 member to see if the "message" fits in the buffer, and
4523 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004524 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004525 memset(controlbuf, 0, controllen);
4526
4527 for (i = 0; i < ncmsgbufs; i++) {
4528 size_t msg_len, data_len = cmsgs[i].data.len;
4529 int enough_space = 0;
4530
4531 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4532 if (cmsgh == NULL) {
4533 PyErr_Format(PyExc_RuntimeError,
4534 "unexpected NULL result from %s()",
4535 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4536 goto finally;
4537 }
4538 if (!get_CMSG_LEN(data_len, &msg_len)) {
4539 PyErr_SetString(PyExc_RuntimeError,
4540 "item size out of range for CMSG_LEN()");
4541 goto finally;
4542 }
4543 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4544 size_t space;
4545
4546 cmsgh->cmsg_len = msg_len;
4547 if (get_cmsg_data_space(&msg, cmsgh, &space))
4548 enough_space = (space >= data_len);
4549 }
4550 if (!enough_space) {
4551 PyErr_SetString(PyExc_RuntimeError,
4552 "ancillary data does not fit in calculated "
4553 "space");
4554 goto finally;
4555 }
4556 cmsgh->cmsg_level = cmsgs[i].level;
4557 cmsgh->cmsg_type = cmsgs[i].type;
4558 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4559 }
4560 }
4561
4562 /* Make the system call. */
4563 if (!IS_SELECTABLE(s)) {
4564 select_error();
4565 goto finally;
4566 }
4567
Victor Stinner31bf2d52015-04-01 21:57:09 +02004568 ctx.msg = &msg;
4569 ctx.flags = flags;
4570 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004571 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004572
4573 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004574
4575finally:
4576 PyMem_Free(controlbuf);
4577 for (i = 0; i < ncmsgbufs; i++)
4578 PyBuffer_Release(&cmsgs[i].data);
4579 PyMem_Free(cmsgs);
4580 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004581 PyMem_Free(msg.msg_iov);
4582 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004583 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004584 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004585 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004586 return retval;
4587}
4588
4589PyDoc_STRVAR(sendmsg_doc,
4590"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4591\n\
4592Send normal and ancillary data to the socket, gathering the\n\
4593non-ancillary data from a series of buffers and concatenating it into\n\
4594a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004595data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004596The ancdata argument specifies the ancillary data (control messages)\n\
4597as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4598cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4599protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004600is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004601argument defaults to 0 and has the same meaning as for send(). If\n\
4602address is supplied and not None, it sets a destination address for\n\
4603the message. The return value is the number of bytes of non-ancillary\n\
4604data sent.");
4605#endif /* CMSG_LEN */
4606
Christian Heimesdffa3942016-09-05 23:54:41 +02004607#ifdef HAVE_SOCKADDR_ALG
4608static PyObject*
4609sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4610{
4611 PyObject *retval = NULL;
4612
4613 Py_ssize_t i, ndatabufs = 0;
4614 Py_buffer *databufs = NULL;
4615 PyObject *data_arg = NULL;
4616
4617 Py_buffer iv = {NULL, NULL};
4618
4619 PyObject *opobj = NULL;
4620 int op = -1;
4621
4622 PyObject *assoclenobj = NULL;
4623 int assoclen = -1;
4624
4625 unsigned int *uiptr;
4626 int flags = 0;
4627
4628 struct msghdr msg;
4629 struct cmsghdr *header = NULL;
4630 struct af_alg_iv *alg_iv = NULL;
4631 struct sock_sendmsg ctx;
4632 Py_ssize_t controllen;
4633 void *controlbuf = NULL;
4634 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4635
4636 if (self->sock_family != AF_ALG) {
4637 PyErr_SetString(PyExc_OSError,
4638 "algset is only supported for AF_ALG");
4639 return NULL;
4640 }
4641
4642 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4643 "|O$O!y*O!i:sendmsg_afalg", keywords,
4644 &data_arg,
4645 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004646 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004647 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004648 }
4649
4650 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004651
4652 /* op is a required, keyword-only argument >= 0 */
4653 if (opobj != NULL) {
4654 op = _PyLong_AsInt(opobj);
4655 }
4656 if (op < 0) {
4657 /* override exception from _PyLong_AsInt() */
4658 PyErr_SetString(PyExc_TypeError,
4659 "Invalid or missing argument 'op'");
4660 goto finally;
4661 }
4662 /* assoclen is optional but must be >= 0 */
4663 if (assoclenobj != NULL) {
4664 assoclen = _PyLong_AsInt(assoclenobj);
4665 if (assoclen == -1 && PyErr_Occurred()) {
4666 goto finally;
4667 }
4668 if (assoclen < 0) {
4669 PyErr_SetString(PyExc_TypeError,
4670 "assoclen must be positive");
4671 goto finally;
4672 }
4673 }
4674
4675 controllen = CMSG_SPACE(4);
4676 if (iv.buf != NULL) {
4677 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4678 }
4679 if (assoclen >= 0) {
4680 controllen += CMSG_SPACE(4);
4681 }
4682
4683 controlbuf = PyMem_Malloc(controllen);
4684 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004685 PyErr_NoMemory();
4686 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004687 }
4688 memset(controlbuf, 0, controllen);
4689
Christian Heimesdffa3942016-09-05 23:54:41 +02004690 msg.msg_controllen = controllen;
4691 msg.msg_control = controlbuf;
4692
4693 /* Fill in an iovec for each message part, and save the Py_buffer
4694 structs to release afterwards. */
4695 if (data_arg != NULL) {
4696 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4697 goto finally;
4698 }
4699 }
4700
4701 /* set operation to encrypt or decrypt */
4702 header = CMSG_FIRSTHDR(&msg);
4703 if (header == NULL) {
4704 PyErr_SetString(PyExc_RuntimeError,
4705 "unexpected NULL result from CMSG_FIRSTHDR");
4706 goto finally;
4707 }
4708 header->cmsg_level = SOL_ALG;
4709 header->cmsg_type = ALG_SET_OP;
4710 header->cmsg_len = CMSG_LEN(4);
4711 uiptr = (void*)CMSG_DATA(header);
4712 *uiptr = (unsigned int)op;
4713
4714 /* set initialization vector */
4715 if (iv.buf != NULL) {
4716 header = CMSG_NXTHDR(&msg, header);
4717 if (header == NULL) {
4718 PyErr_SetString(PyExc_RuntimeError,
4719 "unexpected NULL result from CMSG_NXTHDR(iv)");
4720 goto finally;
4721 }
4722 header->cmsg_level = SOL_ALG;
4723 header->cmsg_type = ALG_SET_IV;
4724 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4725 alg_iv = (void*)CMSG_DATA(header);
4726 alg_iv->ivlen = iv.len;
4727 memcpy(alg_iv->iv, iv.buf, iv.len);
4728 }
4729
4730 /* set length of associated data for AEAD */
4731 if (assoclen >= 0) {
4732 header = CMSG_NXTHDR(&msg, header);
4733 if (header == NULL) {
4734 PyErr_SetString(PyExc_RuntimeError,
4735 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4736 goto finally;
4737 }
4738 header->cmsg_level = SOL_ALG;
4739 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4740 header->cmsg_len = CMSG_LEN(4);
4741 uiptr = (void*)CMSG_DATA(header);
4742 *uiptr = (unsigned int)assoclen;
4743 }
4744
4745 ctx.msg = &msg;
4746 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004747 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004748 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004749 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004750
4751 retval = PyLong_FromSsize_t(ctx.result);
4752
4753 finally:
4754 PyMem_Free(controlbuf);
4755 if (iv.buf != NULL) {
4756 PyBuffer_Release(&iv);
4757 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004758 PyMem_Free(msg.msg_iov);
4759 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004760 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004761 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004762 PyMem_Free(databufs);
4763 return retval;
4764}
4765
4766PyDoc_STRVAR(sendmsg_afalg_doc,
4767"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4768\n\
4769Set operation mode, IV and length of associated data for an AF_ALG\n\
4770operation socket.");
4771#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004772
Guido van Rossum30a685f1991-06-27 15:51:29 +00004773/* s.shutdown(how) method */
4774
Guido van Rossum73624e91994-10-10 17:59:00 +00004775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004776sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 int how;
4779 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004780
Serhiy Storchaka78980432013-01-15 01:12:17 +02004781 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 if (how == -1 && PyErr_Occurred())
4783 return NULL;
4784 Py_BEGIN_ALLOW_THREADS
4785 res = shutdown(s->sock_fd, how);
4786 Py_END_ALLOW_THREADS
4787 if (res < 0)
4788 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004789 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004790}
4791
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004792PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004793"shutdown(flag)\n\
4794\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004795Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4796of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004797
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004798#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004799static PyObject*
4800sock_ioctl(PySocketSockObject *s, PyObject *arg)
4801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 unsigned long cmd = SIO_RCVALL;
4803 PyObject *argO;
4804 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4807 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 switch (cmd) {
4810 case SIO_RCVALL: {
4811 unsigned int option = RCVALL_ON;
4812 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4813 return NULL;
4814 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4815 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4816 return set_error();
4817 }
4818 return PyLong_FromUnsignedLong(recv); }
4819 case SIO_KEEPALIVE_VALS: {
4820 struct tcp_keepalive ka;
4821 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4822 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4823 return NULL;
4824 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4825 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4826 return set_error();
4827 }
4828 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004829#if defined(SIO_LOOPBACK_FAST_PATH)
4830 case SIO_LOOPBACK_FAST_PATH: {
4831 unsigned int option;
4832 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4833 return NULL;
4834 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4835 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4836 return set_error();
4837 }
4838 return PyLong_FromUnsignedLong(recv); }
4839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004841 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 return NULL;
4843 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004844}
4845PyDoc_STRVAR(sock_ioctl_doc,
4846"ioctl(cmd, option) -> long\n\
4847\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004848Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4849SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004850SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4851SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004852#endif
4853
4854#if defined(MS_WINDOWS)
4855static PyObject*
4856sock_share(PySocketSockObject *s, PyObject *arg)
4857{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004858 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004859 DWORD processId;
4860 int result;
4861
4862 if (!PyArg_ParseTuple(arg, "I", &processId))
4863 return NULL;
4864
4865 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004866 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004867 Py_END_ALLOW_THREADS
4868 if (result == SOCKET_ERROR)
4869 return set_error();
4870 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4871}
4872PyDoc_STRVAR(sock_share_doc,
4873"share(process_id) -> bytes\n\
4874\n\
4875Share the socket with another process. The target process id\n\
4876must be provided and the resulting bytes object passed to the target\n\
4877process. There the shared socket can be instantiated by calling\n\
4878socket.fromshare().");
4879
Christian Heimesfaf2f632008-01-06 16:59:19 +00004880
4881#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004882
4883/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004884
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004885static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4887 accept_doc},
4888 {"bind", (PyCFunction)sock_bind, METH_O,
4889 bind_doc},
4890 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004891 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 {"connect", (PyCFunction)sock_connect, METH_O,
4893 connect_doc},
4894 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4895 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004896 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4897 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4899 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004900#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 {"getpeername", (PyCFunction)sock_getpeername,
4902 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 {"getsockname", (PyCFunction)sock_getsockname,
4905 METH_NOARGS, getsockname_doc},
4906 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4907 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004908#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4910 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004911#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004912#if defined(MS_WINDOWS)
4913 {"share", (PyCFunction)sock_share, METH_VARARGS,
4914 sock_share_doc},
4915#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004916 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 listen_doc},
4918 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4919 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004920 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 recv_into_doc},
4922 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4923 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004924 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925 recvfrom_into_doc},
4926 {"send", (PyCFunction)sock_send, METH_VARARGS,
4927 send_doc},
4928 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4929 sendall_doc},
4930 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4931 sendto_doc},
4932 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4933 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004934 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4935 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004936 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4937 settimeout_doc},
4938 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4939 gettimeout_doc},
4940 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4941 setsockopt_doc},
4942 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4943 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004944#ifdef CMSG_LEN
4945 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4946 recvmsg_doc},
4947 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4948 recvmsg_into_doc,},
4949 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4950 sendmsg_doc},
4951#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004952#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004953 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004954 sendmsg_afalg_doc},
4955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004957};
4958
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004959/* SockObject members */
4960static PyMemberDef sock_memberlist[] = {
4961 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4962 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4963 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004964 {0},
4965};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004966
Victor Stinner71694d52015-03-28 01:18:54 +01004967static PyGetSetDef sock_getsetlist[] = {
4968 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4969 {NULL} /* sentinel */
4970};
4971
Guido van Rossum73624e91994-10-10 17:59:00 +00004972/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004973 First close the file description. */
4974
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004975static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004976sock_finalize(PySocketSockObject *s)
4977{
4978 SOCKET_T fd;
4979 PyObject *error_type, *error_value, *error_traceback;
4980
4981 /* Save the current exception, if any. */
4982 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4983
Victor Stinnerd3afb622016-07-22 17:47:09 +02004984 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004985 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4986 /* Spurious errors can appear at shutdown */
4987 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4988 PyErr_WriteUnraisable((PyObject *)s);
4989 }
4990 }
4991
4992 /* Only close the socket *after* logging the ResourceWarning warning
4993 to allow the logger to call socket methods like
4994 socket.getsockname(). If the socket is closed before, socket
4995 methods fails with the EBADF error. */
4996 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004997 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004998
4999 /* We do not want to retry upon EINTR: see sock_close() */
5000 Py_BEGIN_ALLOW_THREADS
5001 (void) SOCKETCLOSE(fd);
5002 Py_END_ALLOW_THREADS
5003 }
5004
5005 /* Restore the saved exception. */
5006 PyErr_Restore(error_type, error_value, error_traceback);
5007}
5008
5009static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005010sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005011{
Victor Stinner19a8e842016-03-21 16:36:48 +01005012 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5013 return;
5014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005016}
5017
Guido van Rossum30a685f1991-06-27 15:51:29 +00005018
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005019static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005020sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005021{
Victor Stinnere254e532014-07-26 14:36:55 +02005022 long sock_fd;
5023 /* On Windows, this test is needed because SOCKET_T is unsigned */
5024 if (s->sock_fd == INVALID_SOCKET) {
5025 sock_fd = -1;
5026 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005027#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005028 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 /* this can occur on Win64, and actually there is a special
5030 ugly printf formatter for decimal pointer length integer
5031 printing, only bother if necessary*/
5032 PyErr_SetString(PyExc_OverflowError,
5033 "no printf formatter to display "
5034 "the socket descriptor in decimal");
5035 return NULL;
5036 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005037#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005038 else
5039 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 return PyUnicode_FromFormat(
5041 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005042 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 s->sock_type,
5044 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005045}
5046
5047
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005048/* Create a new, uninitialized socket object. */
5049
5050static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005051sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 new = type->tp_alloc(type, 0);
5056 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005057 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005058 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 ((PySocketSockObject *)new)->errorhandler = &set_error;
5060 }
5061 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005062}
5063
5064
5065/* Initialize a new socket object. */
5066
Victor Stinnerdaf45552013-08-28 00:53:59 +02005067#ifdef SOCK_CLOEXEC
5068/* socket() and socketpair() fail with EINVAL on Linux kernel older
5069 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5070static int sock_cloexec_works = -1;
5071#endif
5072
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005073/*ARGSUSED*/
5074static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005075sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 PySocketSockObject *s = (PySocketSockObject *)self;
5078 PyObject *fdobj = NULL;
5079 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005080 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005082#ifndef MS_WINDOWS
5083#ifdef SOCK_CLOEXEC
5084 int *atomic_flag_works = &sock_cloexec_works;
5085#else
5086 int *atomic_flag_works = NULL;
5087#endif
5088#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5091 "|iiiO:socket", keywords,
5092 &family, &type, &proto, &fdobj))
5093 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005094
Steve Dowerb82e17e2019-05-23 08:45:22 -07005095#ifdef MS_WINDOWS
5096 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005097 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005098#endif
5099 {
5100 if (PySys_Audit("socket.__new__", "Oiii",
5101 s, family, type, proto) < 0) {
5102 return -1;
5103 }
5104 }
5105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005107#ifdef MS_WINDOWS
5108 /* recreate a socket that was duplicated */
5109 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005110 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005111 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5112 PyErr_Format(PyExc_ValueError,
5113 "socket descriptor string has wrong size, "
5114 "should be %zu bytes.", sizeof(info));
5115 return -1;
5116 }
5117 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005118
Steve Dower63ba5cc2020-03-31 12:38:53 +01005119 if (PySys_Audit("socket.__new__", "Oiii", s,
5120 info.iAddressFamily, info.iSocketType,
5121 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005122 return -1;
5123 }
5124
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005125 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005126 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005127 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5128 Py_END_ALLOW_THREADS
5129 if (fd == INVALID_SOCKET) {
5130 set_error();
5131 return -1;
5132 }
5133 family = info.iAddressFamily;
5134 type = info.iSocketType;
5135 proto = info.iProtocol;
5136 }
5137 else
5138#endif
5139 {
Dima Tisneke9912702018-12-17 22:07:55 +09005140
5141 if (PyFloat_Check(fdobj)) {
5142 PyErr_SetString(PyExc_TypeError,
5143 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005144 return -1;
5145 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005146
Dima Tisneke9912702018-12-17 22:07:55 +09005147 fd = PyLong_AsSocket_t(fdobj);
5148 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5149 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005150#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005151 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005152#else
Dima Tisneke9912702018-12-17 22:07:55 +09005153 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005154#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005155 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5156 return -1;
5157 }
5158
5159 /* validate that passed file descriptor is valid and a socket. */
5160 sock_addr_t addrbuf;
5161 socklen_t addrlen = sizeof(sock_addr_t);
5162
5163 memset(&addrbuf, 0, addrlen);
5164 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5165 if (family == -1) {
5166 family = SAS2SA(&addrbuf)->sa_family;
5167 }
5168 } else {
5169#ifdef MS_WINDOWS
5170 /* getsockname() on an unbound socket is an error on Windows.
5171 Invalid descriptor and not a socket is same error code.
5172 Error out if family must be resolved, or bad descriptor. */
5173 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5174#else
5175 /* getsockname() is not supported for SOL_ALG on Linux. */
5176 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5177#endif
5178 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005179 return -1;
5180 }
5181 }
5182#ifdef SO_TYPE
5183 if (type == -1) {
5184 int tmp;
5185 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005186 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5187 (void *)&tmp, &slen) == 0)
5188 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005189 type = tmp;
5190 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005191 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005192 return -1;
5193 }
5194 }
5195#else
5196 type = SOCK_STREAM;
5197#endif
5198#ifdef SO_PROTOCOL
5199 if (proto == -1) {
5200 int tmp;
5201 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005202 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5203 (void *)&tmp, &slen) == 0)
5204 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005205 proto = tmp;
5206 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005207 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005208 return -1;
5209 }
5210 }
5211#else
5212 proto = 0;
5213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 }
5215 }
5216 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005217 /* No fd, default to AF_INET and SOCK_STREAM */
5218 if (family == -1) {
5219 family = AF_INET;
5220 }
5221 if (type == -1) {
5222 type = SOCK_STREAM;
5223 }
5224 if (proto == -1) {
5225 proto = 0;
5226 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005227#ifdef MS_WINDOWS
5228 /* Windows implementation */
5229#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5230#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5231#endif
5232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005234 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005235 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005236 NULL, 0,
5237 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5238 if (fd == INVALID_SOCKET) {
5239 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5240 support_wsa_no_inherit = 0;
5241 fd = socket(family, type, proto);
5242 }
5243 }
5244 else {
5245 fd = socket(family, type, proto);
5246 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005249 if (fd == INVALID_SOCKET) {
5250 set_error();
5251 return -1;
5252 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005253
5254 if (!support_wsa_no_inherit) {
5255 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5256 closesocket(fd);
5257 PyErr_SetFromWindowsErr(0);
5258 return -1;
5259 }
5260 }
5261#else
5262 /* UNIX */
5263 Py_BEGIN_ALLOW_THREADS
5264#ifdef SOCK_CLOEXEC
5265 if (sock_cloexec_works != 0) {
5266 fd = socket(family, type | SOCK_CLOEXEC, proto);
5267 if (sock_cloexec_works == -1) {
5268 if (fd >= 0) {
5269 sock_cloexec_works = 1;
5270 }
5271 else if (errno == EINVAL) {
5272 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5273 sock_cloexec_works = 0;
5274 fd = socket(family, type, proto);
5275 }
5276 }
5277 }
5278 else
5279#endif
5280 {
5281 fd = socket(family, type, proto);
5282 }
5283 Py_END_ALLOW_THREADS
5284
5285 if (fd == INVALID_SOCKET) {
5286 set_error();
5287 return -1;
5288 }
5289
5290 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5291 SOCKETCLOSE(fd);
5292 return -1;
5293 }
5294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005296 if (init_sockobject(s, fd, family, type, proto) == -1) {
5297 SOCKETCLOSE(fd);
5298 return -1;
5299 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005302
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005303}
5304
5305
Guido van Rossumb6775db1994-08-01 11:34:53 +00005306/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005307
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005308static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5310 "_socket.socket", /* tp_name */
5311 sizeof(PySocketSockObject), /* tp_basicsize */
5312 0, /* tp_itemsize */
5313 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005314 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 0, /* tp_getattr */
5316 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005317 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 (reprfunc)sock_repr, /* tp_repr */
5319 0, /* tp_as_number */
5320 0, /* tp_as_sequence */
5321 0, /* tp_as_mapping */
5322 0, /* tp_hash */
5323 0, /* tp_call */
5324 0, /* tp_str */
5325 PyObject_GenericGetAttr, /* tp_getattro */
5326 0, /* tp_setattro */
5327 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005328 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 sock_doc, /* tp_doc */
5330 0, /* tp_traverse */
5331 0, /* tp_clear */
5332 0, /* tp_richcompare */
5333 0, /* tp_weaklistoffset */
5334 0, /* tp_iter */
5335 0, /* tp_iternext */
5336 sock_methods, /* tp_methods */
5337 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005338 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 0, /* tp_base */
5340 0, /* tp_dict */
5341 0, /* tp_descr_get */
5342 0, /* tp_descr_set */
5343 0, /* tp_dictoffset */
5344 sock_initobj, /* tp_init */
5345 PyType_GenericAlloc, /* tp_alloc */
5346 sock_new, /* tp_new */
5347 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005348 0, /* tp_is_gc */
5349 0, /* tp_bases */
5350 0, /* tp_mro */
5351 0, /* tp_cache */
5352 0, /* tp_subclasses */
5353 0, /* tp_weaklist */
5354 0, /* tp_del */
5355 0, /* tp_version_tag */
5356 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005357};
5358
Guido van Rossum30a685f1991-06-27 15:51:29 +00005359
Guido van Rossum81194471991-07-27 21:42:02 +00005360/* Python interface to gethostname(). */
5361
5362/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005363static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005364socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005365{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005366 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5367 return NULL;
5368 }
5369
Martin v. Löwis72f48422010-10-29 18:20:08 +00005370#ifdef MS_WINDOWS
5371 /* Don't use winsock's gethostname, as this returns the ANSI
5372 version of the hostname, whereas we need a Unicode string.
5373 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005374 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005375 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005376 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005377 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005378
5379 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005380 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005381
5382 if (GetLastError() != ERROR_MORE_DATA)
5383 return PyErr_SetFromWindowsErr(0);
5384
5385 if (size == 0)
5386 return PyUnicode_New(0, 0);
5387
5388 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5389 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005390 name = PyMem_New(wchar_t, size);
5391 if (!name) {
5392 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005393 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005394 }
Victor Stinner74168972011-11-17 01:11:36 +01005395 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5396 name,
5397 &size))
5398 {
5399 PyMem_Free(name);
5400 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005401 }
Victor Stinner74168972011-11-17 01:11:36 +01005402
5403 result = PyUnicode_FromWideChar(name, size);
5404 PyMem_Free(name);
5405 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005406#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 char buf[1024];
5408 int res;
5409 Py_BEGIN_ALLOW_THREADS
5410 res = gethostname(buf, (int) sizeof buf - 1);
5411 Py_END_ALLOW_THREADS
5412 if (res < 0)
5413 return set_error();
5414 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005415 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005416#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005417}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005418
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005419PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005420"gethostname() -> string\n\
5421\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005422Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005423
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005424#ifdef HAVE_SETHOSTNAME
5425PyDoc_STRVAR(sethostname_doc,
5426"sethostname(name)\n\n\
5427Sets the hostname to name.");
5428
5429static PyObject *
5430socket_sethostname(PyObject *self, PyObject *args)
5431{
5432 PyObject *hnobj;
5433 Py_buffer buf;
5434 int res, flag = 0;
5435
Christian Heimesd2774c72013-06-19 02:06:29 +02005436#ifdef _AIX
5437/* issue #18259, not declared in any useful header file */
5438extern int sethostname(const char *, size_t);
5439#endif
5440
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005441 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5442 PyErr_Clear();
5443 if (!PyArg_ParseTuple(args, "O&:sethostname",
5444 PyUnicode_FSConverter, &hnobj))
5445 return NULL;
5446 flag = 1;
5447 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005448
5449 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5450 return NULL;
5451 }
5452
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005453 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5454 if (!res) {
5455 res = sethostname(buf.buf, buf.len);
5456 PyBuffer_Release(&buf);
5457 }
5458 if (flag)
5459 Py_DECREF(hnobj);
5460 if (res)
5461 return set_error();
5462 Py_RETURN_NONE;
5463}
5464#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005465
Guido van Rossum30a685f1991-06-27 15:51:29 +00005466/* Python interface to gethostbyname(name). */
5467
5468/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005469static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005470socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005473 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005474 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005475
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005476 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005478 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5479 goto finally;
5480 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005481 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005482 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005483 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005484finally:
5485 PyMem_Free(name);
5486 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005487}
5488
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005489PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005490"gethostbyname(host) -> address\n\
5491\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005492Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005493
5494
Victor Stinner72400302016-01-28 15:41:01 +01005495static PyObject*
5496sock_decode_hostname(const char *name)
5497{
5498#ifdef MS_WINDOWS
5499 /* Issue #26227: gethostbyaddr() returns a string encoded
5500 * to the ANSI code page */
5501 return PyUnicode_DecodeFSDefault(name);
5502#else
5503 /* Decode from UTF-8 */
5504 return PyUnicode_FromString(name);
5505#endif
5506}
5507
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005508/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5509
5510static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005511gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 char **pch;
5514 PyObject *rtn_tuple = (PyObject *)NULL;
5515 PyObject *name_list = (PyObject *)NULL;
5516 PyObject *addr_list = (PyObject *)NULL;
5517 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005518 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 if (h == NULL) {
5521 /* Let's get real error message to return */
5522 set_herror(h_errno);
5523 return NULL;
5524 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 if (h->h_addrtype != af) {
5527 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005528 errno = EAFNOSUPPORT;
5529 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 return NULL;
5531 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 case AF_INET:
5536 if (alen < sizeof(struct sockaddr_in))
5537 return NULL;
5538 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005539
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005540#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 case AF_INET6:
5542 if (alen < sizeof(struct sockaddr_in6))
5543 return NULL;
5544 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005545#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 if ((name_list = PyList_New(0)) == NULL)
5550 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 if ((addr_list = PyList_New(0)) == NULL)
5553 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 /* SF #1511317: h_aliases can be NULL */
5556 if (h->h_aliases) {
5557 for (pch = h->h_aliases; *pch != NULL; pch++) {
5558 int status;
5559 tmp = PyUnicode_FromString(*pch);
5560 if (tmp == NULL)
5561 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 status = PyList_Append(name_list, tmp);
5564 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 if (status)
5567 goto err;
5568 }
5569 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005571 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5572 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 case AF_INET:
5577 {
5578 struct sockaddr_in sin;
5579 memset(&sin, 0, sizeof(sin));
5580 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005581#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005585 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 if (pch == h->h_addr_list && alen >= sizeof(sin))
5588 memcpy((char *) addr, &sin, sizeof(sin));
5589 break;
5590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005591
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005592#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 case AF_INET6:
5594 {
5595 struct sockaddr_in6 sin6;
5596 memset(&sin6, 0, sizeof(sin6));
5597 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005598#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005602 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5605 memcpy((char *) addr, &sin6, sizeof(sin6));
5606 break;
5607 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005608#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005611 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 "unsupported address family");
5613 return NULL;
5614 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 if (tmp == NULL)
5617 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 status = PyList_Append(addr_list, tmp);
5620 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 if (status)
5623 goto err;
5624 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005625
Victor Stinner72400302016-01-28 15:41:01 +01005626 name = sock_decode_hostname(h->h_name);
5627 if (name == NULL)
5628 goto err;
5629 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005630
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005631 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 Py_XDECREF(name_list);
5633 Py_XDECREF(addr_list);
5634 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005635}
5636
5637
5638/* Python interface to gethostbyname_ex(name). */
5639
5640/*ARGSUSED*/
5641static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005642socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 char *name;
5645 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005646 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005648 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005649#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005651#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005653#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 char buf[16384];
5655 int buf_len = (sizeof buf) - 1;
5656 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005657#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005658#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005660#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005661#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005662
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005663 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005665 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5666 goto finally;
5667 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005668 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005669 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005671#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005672#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005673 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005675#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005677#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 memset((void *) &data, '\0', sizeof(data));
5679 result = gethostbyname_r(name, &hp_allocated, &data);
5680 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005681#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005682#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005683#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005685#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005686 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005688#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 Py_END_ALLOW_THREADS
5690 /* Some C libraries would require addr.__ss_family instead of
5691 addr.ss_family.
5692 Therefore, we cast the sockaddr_storage into sockaddr to
5693 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005694 sa = SAS2SA(&addr);
5695 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005697#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005699#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005700finally:
5701 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005703}
5704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005705PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005706"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5707\n\
5708Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005709for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005710
5711
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005712/* Python interface to gethostbyaddr(IP). */
5713
5714/*ARGSUSED*/
5715static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005716socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005717{
Charles-François Natali8b759652011-12-23 16:44:51 +01005718 sock_addr_t addr;
5719 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 char *ip_num;
5721 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005722 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005723#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005725#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 /* glibcs up to 2.10 assume that the buf argument to
5729 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5730 does not ensure. The attribute below instructs the compiler
5731 to maintain this alignment. */
5732 char buf[16384] Py_ALIGNED(8);
5733 int buf_len = (sizeof buf) - 1;
5734 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005735#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005736#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005738#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005739#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005740 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 int al;
5742 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005743
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005744 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005746 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5747 goto finally;
5748 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 af = AF_UNSPEC;
5750 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005751 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 af = sa->sa_family;
5753 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005754 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 switch (af) {
5756 case AF_INET:
5757 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5758 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5759 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005760#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 case AF_INET6:
5762 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5763 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5764 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005767 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005768 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 }
5770 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005771#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005772#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005773 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005774 &hp_allocated, buf, buf_len,
5775 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005776#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 h = gethostbyaddr_r(ap, al, af,
5778 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005779#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 memset((void *) &data, '\0', sizeof(data));
5781 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5782 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005783#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005784#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005785#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005787#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005788 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005790#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005792 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005793#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005795#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005796finally:
5797 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005799}
5800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005801PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005802"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5803\n\
5804Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005805for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005806
Guido van Rossum30a685f1991-06-27 15:51:29 +00005807
5808/* Python interface to getservbyname(name).
5809 This only returns the port number, since the other info is already
5810 known or not useful (like the list of aliases). */
5811
5812/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005813static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005814socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005815{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005816 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 struct servent *sp;
5818 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5819 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005820
5821 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5822 return NULL;
5823 }
5824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 Py_BEGIN_ALLOW_THREADS
5826 sp = getservbyname(name, proto);
5827 Py_END_ALLOW_THREADS
5828 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005829 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 return NULL;
5831 }
5832 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005833}
5834
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005835PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005836"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005837\n\
5838Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005839The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5840otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005841
Guido van Rossum30a685f1991-06-27 15:51:29 +00005842
Barry Warsaw11b91a02004-06-28 00:50:43 +00005843/* Python interface to getservbyport(port).
5844 This only returns the service name, since the other info is already
5845 known or not useful (like the list of aliases). */
5846
5847/*ARGSUSED*/
5848static PyObject *
5849socket_getservbyport(PyObject *self, PyObject *args)
5850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005852 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 struct servent *sp;
5854 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5855 return NULL;
5856 if (port < 0 || port > 0xffff) {
5857 PyErr_SetString(
5858 PyExc_OverflowError,
5859 "getservbyport: port must be 0-65535.");
5860 return NULL;
5861 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005862
5863 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5864 return NULL;
5865 }
5866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005867 Py_BEGIN_ALLOW_THREADS
5868 sp = getservbyport(htons((short)port), proto);
5869 Py_END_ALLOW_THREADS
5870 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005871 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 return NULL;
5873 }
5874 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005875}
5876
5877PyDoc_STRVAR(getservbyport_doc,
5878"getservbyport(port[, protocolname]) -> string\n\
5879\n\
5880Return the service name from a port number and protocol name.\n\
5881The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5882otherwise any protocol will match.");
5883
Guido van Rossum3901d851996-12-19 16:35:04 +00005884/* Python interface to getprotobyname(name).
5885 This only returns the protocol number, since the other info is
5886 already known or not useful (like the list of aliases). */
5887
5888/*ARGSUSED*/
5889static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005890socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005891{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005892 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893 struct protoent *sp;
5894 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5895 return NULL;
5896 Py_BEGIN_ALLOW_THREADS
5897 sp = getprotobyname(name);
5898 Py_END_ALLOW_THREADS
5899 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005900 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005901 return NULL;
5902 }
5903 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005904}
5905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005906PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005907"getprotobyname(name) -> integer\n\
5908\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005909Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005910
Christian Heimesd0e31b92018-01-27 09:54:13 +01005911static PyObject *
5912socket_close(PyObject *self, PyObject *fdobj)
5913{
5914 SOCKET_T fd;
5915 int res;
5916
5917 fd = PyLong_AsSocket_t(fdobj);
5918 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5919 return NULL;
5920 Py_BEGIN_ALLOW_THREADS
5921 res = SOCKETCLOSE(fd);
5922 Py_END_ALLOW_THREADS
5923 /* bpo-30319: The peer can already have closed the connection.
5924 Python ignores ECONNRESET on close(). */
5925 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5926 return set_error();
5927 }
5928 Py_RETURN_NONE;
5929}
5930
5931PyDoc_STRVAR(close_doc,
5932"close(integer) -> None\n\
5933\n\
5934Close an integer socket file descriptor. This is like os.close(), but for\n\
5935sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005936
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005937#ifndef NO_DUP
5938/* dup() function for socket fds */
5939
5940static PyObject *
5941socket_dup(PyObject *self, PyObject *fdobj)
5942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 SOCKET_T fd, newfd;
5944 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005945#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005946 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005947#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 fd = PyLong_AsSocket_t(fdobj);
5950 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5951 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005952
Victor Stinnerdaf45552013-08-28 00:53:59 +02005953#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005954 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005955 return set_error();
5956
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005957 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005958 FROM_PROTOCOL_INFO,
5959 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 if (newfd == INVALID_SOCKET)
5961 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005962
Victor Stinnerdaf45552013-08-28 00:53:59 +02005963 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5964 closesocket(newfd);
5965 PyErr_SetFromWindowsErr(0);
5966 return NULL;
5967 }
5968#else
5969 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5970 newfd = _Py_dup(fd);
5971 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005972 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005973#endif
5974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 newfdobj = PyLong_FromSocket_t(newfd);
5976 if (newfdobj == NULL)
5977 SOCKETCLOSE(newfd);
5978 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005979}
5980
5981PyDoc_STRVAR(dup_doc,
5982"dup(integer) -> integer\n\
5983\n\
5984Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5985sockets; on some platforms os.dup() won't work for socket file descriptors.");
5986#endif
5987
5988
Dave Cole331708b2004-08-09 04:51:41 +00005989#ifdef HAVE_SOCKETPAIR
5990/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005991 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005992 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005993
5994/*ARGSUSED*/
5995static PyObject *
5996socket_socketpair(PyObject *self, PyObject *args)
5997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 PySocketSockObject *s0 = NULL, *s1 = NULL;
5999 SOCKET_T sv[2];
6000 int family, type = SOCK_STREAM, proto = 0;
6001 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006002#ifdef SOCK_CLOEXEC
6003 int *atomic_flag_works = &sock_cloexec_works;
6004#else
6005 int *atomic_flag_works = NULL;
6006#endif
6007 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006008
6009#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006011#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6015 &family, &type, &proto))
6016 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006019 Py_BEGIN_ALLOW_THREADS
6020#ifdef SOCK_CLOEXEC
6021 if (sock_cloexec_works != 0) {
6022 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6023 if (sock_cloexec_works == -1) {
6024 if (ret >= 0) {
6025 sock_cloexec_works = 1;
6026 }
6027 else if (errno == EINVAL) {
6028 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6029 sock_cloexec_works = 0;
6030 ret = socketpair(family, type, proto, sv);
6031 }
6032 }
6033 }
6034 else
6035#endif
6036 {
6037 ret = socketpair(family, type, proto, sv);
6038 }
6039 Py_END_ALLOW_THREADS
6040
6041 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006043
6044 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6045 goto finally;
6046 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6047 goto finally;
6048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 s0 = new_sockobject(sv[0], family, type, proto);
6050 if (s0 == NULL)
6051 goto finally;
6052 s1 = new_sockobject(sv[1], family, type, proto);
6053 if (s1 == NULL)
6054 goto finally;
6055 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006056
6057finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 if (res == NULL) {
6059 if (s0 == NULL)
6060 SOCKETCLOSE(sv[0]);
6061 if (s1 == NULL)
6062 SOCKETCLOSE(sv[1]);
6063 }
6064 Py_XDECREF(s0);
6065 Py_XDECREF(s1);
6066 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006067}
6068
6069PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006070"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006071\n\
6072Create a pair of socket objects from the sockets returned by the platform\n\
6073socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006074The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006075AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006076
6077#endif /* HAVE_SOCKETPAIR */
6078
6079
Guido van Rossum006bf911996-06-12 04:04:55 +00006080static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006081socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006082{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006083 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006084
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006085 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 return NULL;
6087 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006088 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006090 "ntohs: can't convert negative Python int to C "
6091 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 return NULL;
6093 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006094 if (x > 0xffff) {
6095 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6096 "ntohs: Python int too large to convert to C "
6097 "16-bit unsigned integer (The silent truncation "
6098 "is deprecated)",
6099 1)) {
6100 return NULL;
6101 }
6102 }
6103 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006104}
6105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006106PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006107"ntohs(integer) -> integer\n\
6108\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006109Convert a 16-bit unsigned integer from network to host byte order.\n\
6110Note that in case the received integer does not fit in 16-bit unsigned\n\
6111integer, but does fit in a positive C int, it is silently truncated to\n\
611216-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006113However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006114exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006115
6116
Guido van Rossum006bf911996-06-12 04:04:55 +00006117static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006118socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 if (PyLong_Check(arg)) {
6123 x = PyLong_AsUnsignedLong(arg);
6124 if (x == (unsigned long) -1 && PyErr_Occurred())
6125 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006126#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127 {
6128 unsigned long y;
6129 /* only want the trailing 32 bits */
6130 y = x & 0xFFFFFFFFUL;
6131 if (y ^ x)
6132 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006133 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 x = y;
6135 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 }
6138 else
6139 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006140 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006143}
6144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006145PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006146"ntohl(integer) -> integer\n\
6147\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006148Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006149
6150
Guido van Rossum006bf911996-06-12 04:04:55 +00006151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006152socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006153{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006154 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006155
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006156 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 return NULL;
6158 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006159 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006161 "htons: can't convert negative Python int to C "
6162 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 return NULL;
6164 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006165 if (x > 0xffff) {
6166 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6167 "htons: Python int too large to convert to C "
6168 "16-bit unsigned integer (The silent truncation "
6169 "is deprecated)",
6170 1)) {
6171 return NULL;
6172 }
6173 }
6174 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006175}
6176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006177PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006178"htons(integer) -> integer\n\
6179\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006180Convert a 16-bit unsigned integer from host to network byte order.\n\
6181Note that in case the received integer does not fit in 16-bit unsigned\n\
6182integer, but does fit in a positive C int, it is silently truncated to\n\
618316-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006184However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006185exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006186
6187
Guido van Rossum006bf911996-06-12 04:04:55 +00006188static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006189socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 if (PyLong_Check(arg)) {
6194 x = PyLong_AsUnsignedLong(arg);
6195 if (x == (unsigned long) -1 && PyErr_Occurred())
6196 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006197#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 {
6199 unsigned long y;
6200 /* only want the trailing 32 bits */
6201 y = x & 0xFFFFFFFFUL;
6202 if (y ^ x)
6203 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006204 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 x = y;
6206 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 }
6209 else
6210 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006211 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 Py_TYPE(arg)->tp_name);
6213 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006214}
6215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006216PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006217"htonl(integer) -> integer\n\
6218\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006219Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006220
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006221/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006223PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006224"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006225\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006226Convert 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 +00006227binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006228
6229static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006230socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006231{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006232#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006234#endif
6235
6236#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006237#if (SIZEOF_INT != 4)
6238#error "Not sure if in_addr_t exists and int is not 32-bits."
6239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 /* Have to use inet_addr() instead */
6241 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006242#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006243 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6246 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006247
Tim Peters1df9fdd2003-02-13 03:13:40 +00006248
6249#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006250
6251#ifdef USE_INET_ATON_WEAKLINK
6252 if (inet_aton != NULL) {
6253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 if (inet_aton(ip_addr, &buf))
6255 return PyBytes_FromStringAndSize((char *)(&buf),
6256 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006257
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006258 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006259 "illegal IP address string passed to inet_aton");
6260 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006261
Thomas Wouters477c8d52006-05-27 19:21:47 +00006262#ifdef USE_INET_ATON_WEAKLINK
6263 } else {
6264#endif
6265
6266#endif
6267
6268#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 /* special-case this address as inet_addr might return INADDR_NONE
6271 * for this */
6272 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006273 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006275
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006276 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006280 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 "illegal IP address string passed to inet_aton");
6282 return NULL;
6283 }
6284 }
6285 return PyBytes_FromStringAndSize((char *) &packed_addr,
6286 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006287
6288#ifdef USE_INET_ATON_WEAKLINK
6289 }
6290#endif
6291
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006292#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006293}
6294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006295PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006296"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006297\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006298Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006299
6300static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006301socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006302{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006303 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006305
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006306 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307 return NULL;
6308 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006309
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006310 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006311 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006313 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006314 return NULL;
6315 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006316
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006317 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6318 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006319
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006320 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006322}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006323
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006324#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006325
6326PyDoc_STRVAR(inet_pton_doc,
6327"inet_pton(af, ip) -> packed IP address string\n\
6328\n\
6329Convert an IP address from string format to a packed string suitable\n\
6330for use with low-level network functions.");
6331
6332static PyObject *
6333socket_inet_pton(PyObject *self, PyObject *args)
6334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006336 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006338#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006339 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006340#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6344 return NULL;
6345 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006346
Martin v. Löwis04697e82004-06-02 12:35:29 +00006347#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006349 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 "can't use AF_INET6, IPv6 is disabled");
6351 return NULL;
6352 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006353#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 retval = inet_pton(af, ip, packed);
6356 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006357 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 return NULL;
6359 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006360 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 "illegal IP address string passed to inet_pton");
6362 return NULL;
6363 } else if (af == AF_INET) {
6364 return PyBytes_FromStringAndSize(packed,
6365 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006366#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 } else if (af == AF_INET6) {
6368 return PyBytes_FromStringAndSize(packed,
6369 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006372 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 return NULL;
6374 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006375}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006376
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006377PyDoc_STRVAR(inet_ntop_doc,
6378"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6379\n\
6380Convert a packed IP address of the given family to string format.");
6381
6382static PyObject *
6383socket_inet_ntop(PyObject *self, PyObject *args)
6384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006386 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006388#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006389 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006390#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006391 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006392#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006393
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006394 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 return NULL;
6396 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006399 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 PyErr_SetString(PyExc_ValueError,
6401 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006402 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 return NULL;
6404 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006405#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006407 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 PyErr_SetString(PyExc_ValueError,
6409 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006410 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 return NULL;
6412 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 } else {
6415 PyErr_Format(PyExc_ValueError,
6416 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006417 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 return NULL;
6419 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006420
Коренберг Марк7766b962018-02-13 00:47:42 +05006421 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006422 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6423 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006425 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 return NULL;
6427 } else {
6428 return PyUnicode_FromString(retval);
6429 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006430}
6431
6432#endif /* HAVE_INET_PTON */
6433
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006434/* Python interface to getaddrinfo(host, port). */
6435
6436/*ARGSUSED*/
6437static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006438socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006439{
Victor Stinner77af1722011-05-26 14:05:59 +02006440 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006441 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442 struct addrinfo hints, *res;
6443 struct addrinfo *res0 = NULL;
6444 PyObject *hobj = NULL;
6445 PyObject *pobj = (PyObject *)NULL;
6446 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006447 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 int family, socktype, protocol, flags;
6449 int error;
6450 PyObject *all = (PyObject *)NULL;
6451 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006452
Georg Brandl6083a4b2013-10-14 06:51:46 +02006453 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006455 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006456 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 &protocol, &flags)) {
6458 return NULL;
6459 }
6460 if (hobj == Py_None) {
6461 hptr = NULL;
6462 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006463 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 if (!idna)
6465 return NULL;
6466 assert(PyBytes_Check(idna));
6467 hptr = PyBytes_AS_STRING(idna);
6468 } else if (PyBytes_Check(hobj)) {
6469 hptr = PyBytes_AsString(hobj);
6470 } else {
6471 PyErr_SetString(PyExc_TypeError,
6472 "getaddrinfo() argument 1 must be string or None");
6473 return NULL;
6474 }
6475 if (PyLong_CheckExact(pobj)) {
6476 long value = PyLong_AsLong(pobj);
6477 if (value == -1 && PyErr_Occurred())
6478 goto err;
6479 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6480 pptr = pbuf;
6481 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006482 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006483 if (pptr == NULL)
6484 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006486 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 } else if (pobj == Py_None) {
6488 pptr = (char *)NULL;
6489 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006490 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491 goto err;
6492 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006493#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006494 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006495 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006496 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6497 * This workaround avoids a segfault in libsystem.
6498 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006499 pptr = "00";
6500 }
6501#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006502
6503 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6504 hobj, pobj, family, socktype, protocol) < 0) {
6505 return NULL;
6506 }
6507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 memset(&hints, 0, sizeof(hints));
6509 hints.ai_family = family;
6510 hints.ai_socktype = socktype;
6511 hints.ai_protocol = protocol;
6512 hints.ai_flags = flags;
6513 Py_BEGIN_ALLOW_THREADS
6514 ACQUIRE_GETADDRINFO_LOCK
6515 error = getaddrinfo(hptr, pptr, &hints, &res0);
6516 Py_END_ALLOW_THREADS
6517 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6518 if (error) {
6519 set_gaierror(error);
6520 goto err;
6521 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006522
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006523 all = PyList_New(0);
6524 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 goto err;
6526 for (res = res0; res; res = res->ai_next) {
6527 PyObject *single;
6528 PyObject *addr =
6529 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6530 if (addr == NULL)
6531 goto err;
6532 single = Py_BuildValue("iiisO", res->ai_family,
6533 res->ai_socktype, res->ai_protocol,
6534 res->ai_canonname ? res->ai_canonname : "",
6535 addr);
6536 Py_DECREF(addr);
6537 if (single == NULL)
6538 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006539
Zackery Spytz4c596d52018-11-14 15:39:01 -07006540 if (PyList_Append(all, single)) {
6541 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006543 }
6544 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 }
6546 Py_XDECREF(idna);
6547 if (res0)
6548 freeaddrinfo(res0);
6549 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006550 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 Py_XDECREF(all);
6552 Py_XDECREF(idna);
6553 if (res0)
6554 freeaddrinfo(res0);
6555 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006556}
6557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006558PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006559"getaddrinfo(host, port [, family, type, proto, flags])\n\
6560 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006561\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006562Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006563
6564/* Python interface to getnameinfo(sa, flags). */
6565
6566/*ARGSUSED*/
6567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006568socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570 PyObject *sa = (PyObject *)NULL;
6571 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006572 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006573 int port;
6574 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6576 struct addrinfo hints, *res = NULL;
6577 int error;
6578 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006579 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 flags = flowinfo = scope_id = 0;
6582 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6583 return NULL;
6584 if (!PyTuple_Check(sa)) {
6585 PyErr_SetString(PyExc_TypeError,
6586 "getnameinfo() argument 1 must be a tuple");
6587 return NULL;
6588 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006589 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006591 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006593 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006594 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006595 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006596 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006597 return NULL;
6598 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006599
6600 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6601 return NULL;
6602 }
6603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6605 memset(&hints, 0, sizeof(hints));
6606 hints.ai_family = AF_UNSPEC;
6607 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006608 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 Py_BEGIN_ALLOW_THREADS
6610 ACQUIRE_GETADDRINFO_LOCK
6611 error = getaddrinfo(hostp, pbuf, &hints, &res);
6612 Py_END_ALLOW_THREADS
6613 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6614 if (error) {
6615 set_gaierror(error);
6616 goto fail;
6617 }
6618 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006619 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 "sockaddr resolved to multiple addresses");
6621 goto fail;
6622 }
6623 switch (res->ai_family) {
6624 case AF_INET:
6625 {
6626 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006627 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 "IPv4 sockaddr must be 2 tuple");
6629 goto fail;
6630 }
6631 break;
6632 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006633#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 case AF_INET6:
6635 {
6636 struct sockaddr_in6 *sin6;
6637 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006638 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 sin6->sin6_scope_id = scope_id;
6640 break;
6641 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006644 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6646 if (error) {
6647 set_gaierror(error);
6648 goto fail;
6649 }
Victor Stinner72400302016-01-28 15:41:01 +01006650
6651 name = sock_decode_hostname(hbuf);
6652 if (name == NULL)
6653 goto fail;
6654 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006655
6656fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 if (res)
6658 freeaddrinfo(res);
6659 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006660}
6661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006662PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006663"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006664\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006665Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006666
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006667
6668/* Python API to getting and setting the default timeout value. */
6669
6670static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306671socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006672{
Victor Stinner71694d52015-03-28 01:18:54 +01006673 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006674 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 }
Victor Stinner71694d52015-03-28 01:18:54 +01006676 else {
6677 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6678 return PyFloat_FromDouble(seconds);
6679 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006680}
6681
6682PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006683"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006684\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006685Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006686A value of None indicates that new socket objects have no timeout.\n\
6687When the socket module is first imported, the default is None.");
6688
6689static PyObject *
6690socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6691{
Victor Stinner71694d52015-03-28 01:18:54 +01006692 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006693
Victor Stinner71694d52015-03-28 01:18:54 +01006694 if (socket_parse_timeout(&timeout, arg) < 0)
6695 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006698
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006699 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006700}
6701
6702PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006703"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006704\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006705Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006706A value of None indicates that new socket objects have no timeout.\n\
6707When the socket module is first imported, the default is None.");
6708
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006709#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006710/* Python API for getting interface indices and names */
6711
6712static PyObject *
6713socket_if_nameindex(PyObject *self, PyObject *arg)
6714{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006715 PyObject *list = PyList_New(0);
6716 if (list == NULL) {
6717 return NULL;
6718 }
6719#ifdef MS_WINDOWS
6720 PMIB_IF_TABLE2 tbl;
6721 int ret;
6722 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6723 Py_DECREF(list);
6724 // ret is used instead of GetLastError()
6725 return PyErr_SetFromWindowsErr(ret);
6726 }
6727 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6728 MIB_IF_ROW2 r = tbl->Table[i];
6729 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6730 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6731 Py_ARRAY_LENGTH(buf)))) {
6732 Py_DECREF(list);
6733 FreeMibTable(tbl);
6734 // ret is used instead of GetLastError()
6735 return PyErr_SetFromWindowsErr(ret);
6736 }
6737 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6738 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6739 Py_XDECREF(tuple);
6740 Py_DECREF(list);
6741 FreeMibTable(tbl);
6742 return NULL;
6743 }
6744 Py_DECREF(tuple);
6745 }
6746 FreeMibTable(tbl);
6747 return list;
6748#else
Charles-François Natali60713592011-05-20 16:55:06 +02006749 int i;
6750 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006751
Charles-François Natali60713592011-05-20 16:55:06 +02006752 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006753 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006754 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006755 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006756 return NULL;
6757 }
6758
Gregory P. Smithb474e672018-12-30 17:05:36 -08006759#ifdef _Py_MEMORY_SANITIZER
6760 __msan_unpoison(ni, sizeof(ni));
6761 __msan_unpoison(&ni[0], sizeof(ni[0]));
6762#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006763 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006764#ifdef _Py_MEMORY_SANITIZER
6765 /* This one isn't the end sentinel, the next one must exist. */
6766 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6767 /* Otherwise Py_BuildValue internals are flagged by MSan when
6768 they access the not-msan-tracked if_name string data. */
6769 {
6770 char *to_sanitize = ni[i].if_name;
6771 do {
6772 __msan_unpoison(to_sanitize, 1);
6773 } while (*to_sanitize++ != '\0');
6774 }
6775#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006776 PyObject *ni_tuple = Py_BuildValue("IO&",
6777 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006778
6779 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6780 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006781 Py_DECREF(list);
6782 if_freenameindex(ni);
6783 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006784 }
6785 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006786 }
6787
6788 if_freenameindex(ni);
6789 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006790#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006791}
6792
6793PyDoc_STRVAR(if_nameindex_doc,
6794"if_nameindex()\n\
6795\n\
6796Returns a list of network interface information (index, name) tuples.");
6797
Charles-François Natali60713592011-05-20 16:55:06 +02006798static PyObject *
6799socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006800{
Charles-François Natali60713592011-05-20 16:55:06 +02006801 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006802#ifdef MS_WINDOWS
6803 NET_IFINDEX index;
6804#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006805 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006806#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006807 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6808 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006809 return NULL;
6810
Charles-François Natali60713592011-05-20 16:55:06 +02006811 index = if_nametoindex(PyBytes_AS_STRING(oname));
6812 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006813 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006814 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006815 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006816 return NULL;
6817 }
6818
6819 return PyLong_FromUnsignedLong(index);
6820}
6821
6822PyDoc_STRVAR(if_nametoindex_doc,
6823"if_nametoindex(if_name)\n\
6824\n\
6825Returns the interface index corresponding to the interface name if_name.");
6826
Charles-François Natali60713592011-05-20 16:55:06 +02006827static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006828socket_if_indextoname(PyObject *self, PyObject *arg)
6829{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006830#ifdef MS_WINDOWS
6831 NET_IFINDEX index;
6832#else
Charles-François Natali60713592011-05-20 16:55:06 +02006833 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006834#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006835 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006836
Charles-François Natali60713592011-05-20 16:55:06 +02006837 index = PyLong_AsUnsignedLong(arg);
6838 if (index == (unsigned long) -1)
6839 return NULL;
6840
6841 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006842 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006843 return NULL;
6844 }
6845
Charles-François Natali60713592011-05-20 16:55:06 +02006846 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006847}
6848
6849PyDoc_STRVAR(if_indextoname_doc,
6850"if_indextoname(if_index)\n\
6851\n\
6852Returns the interface name corresponding to the interface index if_index.");
6853
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006854#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006855
6856
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006857#ifdef CMSG_LEN
6858/* Python interface to CMSG_LEN(length). */
6859
6860static PyObject *
6861socket_CMSG_LEN(PyObject *self, PyObject *args)
6862{
6863 Py_ssize_t length;
6864 size_t result;
6865
6866 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6867 return NULL;
6868 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6869 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6870 return NULL;
6871 }
6872 return PyLong_FromSize_t(result);
6873}
6874
6875PyDoc_STRVAR(CMSG_LEN_doc,
6876"CMSG_LEN(length) -> control message length\n\
6877\n\
6878Return the total length, without trailing padding, of an ancillary\n\
6879data item with associated data of the given length. This value can\n\
6880often be used as the buffer size for recvmsg() to receive a single\n\
6881item of ancillary data, but RFC 3542 requires portable applications to\n\
6882use CMSG_SPACE() and thus include space for padding, even when the\n\
6883item will be the last in the buffer. Raises OverflowError if length\n\
6884is outside the permissible range of values.");
6885
6886
6887#ifdef CMSG_SPACE
6888/* Python interface to CMSG_SPACE(length). */
6889
6890static PyObject *
6891socket_CMSG_SPACE(PyObject *self, PyObject *args)
6892{
6893 Py_ssize_t length;
6894 size_t result;
6895
6896 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6897 return NULL;
6898 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6899 PyErr_SetString(PyExc_OverflowError,
6900 "CMSG_SPACE() argument out of range");
6901 return NULL;
6902 }
6903 return PyLong_FromSize_t(result);
6904}
6905
6906PyDoc_STRVAR(CMSG_SPACE_doc,
6907"CMSG_SPACE(length) -> buffer size\n\
6908\n\
6909Return the buffer size needed for recvmsg() to receive an ancillary\n\
6910data item with associated data of the given length, along with any\n\
6911trailing padding. The buffer space needed to receive multiple items\n\
6912is the sum of the CMSG_SPACE() values for their associated data\n\
6913lengths. Raises OverflowError if length is outside the permissible\n\
6914range of values.");
6915#endif /* CMSG_SPACE */
6916#endif /* CMSG_LEN */
6917
6918
Guido van Rossum30a685f1991-06-27 15:51:29 +00006919/* List of functions exported by this module. */
6920
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006921static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922 {"gethostbyname", socket_gethostbyname,
6923 METH_VARARGS, gethostbyname_doc},
6924 {"gethostbyname_ex", socket_gethostbyname_ex,
6925 METH_VARARGS, ghbn_ex_doc},
6926 {"gethostbyaddr", socket_gethostbyaddr,
6927 METH_VARARGS, gethostbyaddr_doc},
6928 {"gethostname", socket_gethostname,
6929 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006930#ifdef HAVE_SETHOSTNAME
6931 {"sethostname", socket_sethostname,
6932 METH_VARARGS, sethostname_doc},
6933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 {"getservbyname", socket_getservbyname,
6935 METH_VARARGS, getservbyname_doc},
6936 {"getservbyport", socket_getservbyport,
6937 METH_VARARGS, getservbyport_doc},
6938 {"getprotobyname", socket_getprotobyname,
6939 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006940 {"close", socket_close,
6941 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006942#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943 {"dup", socket_dup,
6944 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006945#endif
Dave Cole331708b2004-08-09 04:51:41 +00006946#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947 {"socketpair", socket_socketpair,
6948 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 {"ntohs", socket_ntohs,
6951 METH_VARARGS, ntohs_doc},
6952 {"ntohl", socket_ntohl,
6953 METH_O, ntohl_doc},
6954 {"htons", socket_htons,
6955 METH_VARARGS, htons_doc},
6956 {"htonl", socket_htonl,
6957 METH_O, htonl_doc},
6958 {"inet_aton", socket_inet_aton,
6959 METH_VARARGS, inet_aton_doc},
6960 {"inet_ntoa", socket_inet_ntoa,
6961 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006962#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963 {"inet_pton", socket_inet_pton,
6964 METH_VARARGS, inet_pton_doc},
6965 {"inet_ntop", socket_inet_ntop,
6966 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006967#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006968 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006969 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006970 {"getnameinfo", socket_getnameinfo,
6971 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306972 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 METH_NOARGS, getdefaulttimeout_doc},
6974 {"setdefaulttimeout", socket_setdefaulttimeout,
6975 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006976#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006977 {"if_nameindex", socket_if_nameindex,
6978 METH_NOARGS, if_nameindex_doc},
6979 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006980 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006981 {"if_indextoname", socket_if_indextoname,
6982 METH_O, if_indextoname_doc},
6983#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006984#ifdef CMSG_LEN
6985 {"CMSG_LEN", socket_CMSG_LEN,
6986 METH_VARARGS, CMSG_LEN_doc},
6987#ifdef CMSG_SPACE
6988 {"CMSG_SPACE", socket_CMSG_SPACE,
6989 METH_VARARGS, CMSG_SPACE_doc},
6990#endif
6991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006993};
6994
Guido van Rossum30a685f1991-06-27 15:51:29 +00006995
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006996#ifdef MS_WINDOWS
6997#define OS_INIT_DEFINED
6998
6999/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007000
7001static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007002os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007004 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007005}
7006
7007static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007008os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 WSADATA WSAData;
7011 int ret;
7012 ret = WSAStartup(0x0101, &WSAData);
7013 switch (ret) {
7014 case 0: /* No error */
7015 Py_AtExit(os_cleanup);
7016 return 1; /* Success */
7017 case WSASYSNOTREADY:
7018 PyErr_SetString(PyExc_ImportError,
7019 "WSAStartup failed: network not ready");
7020 break;
7021 case WSAVERNOTSUPPORTED:
7022 case WSAEINVAL:
7023 PyErr_SetString(
7024 PyExc_ImportError,
7025 "WSAStartup failed: requested version not supported");
7026 break;
7027 default:
7028 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7029 break;
7030 }
7031 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007032}
7033
Guido van Rossum8d665e61996-06-26 18:22:49 +00007034#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007035
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007036
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007037
7038#ifndef OS_INIT_DEFINED
7039static int
7040os_init(void)
7041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007043}
7044#endif
7045
7046
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007047/* C API table - always add new things to the end for binary
7048 compatibility. */
7049static
7050PySocketModule_APIObject PySocketModuleAPI =
7051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007053 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007055};
7056
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007058/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007059
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007060 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007061 "socket.py" which implements some additional functionality.
7062 The import of "_socket" may fail with an ImportError exception if
7063 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007064 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007065 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007066*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007068PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007069"Implementation module for socket operations.\n\
7070\n\
7071See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007072
Martin v. Löwis1a214512008-06-11 05:26:20 +00007073static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007074 PyModuleDef_HEAD_INIT,
7075 PySocket_MODULE_NAME,
7076 socket_doc,
7077 -1,
7078 socket_methods,
7079 NULL,
7080 NULL,
7081 NULL,
7082 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007083};
7084
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007085PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007086PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 if (!os_init())
7091 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007092
Victor Stinnerdaf45552013-08-28 00:53:59 +02007093#ifdef MS_WINDOWS
7094 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007095 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007096 }
7097#endif
7098
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007099 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 m = PyModule_Create(&socketmodule);
7101 if (m == NULL)
7102 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007103
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007104 Py_INCREF(PyExc_OSError);
7105 PySocketModuleAPI.error = PyExc_OSError;
7106 Py_INCREF(PyExc_OSError);
7107 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007109 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110 if (socket_herror == NULL)
7111 return NULL;
7112 Py_INCREF(socket_herror);
7113 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007114 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 NULL);
7116 if (socket_gaierror == NULL)
7117 return NULL;
7118 Py_INCREF(socket_gaierror);
7119 PyModule_AddObject(m, "gaierror", socket_gaierror);
7120 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007121 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 if (socket_timeout == NULL)
7123 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007124 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125 Py_INCREF(socket_timeout);
7126 PyModule_AddObject(m, "timeout", socket_timeout);
7127 Py_INCREF((PyObject *)&sock_type);
7128 if (PyModule_AddObject(m, "SocketType",
7129 (PyObject *)&sock_type) != 0)
7130 return NULL;
7131 Py_INCREF((PyObject *)&sock_type);
7132 if (PyModule_AddObject(m, "socket",
7133 (PyObject *)&sock_type) != 0)
7134 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007135
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007136#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 Py_INCREF(has_ipv6);
7142 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 /* Export C API */
7145 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7146 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7147 ) != 0)
7148 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007151#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007153#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007155#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007157#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007158#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007161#endif
7162#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007164#endif
7165#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007168#endif
7169#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007172#endif
7173#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007176#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007177#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007180#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007181#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007182 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007184#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007185#ifdef HAVE_SOCKADDR_ALG
7186 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7187#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007188#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007191#endif
7192#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007194#endif
7195#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007198#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007199#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007202#endif
7203#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007206#endif
7207#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007210#endif
7211#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007214#endif
7215#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, AF_NETLINK);
7218 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007219#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007221#endif
7222#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007224#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7226 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007227#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007229#endif
7230#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007232#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007233#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007235#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007236#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007238#endif
7239#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007241#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007243#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007244 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007245#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007246#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007248#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007249#ifdef NETLINK_CRYPTO
7250 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7251#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007252#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007253
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007254#ifdef AF_QIPCRTR
7255 /* Qualcomm IPCROUTER */
7256 PyModule_AddIntMacro(m, AF_QIPCRTR);
7257#endif
7258
caaveryeffc12f2017-09-06 18:18:10 -04007259#ifdef AF_VSOCK
7260 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7261 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7262 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7263 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7264 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7265 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7266 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7267 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7268 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7269#endif
7270
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007271#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007274#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007275#ifdef AF_LINK
7276 PyModule_AddIntMacro(m, AF_LINK);
7277#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007278#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007281#endif
7282#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007285#endif
7286#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007289#endif
7290#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007293#endif
7294#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007297#endif
7298#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007301#endif
7302#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007304 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007305#endif
7306#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007309#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007310
Hye-Shik Chang81268602004-02-02 06:05:24 +00007311#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007313#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007315#endif /* BTPROTO_L2CAP */
7316#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, BTPROTO_HCI);
7318 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007319#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007321#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007324#endif /* !__FreeBSD__ */
7325#endif /* !__NetBSD__ && !__DragonFly__ */
7326#endif /* BTPROTO_HCI */
7327#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007329#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7331 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007332#ifdef BTPROTO_SCO
7333 PyModule_AddIntMacro(m, BTPROTO_SCO);
7334#endif /* BTPROTO_SCO */
7335#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007336
Charles-François Natali47413c12011-10-06 19:47:44 +02007337#ifdef AF_CAN
7338 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007340#endif
7341#ifdef PF_CAN
7342 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007344#endif
7345
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007346/* Reliable Datagram Sockets */
7347#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007349#endif
7350#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007352#endif
7353
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007354/* Kernel event messages */
7355#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007356 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007357#endif
7358#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007359 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007360#endif
7361
Antoine Pitroub156a462010-10-27 20:13:57 +00007362#ifdef AF_PACKET
7363 PyModule_AddIntMacro(m, AF_PACKET);
7364#endif
7365#ifdef PF_PACKET
7366 PyModule_AddIntMacro(m, PF_PACKET);
7367#endif
7368#ifdef PACKET_HOST
7369 PyModule_AddIntMacro(m, PACKET_HOST);
7370#endif
7371#ifdef PACKET_BROADCAST
7372 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7373#endif
7374#ifdef PACKET_MULTICAST
7375 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7376#endif
7377#ifdef PACKET_OTHERHOST
7378 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7379#endif
7380#ifdef PACKET_OUTGOING
7381 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7382#endif
7383#ifdef PACKET_LOOPBACK
7384 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7385#endif
7386#ifdef PACKET_FASTROUTE
7387 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007388#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007389
Christian Heimes043d6f62008-01-07 17:19:16 +00007390#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007393 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7395 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7396 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007397
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7399 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7400 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, SOL_TIPC);
7404 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7405 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7406 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7407 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007408
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7410 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7411 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7412 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7416 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007417#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007420#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7422 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7423 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7424 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7425 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7426 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007427#endif
7428
Christian Heimesdffa3942016-09-05 23:54:41 +02007429#ifdef HAVE_SOCKADDR_ALG
7430 /* Socket options */
7431 PyModule_AddIntMacro(m, ALG_SET_KEY);
7432 PyModule_AddIntMacro(m, ALG_SET_IV);
7433 PyModule_AddIntMacro(m, ALG_SET_OP);
7434 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7435 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7436 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7437
7438 /* Operations */
7439 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7440 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7441 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7442 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7443#endif
7444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, SOCK_STREAM);
7447 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007448/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007449#ifdef SOCK_RAW
7450 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007452#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007454#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007456#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007457#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007459#endif
7460#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007462#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007472#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007473#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007475#endif
7476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007477#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007480#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007483#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007486#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007489#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007492#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007494#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007495#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007498#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007526#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007527#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007529#endif
7530#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007532#endif
7533#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007535#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007536#ifdef SO_PASSSEC
7537 PyModule_AddIntMacro(m, SO_PASSSEC);
7538#endif
7539#ifdef SO_PEERSEC
7540 PyModule_AddIntMacro(m, SO_PEERSEC);
7541#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007542#ifdef SO_BINDTODEVICE
7543 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7544#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007545#ifdef SO_PRIORITY
7546 PyModule_AddIntMacro(m, SO_PRIORITY);
7547#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007548#ifdef SO_MARK
7549 PyModule_AddIntMacro(m, SO_MARK);
7550#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007551#ifdef SO_DOMAIN
7552 PyModule_AddIntMacro(m, SO_DOMAIN);
7553#endif
7554#ifdef SO_PROTOCOL
7555 PyModule_AddIntMacro(m, SO_PROTOCOL);
7556#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 /* Maximum number of connections for "listen" */
7559#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563#endif
7564
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007565 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007566#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007568#endif
7569#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007571#endif
7572#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007574#endif
7575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576 /* Flags for send, recv */
7577#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007586#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007589#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007592#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007598#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007601#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007606#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007607#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007609#endif
7610#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007612#endif
7613#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007615#endif
7616#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007618#endif
7619#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007621#endif
7622#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007624#endif
7625#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007627#endif
7628#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007630#endif
7631#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007633#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007634#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007636#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638 /* Protocol level and numbers, usable for [gs]etsockopt */
7639#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007644#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007664#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007669#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007670 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007671#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007672#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007674#endif
7675#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7677 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007678#endif
7679#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7681 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7682 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007683
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7685 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7686 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007687#ifdef CAN_ISOTP
7688 PyModule_AddIntMacro(m, CAN_ISOTP);
7689#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007690#endif
7691#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7693 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7694 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7695 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007696#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007697#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7698 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7699#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007700#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7701 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7702#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007703#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007705
7706 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007707 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7708 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7709 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7710 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7711 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7712 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7713 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7714 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7715 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7716 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7717 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7718 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007719
7720 /* BCM flags */
7721 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7722 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7723 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7724 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7725 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7726 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7727 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7728 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7729 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7730 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7731 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7732#ifdef CAN_FD_FRAME
7733 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7734 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7735#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007736#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007737#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007738 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007739#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007740#ifdef HAVE_SOCKADDR_ALG
7741 PyModule_AddIntMacro(m, SOL_ALG);
7742#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007743#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007745#endif
7746#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007748#endif
7749#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007751#endif
7752#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007754#endif
7755#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007757#endif
7758#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007759 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007761#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007762 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007763#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007764 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007769#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007771#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007772 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007774#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007775 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007777#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007778 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007780#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007781 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007783#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007784 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007786#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007787 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007789#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007790 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007791#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007792 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007794#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007797#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007800#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007802#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007803 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007804#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007805#ifdef IPPROTO_UDPLITE
7806 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7807 #ifndef UDPLITE_SEND_CSCOV
7808 #define UDPLITE_SEND_CSCOV 10
7809 #endif
7810 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7811 #ifndef UDPLITE_RECV_CSCOV
7812 #define UDPLITE_RECV_CSCOV 11
7813 #endif
7814 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007816#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007834#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007837#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007846#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007849#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007852#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007855#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007858#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007861#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007864#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007872#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007873#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007878#endif
7879/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007880#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007881 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007882#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007883 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007887#endif
7888
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007889#ifdef MS_WINDOWS
7890 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7891 PyModule_AddIntMacro(m, IPPROTO_ST);
7892 PyModule_AddIntMacro(m, IPPROTO_CBT);
7893 PyModule_AddIntMacro(m, IPPROTO_IGP);
7894 PyModule_AddIntMacro(m, IPPROTO_RDP);
7895 PyModule_AddIntMacro(m, IPPROTO_PGM);
7896 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7897 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7898#endif
7899
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007900#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007902#endif
7903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007904 /* Some port configuration */
7905#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007906 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007907#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007908 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007910#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007911 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007912#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007913 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007914#endif
7915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007916 /* Some reserved IP v.4 addresses */
7917#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007918 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007919#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007920 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007922#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007923 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007924#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007925 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007927#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007929#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007930 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007932#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007933 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007934#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007937#ifdef INADDR_ALLHOSTS_GROUP
7938 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7939 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007940#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007941 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007943#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007944 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007945#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007948#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007950#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007951 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007952#endif
7953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007954 /* IPv4 [gs]etsockopt options */
7955#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007956 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007958#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007965 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007967#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007968 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007970#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007971 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007977 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007979#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007980 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007982#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007983 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007985#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007986 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007987#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007988#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007989 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007990#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007991#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007992 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007994#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007995 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007998 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008000#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008001 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008002#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008003#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008004 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008005#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008007 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8008#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008009 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008011#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008012 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008014#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008015 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008017#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008018 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008020#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008021 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008023#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008024 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008026 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008027#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008028 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008030 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008031#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008032 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008033#endif
8034#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008035 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008036#endif
8037#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008038 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008039#endif
8040#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008042#endif
8043#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008044 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008045#endif
8046#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008047 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008048#endif
8049#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008050 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008051#endif
8052#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008054#endif
8055#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008056 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008057#endif
8058#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008059 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008060#endif
8061#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008062 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008063#endif
8064#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008065 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008066#endif
8067#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008068 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008069#endif
8070#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008071 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008072#endif
8073#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008074 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008075#endif
8076#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008077 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008078#endif
8079#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008080 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008081#endif
8082#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008083 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008084#endif
8085#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008087#endif
8088#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008090#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008092 /* TCP options */
8093#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008094 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008096#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008097 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008099#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008100 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008102#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008103 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008105#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008106 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008108#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008109 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008111#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008112 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008113#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008114#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008115 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008117#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008118 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008120#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008121 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008123#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008124 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008126#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008127 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008128#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008129#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008130 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008131#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008132#ifdef TCP_CONGESTION
8133 PyModule_AddIntMacro(m, TCP_CONGESTION);
8134#endif
8135#ifdef TCP_USER_TIMEOUT
8136 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8137#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008138#ifdef TCP_NOTSENT_LOWAT
8139 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8140#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008142 /* IPX options */
8143#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008144 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008145#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008146
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008147/* Reliable Datagram Sockets */
8148#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008149 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008150#endif
8151#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008152 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008153#endif
8154#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008155 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008156#endif
8157#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008158 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008159#endif
8160#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008161 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008162#endif
8163#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008165#endif
8166#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008168#endif
8169#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008171#endif
8172#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008173 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008174#endif
8175#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008176 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008177#endif
8178#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008180#endif
8181#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008182 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008183#endif
8184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008185 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008186#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008187 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008188#endif
8189#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008190 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008191#endif
8192#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008193 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008194#endif
8195#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008196 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008197#endif
8198#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008199 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008200#endif
8201#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008202 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008203#endif
8204#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008205 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008206#endif
8207#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008208 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008209#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008210#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008211 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008212#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008213#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008215#endif
8216#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008217 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008218#endif
8219#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008221#endif
8222#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008224#endif
8225#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008226 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008227#endif
8228#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008229 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008230#endif
8231#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008232 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008233#endif
8234#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008235 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008236#endif
8237#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008238 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008239#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008240#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008241 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008242#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008243#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008244 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008245#endif
8246#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008248#endif
8249#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008250 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008251#endif
8252#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008253 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008254#endif
8255#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008256 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008257#endif
8258#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008259 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008260#endif
8261#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008263#endif
8264#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008265 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008266#endif
8267#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008268 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008269#endif
8270#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008271 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008272#endif
8273#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008274 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008275#endif
8276#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008277 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008278#endif
8279#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008280 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008281#endif
8282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008283 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008284#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008285 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008286#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008287 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008288#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008289 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008290#endif
8291#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008292 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008293#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008294 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008295#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008296 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008297#endif
8298#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008299 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008300#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008301 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008302#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008303 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008304#endif
8305
Christian Heimesfaf2f632008-01-06 16:59:19 +00008306#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008307 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008308 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8309#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008310 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008311#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008312 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008313 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8314#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008315 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008316#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008317 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008318 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008319 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008320 PyObject *tmp;
8321 tmp = PyLong_FromUnsignedLong(codes[i]);
8322 if (tmp == NULL)
8323 return NULL;
8324 PyModule_AddObject(m, names[i], tmp);
8325 }
8326 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008327 PyModule_AddIntMacro(m, RCVALL_OFF);
8328 PyModule_AddIntMacro(m, RCVALL_ON);
8329 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008330#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008331 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008332#endif
8333#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008334 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008335#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008336#endif /* _MSTCPIP_ */
8337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008338 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008339#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008340 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008341#endif
animalize19e7d482018-02-27 02:10:36 +08008342
8343#ifdef MS_WINDOWS
8344 /* remove some flags on older version Windows during run-time */
8345 remove_unusable_flags(m);
8346#endif
8347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008348 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008349}