blob: 580ac0af5aff59c743d00f97298ddef258cdb700 [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 */
karl ding360371f2020-04-29 15:31:19 -07001559#ifdef CAN_J1939
1560 case CAN_J1939:
1561 {
1562 return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1563 ifname,
1564 a->can_addr.j1939.name,
1565 a->can_addr.j1939.pgn,
1566 a->can_addr.j1939.addr);
1567 }
1568#endif /* CAN_J1939 */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001569 default:
1570 {
bggardner954900a2019-09-12 06:02:48 -04001571 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001572 ifname);
1573 }
1574 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001575 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001576#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001577
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001578#ifdef PF_SYSTEM
1579 case PF_SYSTEM:
1580 switch(proto) {
1581#ifdef SYSPROTO_CONTROL
1582 case SYSPROTO_CONTROL:
1583 {
1584 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1585 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1586 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001587#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001588 default:
1589 PyErr_SetString(PyExc_ValueError,
1590 "Invalid address type");
1591 return 0;
1592 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001593#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001594
Christian Heimesdffa3942016-09-05 23:54:41 +02001595#ifdef HAVE_SOCKADDR_ALG
1596 case AF_ALG:
1597 {
1598 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1599 return Py_BuildValue("s#s#HH",
1600 a->salg_type,
1601 strnlen((const char*)a->salg_type,
1602 sizeof(a->salg_type)),
1603 a->salg_name,
1604 strnlen((const char*)a->salg_name,
1605 sizeof(a->salg_name)),
1606 a->salg_feat,
1607 a->salg_mask);
1608 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001609#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 default:
1614 /* If we don't know the address family, don't raise an
1615 exception -- return it as an (int, bytes) tuple. */
1616 return Py_BuildValue("iy#",
1617 addr->sa_family,
1618 addr->sa_data,
1619 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622}
1623
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001624/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1625 (in particular, numeric IP addresses). */
1626struct maybe_idna {
1627 PyObject *obj;
1628 char *buf;
1629};
1630
1631static void
1632idna_cleanup(struct maybe_idna *data)
1633{
1634 Py_CLEAR(data->obj);
1635}
1636
1637static int
1638idna_converter(PyObject *obj, struct maybe_idna *data)
1639{
1640 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001641 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001642 if (obj == NULL) {
1643 idna_cleanup(data);
1644 return 1;
1645 }
1646 data->obj = NULL;
1647 len = -1;
1648 if (PyBytes_Check(obj)) {
1649 data->buf = PyBytes_AsString(obj);
1650 len = PyBytes_Size(obj);
1651 }
1652 else if (PyByteArray_Check(obj)) {
1653 data->buf = PyByteArray_AsString(obj);
1654 len = PyByteArray_Size(obj);
1655 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001656 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001657 if (PyUnicode_READY(obj) == -1) {
1658 return 0;
1659 }
1660 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001661 data->buf = PyUnicode_DATA(obj);
1662 len = PyUnicode_GET_LENGTH(obj);
1663 }
1664 else {
1665 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1666 if (!obj2) {
1667 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1668 return 0;
1669 }
1670 assert(PyBytes_Check(obj2));
1671 data->obj = obj2;
1672 data->buf = PyBytes_AS_STRING(obj2);
1673 len = PyBytes_GET_SIZE(obj2);
1674 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001675 }
1676 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001677 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
Victor Stinnerdaa97562020-02-07 03:37:06 +01001678 Py_TYPE(obj)->tp_name);
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001679 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001680 }
1681 if (strlen(data->buf) != len) {
1682 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001683 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001684 return 0;
1685 }
1686 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001687}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688
1689/* Parse a socket address argument according to the socket object's
1690 address family. Return 1 if the address was in the proper format,
1691 0 of not. The address is returned through addr_ret, its length
1692 through len_ret. */
1693
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001695getsockaddrarg(PySocketSockObject *s, PyObject *args,
Victor Stinnerd565fb92019-10-10 21:30:20 +02001696 sock_addr_t *addrbuf, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001699
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001700#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 case AF_UNIX:
1702 {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001703 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001704 int retval = 0;
1705
1706 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1707 allow embedded nulls on Linux. */
1708 if (PyUnicode_Check(args)) {
1709 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1710 return 0;
1711 }
1712 else
1713 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001714 if (!PyArg_Parse(args, "y*", &path)) {
1715 Py_DECREF(args);
1716 return retval;
1717 }
1718 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001719
Victor Stinnerd565fb92019-10-10 21:30:20 +02001720 struct sockaddr_un* addr = &addrbuf->un;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001721#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001722 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 /* Linux abstract namespace extension */
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 }
1729 }
1730 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001731#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 {
1733 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001734 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001735 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001737 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001739 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 }
1741 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001742 memcpy(addr->sun_path, path.buf, path.len);
1743 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001744 retval = 1;
1745 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001746 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001747 Py_DECREF(args);
1748 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001750#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001751
Martin v. Löwis11017b12006-01-14 18:12:57 +00001752#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 case AF_NETLINK:
1754 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 int pid, groups;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001756 struct sockaddr_nl* addr = &addrbuf->nl;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (!PyTuple_Check(args)) {
1758 PyErr_Format(
1759 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001760 "%s(): AF_NETLINK address must be tuple, not %.500s",
1761 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 return 0;
1763 }
Oren Milman735171e2018-09-11 19:51:29 +03001764 if (!PyArg_ParseTuple(args,
1765 "II;AF_NETLINK address must be a pair "
1766 "(pid, groups)",
1767 &pid, &groups))
1768 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001770 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 addr->nl_family = AF_NETLINK;
1772 addr->nl_pid = pid;
1773 addr->nl_groups = groups;
1774 *len_ret = sizeof(*addr);
1775 return 1;
1776 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001777#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001778
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001779#if defined(AF_QIPCRTR)
1780 case AF_QIPCRTR:
1781 {
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001782 unsigned int node, port;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001783 struct sockaddr_qrtr* addr = &addrbuf->sq;
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001784 if (!PyTuple_Check(args)) {
1785 PyErr_Format(
1786 PyExc_TypeError,
1787 "getsockaddrarg: "
1788 "AF_QIPCRTR address must be tuple, not %.500s",
1789 Py_TYPE(args)->tp_name);
1790 return 0;
1791 }
1792 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1793 return 0;
1794 addr->sq_family = AF_QIPCRTR;
1795 addr->sq_node = node;
1796 addr->sq_port = port;
1797 *len_ret = sizeof(*addr);
1798 return 1;
1799 }
1800#endif /* AF_QIPCRTR */
1801
caaveryeffc12f2017-09-06 18:18:10 -04001802#if defined(AF_VSOCK)
1803 case AF_VSOCK:
1804 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001805 struct sockaddr_vm* addr = &addrbuf->vm;
caaveryeffc12f2017-09-06 18:18:10 -04001806 int port, cid;
caaveryeffc12f2017-09-06 18:18:10 -04001807 memset(addr, 0, sizeof(struct sockaddr_vm));
1808 if (!PyTuple_Check(args)) {
1809 PyErr_Format(
1810 PyExc_TypeError,
1811 "getsockaddrarg: "
1812 "AF_VSOCK address must be tuple, not %.500s",
1813 Py_TYPE(args)->tp_name);
1814 return 0;
1815 }
1816 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1817 return 0;
1818 addr->svm_family = s->sock_family;
1819 addr->svm_port = port;
1820 addr->svm_cid = cid;
1821 *len_ret = sizeof(*addr);
1822 return 1;
1823 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001824#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001825
1826
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001827#ifdef AF_RDS
1828 case AF_RDS:
1829 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001830#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 case AF_INET:
1833 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001834 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 int port, result;
1836 if (!PyTuple_Check(args)) {
1837 PyErr_Format(
1838 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001839 "%s(): AF_INET address must be tuple, not %.500s",
1840 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 return 0;
1842 }
Oren Milman735171e2018-09-11 19:51:29 +03001843 if (!PyArg_ParseTuple(args,
1844 "O&i;AF_INET address must be a pair "
1845 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001846 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001847 {
1848 assert(PyErr_Occurred());
1849 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1850 PyErr_Format(PyExc_OverflowError,
1851 "%s(): port must be 0-65535.", caller);
1852 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001854 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001855 struct sockaddr_in* addr = &addrbuf->in;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001856 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001858 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (result < 0)
1860 return 0;
1861 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001862 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001864 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 return 0;
1866 }
1867 addr->sin_family = AF_INET;
1868 addr->sin_port = htons((short)port);
1869 *len_ret = sizeof *addr;
1870 return 1;
1871 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001872
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001873#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 case AF_INET6:
1875 {
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001876 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001877 int port, result;
1878 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 flowinfo = scope_id = 0;
1880 if (!PyTuple_Check(args)) {
1881 PyErr_Format(
1882 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001883 "%s(): AF_INET6 address must be tuple, not %.500s",
1884 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 return 0;
1886 }
Oren Milman735171e2018-09-11 19:51:29 +03001887 if (!PyArg_ParseTuple(args,
1888 "O&i|II;AF_INET6 address must be a tuple "
1889 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001890 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001891 &scope_id))
1892 {
1893 assert(PyErr_Occurred());
1894 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1895 PyErr_Format(PyExc_OverflowError,
1896 "%s(): port must be 0-65535.", caller);
1897 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 return 0;
1899 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02001900 struct sockaddr_in6* addr = &addrbuf->in6;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001901 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001903 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 if (result < 0)
1905 return 0;
1906 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001907 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001909 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 return 0;
1911 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001912 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001913 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001914 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001915 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001916 return 0;
1917 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 addr->sin6_family = s->sock_family;
1919 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001920 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 addr->sin6_scope_id = scope_id;
1922 *len_ret = sizeof *addr;
1923 return 1;
1924 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001925#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001926
Hye-Shik Chang81268602004-02-02 06:05:24 +00001927#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 case AF_BLUETOOTH:
1929 {
1930 switch (s->sock_proto) {
Greg Bowser8fbece12019-08-02 16:29:52 -04001931#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 case BTPROTO_L2CAP:
1933 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001934 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001935
Victor Stinnerd565fb92019-10-10 21:30:20 +02001936 struct sockaddr_l2 *addr = &addrbuf->bt_l2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 memset(addr, 0, sizeof(struct sockaddr_l2));
1938 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1939 if (!PyArg_ParseTuple(args, "si", &straddr,
1940 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001941 PyErr_Format(PyExc_OSError,
1942 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 return 0;
1944 }
1945 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1946 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 *len_ret = sizeof *addr;
1949 return 1;
1950 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001951#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 case BTPROTO_RFCOMM:
1953 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001954 const char *straddr;
Victor Stinnerd565fb92019-10-10 21:30:20 +02001955 struct sockaddr_rc *addr = &addrbuf->bt_rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1957 if (!PyArg_ParseTuple(args, "si", &straddr,
1958 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001959 PyErr_Format(PyExc_OSError,
1960 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 return 0;
1962 }
1963 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1964 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 *len_ret = sizeof *addr;
1967 return 1;
1968 }
Greg Bowser8fbece12019-08-02 16:29:52 -04001969#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 case BTPROTO_HCI:
1971 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02001972 struct sockaddr_hci *addr = &addrbuf->bt_hci;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001973#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001974 const char *straddr;
1975 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1976 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001977 PyErr_Format(PyExc_OSError, "%s: "
1978 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001979 return 0;
1980 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001981 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001982 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1983 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001984#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1986 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001987 PyErr_Format(PyExc_OSError,
1988 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 return 0;
1990 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001991#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 *len_ret = sizeof *addr;
1993 return 1;
1994 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001995#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 case BTPROTO_SCO:
1997 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001998 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001999
Victor Stinnerd565fb92019-10-10 21:30:20 +02002000 struct sockaddr_sco *addr = &addrbuf->bt_sco;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
2002 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03002003 PyErr_Format(PyExc_OSError,
2004 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 return 0;
2006 }
2007 straddr = PyBytes_AS_STRING(args);
2008 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
2009 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 *len_ret = sizeof *addr;
2012 return 1;
2013 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002014#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002015#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 default:
Oren Milman735171e2018-09-11 19:51:29 +03002017 PyErr_Format(PyExc_OSError,
2018 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 return 0;
2020 }
2021 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002022#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002023
Antoine Pitroub156a462010-10-27 20:13:57 +00002024#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 case AF_PACKET:
2026 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002028 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 int protoNumber;
2030 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04002031 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002032 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 if (!PyTuple_Check(args)) {
2035 PyErr_Format(
2036 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002037 "%s(): AF_PACKET address must be tuple, not %.500s",
2038 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 return 0;
2040 }
Oren Milman735171e2018-09-11 19:51:29 +03002041 /* XXX: improve the default error message according to the
2042 documentation of AF_PACKET, which would be added as part
2043 of bpo-25041. */
2044 if (!PyArg_ParseTuple(args,
2045 "si|iiy*;AF_PACKET address must be a tuple of "
2046 "two to five elements",
2047 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002048 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002049 {
2050 assert(PyErr_Occurred());
2051 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2052 PyErr_Format(PyExc_OverflowError,
2053 "%s(): address argument out of range", caller);
2054 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002056 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2058 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2059 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2060 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002061 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 return 0;
2063 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002064 if (haddr.buf && haddr.len > 8) {
2065 PyErr_SetString(PyExc_ValueError,
2066 "Hardware address must be 8 bytes or less");
2067 PyBuffer_Release(&haddr);
2068 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 }
2070 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002071 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002073 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002074 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 return 0;
2076 }
Victor Stinnerd565fb92019-10-10 21:30:20 +02002077 struct sockaddr_ll* addr = &addrbuf->ll;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 addr->sll_family = AF_PACKET;
2079 addr->sll_protocol = htons((short)protoNumber);
2080 addr->sll_ifindex = ifr.ifr_ifindex;
2081 addr->sll_pkttype = pkttype;
2082 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002083 if (haddr.buf) {
2084 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2085 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002087 else
2088 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002090 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 return 1;
2092 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002093#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002094
Christian Heimes043d6f62008-01-07 17:19:16 +00002095#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 case AF_TIPC:
2097 {
2098 unsigned int atype, v1, v2, v3;
2099 unsigned int scope = TIPC_CLUSTER_SCOPE;
Christian Heimes043d6f62008-01-07 17:19:16 +00002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 if (!PyTuple_Check(args)) {
2102 PyErr_Format(
2103 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002104 "%s(): AF_TIPC address must be tuple, not %.500s",
2105 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 return 0;
2107 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002110 "IIII|I;AF_TIPC address must be a tuple "
2111 "(addr_type, v1, v2, v3[, scope])",
2112 &atype, &v1, &v2, &v3, &scope))
2113 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002115 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002116
Victor Stinnerd565fb92019-10-10 21:30:20 +02002117 struct sockaddr_tipc *addr = &addrbuf->tipc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 addr->family = AF_TIPC;
2121 addr->scope = scope;
2122 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 if (atype == TIPC_ADDR_NAMESEQ) {
2125 addr->addr.nameseq.type = v1;
2126 addr->addr.nameseq.lower = v2;
2127 addr->addr.nameseq.upper = v3;
2128 } else if (atype == TIPC_ADDR_NAME) {
2129 addr->addr.name.name.type = v1;
2130 addr->addr.name.name.instance = v2;
2131 } else if (atype == TIPC_ADDR_ID) {
2132 addr->addr.id.node = v1;
2133 addr->addr.id.ref = v2;
2134 } else {
2135 /* Shouldn't happen */
2136 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2137 return 0;
2138 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 return 1;
2143 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002144#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002145
Serhiy Storchakad3187152017-11-09 18:00:38 +02002146#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002147 case AF_CAN:
2148 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002149#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002150 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002151 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002152#endif
2153#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002154 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002155#endif
2156#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002157 {
Charles-François Natali47413c12011-10-06 19:47:44 +02002158 PyObject *interfaceName;
2159 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002160 Py_ssize_t len;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002161 struct sockaddr_can *addr = &addrbuf->can;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002162
Oren Milman735171e2018-09-11 19:51:29 +03002163 if (!PyTuple_Check(args)) {
2164 PyErr_Format(PyExc_TypeError,
2165 "%s(): AF_CAN address must be tuple, not %.500s",
2166 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002167 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002168 }
2169 if (!PyArg_ParseTuple(args,
2170 "O&;AF_CAN address must be a tuple "
2171 "(interface, )",
2172 PyUnicode_FSConverter, &interfaceName))
2173 {
2174 return 0;
2175 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002176
2177 len = PyBytes_GET_SIZE(interfaceName);
2178
2179 if (len == 0) {
2180 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002181 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002182 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2183 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002184 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2185 s->errorhandler();
2186 Py_DECREF(interfaceName);
2187 return 0;
2188 }
2189 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002190 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002191 "AF_CAN interface name too long");
2192 Py_DECREF(interfaceName);
2193 return 0;
2194 }
2195
2196 addr->can_family = AF_CAN;
2197 addr->can_ifindex = ifr.ifr_ifindex;
2198
2199 *len_ret = sizeof(*addr);
2200 Py_DECREF(interfaceName);
2201 return 1;
2202 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002203#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002204
2205#ifdef CAN_ISOTP
2206 case CAN_ISOTP:
2207 {
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002208 PyObject *interfaceName;
2209 struct ifreq ifr;
2210 Py_ssize_t len;
2211 unsigned long int rx_id, tx_id;
2212
Victor Stinnerd565fb92019-10-10 21:30:20 +02002213 struct sockaddr_can *addr = &addrbuf->can;
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002214
2215 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2216 &interfaceName,
2217 &rx_id,
2218 &tx_id))
2219 return 0;
2220
2221 len = PyBytes_GET_SIZE(interfaceName);
2222
2223 if (len == 0) {
2224 ifr.ifr_ifindex = 0;
2225 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2226 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2227 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2228 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2229 s->errorhandler();
2230 Py_DECREF(interfaceName);
2231 return 0;
2232 }
2233 } else {
2234 PyErr_SetString(PyExc_OSError,
2235 "AF_CAN interface name too long");
2236 Py_DECREF(interfaceName);
2237 return 0;
2238 }
2239
2240 addr->can_family = AF_CAN;
2241 addr->can_ifindex = ifr.ifr_ifindex;
2242 addr->can_addr.tp.rx_id = rx_id;
2243 addr->can_addr.tp.tx_id = tx_id;
2244
2245 *len_ret = sizeof(*addr);
2246 Py_DECREF(interfaceName);
2247 return 1;
2248 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002249#endif /* CAN_ISOTP */
karl ding360371f2020-04-29 15:31:19 -07002250#ifdef CAN_J1939
2251 case CAN_J1939:
2252 {
2253 PyObject *interfaceName;
2254 struct ifreq ifr;
2255 Py_ssize_t len;
2256 uint64_t j1939_name;
2257 uint32_t j1939_pgn;
2258 uint8_t j1939_addr;
2259
2260 struct sockaddr_can *addr = &addrbuf->can;
2261
2262 if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2263 &interfaceName,
2264 &j1939_name,
2265 &j1939_pgn,
2266 &j1939_addr))
2267 return 0;
2268
2269 len = PyBytes_GET_SIZE(interfaceName);
2270
2271 if (len == 0) {
2272 ifr.ifr_ifindex = 0;
2273 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2274 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2275 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2276 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2277 s->errorhandler();
2278 Py_DECREF(interfaceName);
2279 return 0;
2280 }
2281 } else {
2282 PyErr_SetString(PyExc_OSError,
2283 "AF_CAN interface name too long");
2284 Py_DECREF(interfaceName);
2285 return 0;
2286 }
2287
2288 addr->can_family = AF_CAN;
2289 addr->can_ifindex = ifr.ifr_ifindex;
2290 addr->can_addr.j1939.name = j1939_name;
2291 addr->can_addr.j1939.pgn = j1939_pgn;
2292 addr->can_addr.j1939.addr = j1939_addr;
2293
2294 *len_ret = sizeof(*addr);
2295 Py_DECREF(interfaceName);
2296 return 1;
2297 }
2298#endif /* CAN_J1939 */
Charles-François Natali47413c12011-10-06 19:47:44 +02002299 default:
Oren Milman735171e2018-09-11 19:51:29 +03002300 PyErr_Format(PyExc_OSError,
2301 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002302 return 0;
2303 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002304#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002305
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002306#ifdef PF_SYSTEM
2307 case PF_SYSTEM:
2308 switch (s->sock_proto) {
2309#ifdef SYSPROTO_CONTROL
2310 case SYSPROTO_CONTROL:
2311 {
Victor Stinnerd565fb92019-10-10 21:30:20 +02002312 struct sockaddr_ctl *addr = &addrbuf->ctl;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002313 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002314 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002315
2316 if (PyUnicode_Check(args)) {
2317 struct ctl_info info;
2318 PyObject *ctl_name;
2319
2320 if (!PyArg_Parse(args, "O&",
2321 PyUnicode_FSConverter, &ctl_name)) {
2322 return 0;
2323 }
2324
Victor Stinnerf50e1872015-03-20 11:32:24 +01002325 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002326 PyErr_SetString(PyExc_ValueError,
2327 "provided string is too long");
2328 Py_DECREF(ctl_name);
2329 return 0;
2330 }
2331 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2332 sizeof(info.ctl_name));
2333 Py_DECREF(ctl_name);
2334
2335 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2336 PyErr_SetString(PyExc_OSError,
2337 "cannot find kernel control with provided name");
2338 return 0;
2339 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002340
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002341 addr->sc_id = info.ctl_id;
2342 addr->sc_unit = 0;
2343 } else if (!PyArg_ParseTuple(args, "II",
2344 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002345 PyErr_Format(PyExc_TypeError,
2346 "%s(): PF_SYSTEM address must be a str or "
2347 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002348 return 0;
2349 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002350
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002351 *len_ret = sizeof(*addr);
2352 return 1;
2353 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002354#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002355 default:
Oren Milman735171e2018-09-11 19:51:29 +03002356 PyErr_Format(PyExc_OSError,
2357 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002358 return 0;
2359 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002360#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002361#ifdef HAVE_SOCKADDR_ALG
2362 case AF_ALG:
2363 {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002364 const char *type;
2365 const char *name;
Victor Stinnerd565fb92019-10-10 21:30:20 +02002366 struct sockaddr_alg *sa = &addrbuf->alg;
Christian Heimesdffa3942016-09-05 23:54:41 +02002367
2368 memset(sa, 0, sizeof(*sa));
2369 sa->salg_family = AF_ALG;
2370
Oren Milman735171e2018-09-11 19:51:29 +03002371 if (!PyTuple_Check(args)) {
2372 PyErr_Format(PyExc_TypeError,
2373 "%s(): AF_ALG address must be tuple, not %.500s",
2374 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002375 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002376 }
2377 if (!PyArg_ParseTuple(args,
2378 "ss|HH;AF_ALG address must be a tuple "
2379 "(type, name[, feat[, mask]])",
2380 &type, &name, &sa->salg_feat, &sa->salg_mask))
2381 {
2382 return 0;
2383 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002384 /* sockaddr_alg has fixed-sized char arrays for type, and name
2385 * both must be NULL terminated.
2386 */
2387 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002388 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2389 return 0;
2390 }
2391 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002392 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002393 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2394 return 0;
2395 }
2396 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2397
2398 *len_ret = sizeof(*sa);
2399 return 1;
2400 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002401#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 default:
Oren Milman735171e2018-09-11 19:51:29 +03002406 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002410}
2411
Guido van Rossum30a685f1991-06-27 15:51:29 +00002412
Guido van Rossum48a680c2001-03-02 06:34:14 +00002413/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002414 Return 1 if the family is known, 0 otherwise. The length is returned
2415 through len_ret. */
2416
2417static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002418getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002421
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002422#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 case AF_UNIX:
2424 {
2425 *len_ret = sizeof (struct sockaddr_un);
2426 return 1;
2427 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002428#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002429
Martin v. Löwis11017b12006-01-14 18:12:57 +00002430#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002431 case AF_NETLINK:
2432 {
2433 *len_ret = sizeof (struct sockaddr_nl);
2434 return 1;
2435 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002436#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002437
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002438#if defined(AF_QIPCRTR)
2439 case AF_QIPCRTR:
2440 {
2441 *len_ret = sizeof (struct sockaddr_qrtr);
2442 return 1;
2443 }
2444#endif /* AF_QIPCRTR */
2445
caaveryeffc12f2017-09-06 18:18:10 -04002446#if defined(AF_VSOCK)
2447 case AF_VSOCK:
2448 {
2449 *len_ret = sizeof (struct sockaddr_vm);
2450 return 1;
2451 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002452#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002453
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002454#ifdef AF_RDS
2455 case AF_RDS:
2456 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002457#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 case AF_INET:
2460 {
2461 *len_ret = sizeof (struct sockaddr_in);
2462 return 1;
2463 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002464
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002465#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 case AF_INET6:
2467 {
2468 *len_ret = sizeof (struct sockaddr_in6);
2469 return 1;
2470 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002471#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472
Hye-Shik Chang81268602004-02-02 06:05:24 +00002473#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 case AF_BLUETOOTH:
2475 {
2476 switch(s->sock_proto)
2477 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002478
Greg Bowser8fbece12019-08-02 16:29:52 -04002479#ifdef BTPROTO_L2CAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 case BTPROTO_L2CAP:
2481 *len_ret = sizeof (struct sockaddr_l2);
2482 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002483#endif /* BTPROTO_L2CAP */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 case BTPROTO_RFCOMM:
2485 *len_ret = sizeof (struct sockaddr_rc);
2486 return 1;
Greg Bowser8fbece12019-08-02 16:29:52 -04002487#ifdef BTPROTO_HCI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 case BTPROTO_HCI:
2489 *len_ret = sizeof (struct sockaddr_hci);
2490 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002491#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 case BTPROTO_SCO:
2493 *len_ret = sizeof (struct sockaddr_sco);
2494 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002495#endif /* !__FreeBSD__ */
Greg Bowser8fbece12019-08-02 16:29:52 -04002496#endif /* BTPROTO_HCI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002498 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 "unknown BT protocol");
2500 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 }
2503 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002504#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002505
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002506#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 case AF_PACKET:
2508 {
2509 *len_ret = sizeof (struct sockaddr_ll);
2510 return 1;
2511 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002512#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002513
Christian Heimes043d6f62008-01-07 17:19:16 +00002514#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 case AF_TIPC:
2516 {
2517 *len_ret = sizeof (struct sockaddr_tipc);
2518 return 1;
2519 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002520#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002521
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002522#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002523 case AF_CAN:
2524 {
2525 *len_ret = sizeof (struct sockaddr_can);
2526 return 1;
2527 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002528#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002529
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002530#ifdef PF_SYSTEM
2531 case PF_SYSTEM:
2532 switch(s->sock_proto) {
2533#ifdef SYSPROTO_CONTROL
2534 case SYSPROTO_CONTROL:
2535 *len_ret = sizeof (struct sockaddr_ctl);
2536 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002537#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002538 default:
2539 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2540 "unknown PF_SYSTEM protocol");
2541 return 0;
2542 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002543#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002544#ifdef HAVE_SOCKADDR_ALG
2545 case AF_ALG:
2546 {
2547 *len_ret = sizeof (struct sockaddr_alg);
2548 return 1;
2549 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002550#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002555 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002559}
2560
2561
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002562/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2563 Currently, these methods are only compiled if the RFC 2292/3542
2564 CMSG_LEN() macro is available. Older systems seem to have used
2565 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2566 it may be possible to define CMSG_LEN() that way if it's not
2567 provided. Some architectures might need extra padding after the
2568 cmsghdr, however, and CMSG_LEN() would have to take account of
2569 this. */
2570#ifdef CMSG_LEN
2571/* If length is in range, set *result to CMSG_LEN(length) and return
2572 true; otherwise, return false. */
2573static int
2574get_CMSG_LEN(size_t length, size_t *result)
2575{
2576 size_t tmp;
2577
2578 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2579 return 0;
2580 tmp = CMSG_LEN(length);
2581 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2582 return 0;
2583 *result = tmp;
2584 return 1;
2585}
2586
2587#ifdef CMSG_SPACE
2588/* If length is in range, set *result to CMSG_SPACE(length) and return
2589 true; otherwise, return false. */
2590static int
2591get_CMSG_SPACE(size_t length, size_t *result)
2592{
2593 size_t tmp;
2594
2595 /* Use CMSG_SPACE(1) here in order to take account of the padding
2596 necessary before *and* after the data. */
2597 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2598 return 0;
2599 tmp = CMSG_SPACE(length);
2600 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2601 return 0;
2602 *result = tmp;
2603 return 1;
2604}
2605#endif
2606
2607/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2608 pointer in msg->msg_control with at least "space" bytes after it,
2609 and its cmsg_len member inside the buffer. */
2610static int
2611cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2612{
2613 size_t cmsg_offset;
2614 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2615 sizeof(cmsgh->cmsg_len));
2616
Charles-François Natali466517d2011-08-28 18:23:43 +02002617 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002618 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002619 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002620 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2621 annoying under OS X as it's unsigned there and so it triggers a
2622 tautological comparison warning under Clang when compared against 0.
2623 Since the check is valid on other platforms, silence the warning under
2624 Clang. */
2625 #ifdef __clang__
2626 #pragma clang diagnostic push
2627 #pragma clang diagnostic ignored "-Wtautological-compare"
2628 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002629 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002630 #pragma GCC diagnostic push
2631 #pragma GCC diagnostic ignored "-Wtype-limits"
2632 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002633 if (msg->msg_controllen < 0)
2634 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002635 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002636 #pragma GCC diagnostic pop
2637 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002638 #ifdef __clang__
2639 #pragma clang diagnostic pop
2640 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002641 if (space < cmsg_len_end)
2642 space = cmsg_len_end;
2643 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2644 return (cmsg_offset <= (size_t)-1 - space &&
2645 cmsg_offset + space <= msg->msg_controllen);
2646}
2647
2648/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2649 *space to number of bytes following it in the buffer and return
2650 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2651 msg->msg_controllen are valid. */
2652static int
2653get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2654{
2655 size_t data_offset;
2656 char *data_ptr;
2657
2658 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2659 return 0;
2660 data_offset = data_ptr - (char *)msg->msg_control;
2661 if (data_offset > msg->msg_controllen)
2662 return 0;
2663 *space = msg->msg_controllen - data_offset;
2664 return 1;
2665}
2666
2667/* If cmsgh is invalid or not contained in the buffer pointed to by
2668 msg->msg_control, return -1. If cmsgh is valid and its associated
2669 data is entirely contained in the buffer, set *data_len to the
2670 length of the associated data and return 0. If only part of the
2671 associated data is contained in the buffer but cmsgh is otherwise
2672 valid, set *data_len to the length contained in the buffer and
2673 return 1. */
2674static int
2675get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2676{
2677 size_t space, cmsg_data_len;
2678
2679 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2680 cmsgh->cmsg_len < CMSG_LEN(0))
2681 return -1;
2682 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2683 if (!get_cmsg_data_space(msg, cmsgh, &space))
2684 return -1;
2685 if (space >= cmsg_data_len) {
2686 *data_len = cmsg_data_len;
2687 return 0;
2688 }
2689 *data_len = space;
2690 return 1;
2691}
2692#endif /* CMSG_LEN */
2693
2694
Victor Stinner31bf2d52015-04-01 21:57:09 +02002695struct sock_accept {
2696 socklen_t *addrlen;
2697 sock_addr_t *addrbuf;
2698 SOCKET_T result;
2699};
2700
2701#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2702/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2703static int accept4_works = -1;
2704#endif
2705
2706static int
2707sock_accept_impl(PySocketSockObject *s, void *data)
2708{
2709 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002710 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2711 socklen_t *paddrlen = ctx->addrlen;
2712#ifdef HAVE_SOCKADDR_ALG
2713 /* AF_ALG does not support accept() with addr and raises
2714 * ECONNABORTED instead. */
2715 if (s->sock_family == AF_ALG) {
2716 addr = NULL;
2717 paddrlen = NULL;
2718 *ctx->addrlen = 0;
2719 }
2720#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002721
2722#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2723 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002724 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002725 SOCK_CLOEXEC);
2726 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2727 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2728 accept4_works = (errno != ENOSYS);
2729 }
2730 }
2731 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002732 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002733#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002734 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002735#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002736
2737#ifdef MS_WINDOWS
2738 return (ctx->result != INVALID_SOCKET);
2739#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002740 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002741#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002742}
2743
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002744/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002745
Guido van Rossum73624e91994-10-10 17:59:00 +00002746static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302747sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002750 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 socklen_t addrlen;
2752 PyObject *sock = NULL;
2753 PyObject *addr = NULL;
2754 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002755 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (!getsockaddrlen(s, &addrlen))
2758 return NULL;
2759 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 if (!IS_SELECTABLE(s))
2762 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002763
Victor Stinner31bf2d52015-04-01 21:57:09 +02002764 ctx.addrlen = &addrlen;
2765 ctx.addrbuf = &addrbuf;
2766 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002768 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002769
Victor Stinnerdaf45552013-08-28 00:53:59 +02002770#ifdef MS_WINDOWS
2771 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2772 PyErr_SetFromWindowsErr(0);
2773 SOCKETCLOSE(newfd);
2774 goto finally;
2775 }
2776#else
2777
2778#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2779 if (!accept4_works)
2780#endif
2781 {
2782 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2783 SOCKETCLOSE(newfd);
2784 goto finally;
2785 }
2786 }
2787#endif
2788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 sock = PyLong_FromSocket_t(newfd);
2790 if (sock == NULL) {
2791 SOCKETCLOSE(newfd);
2792 goto finally;
2793 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2796 addrlen, s->sock_proto);
2797 if (addr == NULL)
2798 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002801
Guido van Rossum67f7a382002-06-06 21:08:16 +00002802finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 Py_XDECREF(sock);
2804 Py_XDECREF(addr);
2805 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002806}
2807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002809"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002810\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002811Wait for an incoming connection. Return a new socket file descriptor\n\
2812representing the connection, and the address of the client.\n\
2813For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002814
Guido van Rossum11ba0942002-06-13 15:07:44 +00002815/* s.setblocking(flag) method. Argument:
2816 False -- non-blocking mode; same as settimeout(0)
2817 True -- blocking mode; same as settimeout(None)
2818*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002819
Guido van Rossum73624e91994-10-10 17:59:00 +00002820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002822{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002823 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 block = PyLong_AsLong(arg);
2826 if (block == -1 && PyErr_Occurred())
2827 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002828
Victor Stinner9001d802015-04-06 23:06:01 +02002829 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002830 if (internal_setblocking(s, block) == -1) {
2831 return NULL;
2832 }
2833 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002834}
Guido van Rossume4485b01994-09-07 14:32:49 +00002835
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002836PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002837"setblocking(flag)\n\
2838\n\
2839Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002840setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842
Yury Selivanovf11b4602018-01-28 17:27:38 -05002843/* s.getblocking() method.
2844 Returns True if socket is in blocking mode,
2845 False if it is in non-blocking mode.
2846*/
2847static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302848sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002849{
2850 if (s->sock_timeout) {
2851 Py_RETURN_TRUE;
2852 }
2853 else {
2854 Py_RETURN_FALSE;
2855 }
2856}
2857
2858PyDoc_STRVAR(getblocking_doc,
2859"getblocking()\n\
2860\n\
2861Returns True if socket is in blocking mode, or False if it\n\
2862is in non-blocking mode.");
2863
Victor Stinner71694d52015-03-28 01:18:54 +01002864static int
2865socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2866{
2867#ifdef MS_WINDOWS
2868 struct timeval tv;
2869#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002870#ifndef HAVE_POLL
2871 _PyTime_t ms;
2872#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002873 int overflow = 0;
2874
2875 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002876 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002877 return 0;
2878 }
2879
Victor Stinner869e1772015-03-30 03:49:14 +02002880 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002881 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002882 return -1;
2883
2884 if (*timeout < 0) {
2885 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2886 return -1;
2887 }
2888
2889#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002890 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002891#endif
2892#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002893 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002894 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002895#endif
2896 if (overflow) {
2897 PyErr_SetString(PyExc_OverflowError,
2898 "timeout doesn't fit into C timeval");
2899 return -1;
2900 }
2901
2902 return 0;
2903}
2904
Guido van Rossum11ba0942002-06-13 15:07:44 +00002905/* s.settimeout(timeout) method. Argument:
2906 None -- no timeout, blocking mode; same as setblocking(True)
2907 0.0 -- non-blocking mode; same as setblocking(False)
2908 > 0 -- timeout mode; operations time out after timeout seconds
2909 < 0 -- illegal; raises an exception
2910*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002912sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002913{
Victor Stinner71694d52015-03-28 01:18:54 +01002914 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915
Victor Stinner71694d52015-03-28 01:18:54 +01002916 if (socket_parse_timeout(&timeout, arg) < 0)
2917 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002920
2921 int block = timeout < 0;
2922 /* Blocking mode for a Python socket object means that operations
2923 like :meth:`recv` or :meth:`sendall` will block the execution of
2924 the current thread until they are complete or aborted with a
2925 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2926 the underlying FD is in a blocking mode. When timeout is a positive
2927 number, the FD is in a non-blocking mode, and socket ops are
2928 implemented with a `select()` call.
2929
2930 When timeout is 0.0, the FD is in a non-blocking mode.
2931
2932 This table summarizes all states in which the socket object and
2933 its underlying FD can be:
2934
2935 ==================== ===================== ==============
2936 `gettimeout()` `getblocking()` FD
2937 ==================== ===================== ==============
2938 ``None`` ``True`` blocking
2939 ``0.0`` ``False`` non-blocking
2940 ``> 0`` ``True`` non-blocking
2941 */
2942
2943 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002944 return NULL;
2945 }
2946 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002947}
2948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002949PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002950"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002951\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002952Set a timeout on socket operations. 'timeout' can be a float,\n\
2953giving in seconds, or None. Setting a timeout of None disables\n\
2954the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002955Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002956
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002957/* s.gettimeout() method.
2958 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002959static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302960sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002961{
Victor Stinner71694d52015-03-28 01:18:54 +01002962 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002963 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 }
Victor Stinner71694d52015-03-28 01:18:54 +01002965 else {
2966 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2967 return PyFloat_FromDouble(seconds);
2968 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002969}
2970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002971PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002972"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002973\n\
oldkaa0735f2018-02-02 16:52:55 +08002974Returns the timeout in seconds (float) associated with socket\n\
2975operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002976operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002977
Guido van Rossumaee08791992-09-08 09:05:33 +00002978/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002979 With an integer third argument, sets an integer optval with optlen=4.
2980 With None as third argument and an integer fourth argument, set
2981 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002982 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002983 use optional built-in module 'struct' to encode the string.
2984*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002985
Guido van Rossum73624e91994-10-10 17:59:00 +00002986static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002987sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 int level;
2990 int optname;
2991 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002992 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002994 unsigned int optlen;
2995 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002996
caaveryeffc12f2017-09-06 18:18:10 -04002997#ifdef AF_VSOCK
2998 if (s->sock_family == AF_VSOCK) {
2999 uint64_t vflag; // Must be set width of 64 bits
3000 /* setsockopt(level, opt, flag) */
3001 if (PyArg_ParseTuple(args, "iiK:setsockopt",
3002 &level, &optname, &vflag)) {
3003 // level should always be set to AF_VSOCK
3004 res = setsockopt(s->sock_fd, level, optname,
3005 (void*)&vflag, sizeof vflag);
3006 goto done;
3007 }
3008 return NULL;
3009 }
3010#endif
3011
Christian Heimesdffa3942016-09-05 23:54:41 +02003012 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 if (PyArg_ParseTuple(args, "iii:setsockopt",
3014 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003015 res = setsockopt(s->sock_fd, level, optname,
3016 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02003017 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003019
3020 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02003021 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02003022 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
3023 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
3024 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01003025 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02003026 NULL, (socklen_t)optlen);
3027 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003029
3030 PyErr_Clear();
3031 /* setsockopt(level, opt, buffer) */
3032 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
3033 &level, &optname, &optval))
3034 return NULL;
3035
3036#ifdef MS_WINDOWS
3037 if (optval.len > INT_MAX) {
3038 PyBuffer_Release(&optval);
3039 PyErr_Format(PyExc_OverflowError,
3040 "socket option is larger than %i bytes",
3041 INT_MAX);
3042 return NULL;
3043 }
3044 res = setsockopt(s->sock_fd, level, optname,
3045 optval.buf, (int)optval.len);
3046#else
3047 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
3048#endif
3049 PyBuffer_Release(&optval);
3050
3051done:
Victor Stinnercc739322016-03-23 21:35:29 +01003052 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01003054 }
3055
3056 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003057}
3058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003059PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02003060"setsockopt(level, option, value: int)\n\
3061setsockopt(level, option, value: buffer)\n\
3062setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003063\n\
3064Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08003065The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02003066None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003067
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003068
Guido van Rossumaee08791992-09-08 09:05:33 +00003069/* s.getsockopt() method.
3070 With two arguments, retrieves an integer option.
3071 With a third integer argument, retrieves a string buffer of that size;
3072 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003073
Guido van Rossum73624e91994-10-10 17:59:00 +00003074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 int level;
3078 int optname;
3079 int res;
3080 PyObject *buf;
3081 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04003082 int flag = 0;
3083 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3086 &level, &optname, &buflen))
3087 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003090#ifdef AF_VSOCK
3091 if (s->sock_family == AF_VSOCK) {
3092 uint64_t vflag = 0; // Must be set width of 64 bits
3093 flagsize = sizeof vflag;
3094 res = getsockopt(s->sock_fd, level, optname,
3095 (void *)&vflag, &flagsize);
3096 if (res < 0)
3097 return s->errorhandler();
3098 return PyLong_FromUnsignedLong(vflag);
3099 }
3100#endif
3101 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 res = getsockopt(s->sock_fd, level, optname,
3103 (void *)&flag, &flagsize);
3104 if (res < 0)
3105 return s->errorhandler();
3106 return PyLong_FromLong(flag);
3107 }
caaveryeffc12f2017-09-06 18:18:10 -04003108#ifdef AF_VSOCK
3109 if (s->sock_family == AF_VSOCK) {
3110 PyErr_SetString(PyExc_OSError,
3111 "getsockopt string buffer not allowed");
3112 return NULL;
3113 }
3114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003116 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 "getsockopt buflen out of range");
3118 return NULL;
3119 }
3120 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3121 if (buf == NULL)
3122 return NULL;
3123 res = getsockopt(s->sock_fd, level, optname,
3124 (void *)PyBytes_AS_STRING(buf), &buflen);
3125 if (res < 0) {
3126 Py_DECREF(buf);
3127 return s->errorhandler();
3128 }
3129 _PyBytes_Resize(&buf, buflen);
3130 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003131}
3132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003133PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003134"getsockopt(level, option[, buffersize]) -> value\n\
3135\n\
3136Get a socket option. See the Unix manual for level and option.\n\
3137If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003138string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003139
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003140
Fred Drake728819a2000-07-01 03:40:12 +00003141/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003142
Guido van Rossum73624e91994-10-10 17:59:00 +00003143static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003144sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 sock_addr_t addrbuf;
3147 int addrlen;
3148 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003149
Victor Stinnerd565fb92019-10-10 21:30:20 +02003150 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003152 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003153
3154 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3155 return NULL;
3156 }
3157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 Py_BEGIN_ALLOW_THREADS
3159 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3160 Py_END_ALLOW_THREADS
3161 if (res < 0)
3162 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003163 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003164}
3165
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003166PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003167"bind(address)\n\
3168\n\
3169Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003170pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003171sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003172
Guido van Rossum30a685f1991-06-27 15:51:29 +00003173
3174/* s.close() method.
3175 Set the file descriptor to -1 so operations tried subsequently
3176 will surely fail. */
3177
Guido van Rossum73624e91994-10-10 17:59:00 +00003178static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303179sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003182 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003183
Victor Stinner19a8e842016-03-21 16:36:48 +01003184 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003185 if (fd != INVALID_SOCKET) {
3186 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003187
3188 /* We do not want to retry upon EINTR: see
3189 http://lwn.net/Articles/576478/ and
3190 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3191 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003193 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003195 /* bpo-30319: The peer can already have closed the connection.
3196 Python ignores ECONNRESET on close(). */
3197 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003198 return s->errorhandler();
3199 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003201 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003202}
3203
Christian Heimesd0e31b92018-01-27 09:54:13 +01003204PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205"close()\n\
3206\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003207Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003208
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003209static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303210sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003211{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003212 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003213 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003214 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003215}
3216
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003217PyDoc_STRVAR(detach_doc,
3218"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003219\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003220Close the socket object without closing the underlying file descriptor.\n\
3221The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003222can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003223
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003224static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003225sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003226{
Victor Stinner81c41db2015-04-02 11:50:57 +02003227 int err;
3228 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003229
Victor Stinner81c41db2015-04-02 11:50:57 +02003230 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3231 /* getsockopt() failed */
3232 return 0;
3233 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003234
Victor Stinner81c41db2015-04-02 11:50:57 +02003235 if (err == EISCONN)
3236 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003237 if (err != 0) {
3238 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3239 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003240 return 0;
3241 }
3242 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003243}
3244
3245static int
3246internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3247 int raise)
3248{
3249 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003250
3251 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003253 Py_END_ALLOW_THREADS
3254
Victor Stinner70a46f62015-03-31 22:03:59 +02003255 if (!res) {
3256 /* connect() succeeded, the socket is connected */
3257 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003259
Victor Stinner81c41db2015-04-02 11:50:57 +02003260 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003261
Victor Stinner81c41db2015-04-02 11:50:57 +02003262 /* save error, PyErr_CheckSignals() can replace it */
3263 err = GET_SOCK_ERROR;
3264 if (CHECK_ERRNO(EINTR)) {
3265 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003266 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003267
3268 /* Issue #23618: when connect() fails with EINTR, the connection is
3269 running asynchronously.
3270
3271 If the socket is blocking or has a timeout, wait until the
3272 connection completes, fails or timed out using select(), and then
3273 get the connection status using getsockopt(SO_ERROR).
3274
3275 If the socket is non-blocking, raise InterruptedError. The caller is
3276 responsible to wait until the connection completes, fails or timed
3277 out (it's the case in asyncio for example). */
3278 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3279 }
3280 else {
3281 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3282 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003283 }
3284
Victor Stinner81c41db2015-04-02 11:50:57 +02003285 if (!wait_connect) {
3286 if (raise) {
3287 /* restore error, maybe replaced by PyErr_CheckSignals() */
3288 SET_SOCK_ERROR(err);
3289 s->errorhandler();
3290 return -1;
3291 }
3292 else
3293 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003294 }
3295
Victor Stinner81c41db2015-04-02 11:50:57 +02003296 if (raise) {
3297 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003298 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3299 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003300 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003301 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003302 else {
3303 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003304 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3305 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003306 return err;
3307 }
3308 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003309}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003310
Fred Drake728819a2000-07-01 03:40:12 +00003311/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003312
Guido van Rossum73624e91994-10-10 17:59:00 +00003313static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003314sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 sock_addr_t addrbuf;
3317 int addrlen;
3318 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003319
Victor Stinnerd565fb92019-10-10 21:30:20 +02003320 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003323
Steve Dowerb82e17e2019-05-23 08:45:22 -07003324 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3325 return NULL;
3326 }
3327
Victor Stinner81c41db2015-04-02 11:50:57 +02003328 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003329 if (res < 0)
3330 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003331
Victor Stinneree699e92015-03-31 21:28:42 +02003332 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003333}
3334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003335PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003336"connect(address)\n\
3337\n\
3338Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003339is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003340
Guido van Rossum30a685f1991-06-27 15:51:29 +00003341
Fred Drake728819a2000-07-01 03:40:12 +00003342/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003343
3344static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003345sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 sock_addr_t addrbuf;
3348 int addrlen;
3349 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003350
Victor Stinnerd565fb92019-10-10 21:30:20 +02003351 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003353 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003354
Steve Dowerb82e17e2019-05-23 08:45:22 -07003355 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3356 return NULL;
3357 }
3358
Victor Stinner81c41db2015-04-02 11:50:57 +02003359 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003360 if (res < 0)
3361 return NULL;
3362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003364}
3365
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003366PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003367"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003368\n\
3369This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003370instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003371
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003372
Guido van Rossumed233a51992-06-23 09:07:03 +00003373/* s.fileno() method */
3374
Guido van Rossum73624e91994-10-10 17:59:00 +00003375static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303376sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003379}
3380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003381PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003382"fileno() -> integer\n\
3383\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003385
Guido van Rossumed233a51992-06-23 09:07:03 +00003386
Guido van Rossumc89705d1992-11-26 08:54:07 +00003387/* s.getsockname() method */
3388
Guido van Rossum73624e91994-10-10 17:59:00 +00003389static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303390sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 sock_addr_t addrbuf;
3393 int res;
3394 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 if (!getsockaddrlen(s, &addrlen))
3397 return NULL;
3398 memset(&addrbuf, 0, addrlen);
3399 Py_BEGIN_ALLOW_THREADS
3400 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3401 Py_END_ALLOW_THREADS
3402 if (res < 0)
3403 return s->errorhandler();
3404 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3405 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003406}
3407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003408PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003409"getsockname() -> address info\n\
3410\n\
3411Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003412info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003413
Guido van Rossumc89705d1992-11-26 08:54:07 +00003414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003416/* s.getpeername() method */
3417
Guido van Rossum73624e91994-10-10 17:59:00 +00003418static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303419sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 sock_addr_t addrbuf;
3422 int res;
3423 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 if (!getsockaddrlen(s, &addrlen))
3426 return NULL;
3427 memset(&addrbuf, 0, addrlen);
3428 Py_BEGIN_ALLOW_THREADS
3429 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3430 Py_END_ALLOW_THREADS
3431 if (res < 0)
3432 return s->errorhandler();
3433 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3434 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003435}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003437PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003438"getpeername() -> address info\n\
3439\n\
3440Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003441info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003442
Guido van Rossumb6775db1994-08-01 11:34:53 +00003443#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003444
3445
Guido van Rossum30a685f1991-06-27 15:51:29 +00003446/* s.listen(n) method */
3447
Guido van Rossum73624e91994-10-10 17:59:00 +00003448static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003449sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003450{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003451 /* We try to choose a default backlog high enough to avoid connection drops
3452 * for common workloads, yet not too high to limit resource usage. */
3453 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003455
Charles-François Natali644b8f52014-05-22 19:45:39 +01003456 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003460 /* To avoid problems on systems that don't allow a negative backlog
3461 * (which doesn't make sense anyway) we force a minimum value of 0. */
3462 if (backlog < 0)
3463 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 res = listen(s->sock_fd, backlog);
3465 Py_END_ALLOW_THREADS
3466 if (res < 0)
3467 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003468 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003469}
3470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003471PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003472"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003473\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003474Enable a server to accept connections. If backlog is specified, it must be\n\
3475at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003476unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003477connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003478
Victor Stinner31bf2d52015-04-01 21:57:09 +02003479struct sock_recv {
3480 char *cbuf;
3481 Py_ssize_t len;
3482 int flags;
3483 Py_ssize_t result;
3484};
3485
3486static int
3487sock_recv_impl(PySocketSockObject *s, void *data)
3488{
3489 struct sock_recv *ctx = data;
3490
3491#ifdef MS_WINDOWS
3492 if (ctx->len > INT_MAX)
3493 ctx->len = INT_MAX;
3494 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3495#else
3496 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3497#endif
3498 return (ctx->result >= 0);
3499}
3500
Guido van Rossum82a5c661998-07-07 20:45:43 +00003501
Thomas Wouters477c8d52006-05-27 19:21:47 +00003502/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003503 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003504 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003505 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003506 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003507 * also possible that we return a number of bytes smaller than the request
3508 * bytes.
3509 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003510
Antoine Pitrou19467d22010-08-17 19:33:30 +00003511static Py_ssize_t
3512sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003513{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003514 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 if (!IS_SELECTABLE(s)) {
3517 select_error();
3518 return -1;
3519 }
3520 if (len == 0) {
3521 /* If 0 bytes were requested, do nothing. */
3522 return 0;
3523 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003524
Victor Stinner31bf2d52015-04-01 21:57:09 +02003525 ctx.cbuf = cbuf;
3526 ctx.len = len;
3527 ctx.flags = flags;
3528 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003530
3531 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003532}
3533
Guido van Rossum48a680c2001-03-02 06:34:14 +00003534
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003535/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003536
Guido van Rossum73624e91994-10-10 17:59:00 +00003537static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003538sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003539{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003540 Py_ssize_t recvlen, outlen;
3541 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003543
Antoine Pitrou19467d22010-08-17 19:33:30 +00003544 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 if (recvlen < 0) {
3548 PyErr_SetString(PyExc_ValueError,
3549 "negative buffersize in recv");
3550 return NULL;
3551 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 /* Allocate a new string. */
3554 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3555 if (buf == NULL)
3556 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 /* Call the guts */
3559 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3560 if (outlen < 0) {
3561 /* An error occurred, release the string and return an
3562 error. */
3563 Py_DECREF(buf);
3564 return NULL;
3565 }
3566 if (outlen != recvlen) {
3567 /* We did not read as many bytes as we anticipated, resize the
3568 string if possible and be successful. */
3569 _PyBytes_Resize(&buf, outlen);
3570 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003573}
3574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003575PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003576"recv(buffersize[, flags]) -> data\n\
3577\n\
3578Receive up to buffersize bytes from the socket. For the optional flags\n\
3579argument, see the Unix manual. When no data is available, block until\n\
3580at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003581the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003582
Guido van Rossum30a685f1991-06-27 15:51:29 +00003583
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003584/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003585
Thomas Wouters477c8d52006-05-27 19:21:47 +00003586static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003587sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003590
Antoine Pitrou19467d22010-08-17 19:33:30 +00003591 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 Py_buffer pbuf;
3593 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003594 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003597 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 &pbuf, &recvlen, &flags))
3599 return NULL;
3600 buf = pbuf.buf;
3601 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 if (recvlen < 0) {
3604 PyBuffer_Release(&pbuf);
3605 PyErr_SetString(PyExc_ValueError,
3606 "negative buffersize in recv_into");
3607 return NULL;
3608 }
3609 if (recvlen == 0) {
3610 /* If nbytes was not specified, use the buffer's length */
3611 recvlen = buflen;
3612 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 /* Check if the buffer is large enough */
3615 if (buflen < recvlen) {
3616 PyBuffer_Release(&pbuf);
3617 PyErr_SetString(PyExc_ValueError,
3618 "buffer too small for requested bytes");
3619 return NULL;
3620 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 /* Call the guts */
3623 readlen = sock_recv_guts(s, buf, recvlen, flags);
3624 if (readlen < 0) {
3625 /* Return an error. */
3626 PyBuffer_Release(&pbuf);
3627 return NULL;
3628 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 PyBuffer_Release(&pbuf);
3631 /* Return the number of bytes read. Note that we do not do anything
3632 special here in the case that readlen < recvlen. */
3633 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003634}
3635
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003636PyDoc_STRVAR(recv_into_doc,
3637"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003638\n\
oldkaa0735f2018-02-02 16:52:55 +08003639A version of recv() that stores its data into a buffer rather than creating\n\
3640a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003641is not specified (or 0), receive up to the size available in the given buffer.\n\
3642\n\
3643See recv() for documentation about the flags.");
3644
Victor Stinner31bf2d52015-04-01 21:57:09 +02003645struct sock_recvfrom {
3646 char* cbuf;
3647 Py_ssize_t len;
3648 int flags;
3649 socklen_t *addrlen;
3650 sock_addr_t *addrbuf;
3651 Py_ssize_t result;
3652};
3653
3654static int
3655sock_recvfrom_impl(PySocketSockObject *s, void *data)
3656{
3657 struct sock_recvfrom *ctx = data;
3658
3659 memset(ctx->addrbuf, 0, *ctx->addrlen);
3660
3661#ifdef MS_WINDOWS
3662 if (ctx->len > INT_MAX)
3663 ctx->len = INT_MAX;
3664 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3665 SAS2SA(ctx->addrbuf), ctx->addrlen);
3666#else
3667 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3668 SAS2SA(ctx->addrbuf), ctx->addrlen);
3669#endif
3670 return (ctx->result >= 0);
3671}
3672
Thomas Wouters477c8d52006-05-27 19:21:47 +00003673
3674/*
Christian Heimes99170a52007-12-19 02:07:34 +00003675 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3676 * into a char buffer. If you have any inc/def ref to do to the objects that
3677 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003678 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003679 * that it is also possible that we return a number of bytes smaller than the
3680 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003681 *
3682 * 'addr' is a return value for the address object. Note that you must decref
3683 * it yourself.
3684 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003685static Py_ssize_t
3686sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003690 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003691 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 if (!getsockaddrlen(s, &addrlen))
3696 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 if (!IS_SELECTABLE(s)) {
3699 select_error();
3700 return -1;
3701 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003702
Victor Stinner31bf2d52015-04-01 21:57:09 +02003703 ctx.cbuf = cbuf;
3704 ctx.len = len;
3705 ctx.flags = flags;
3706 ctx.addrbuf = &addrbuf;
3707 ctx.addrlen = &addrlen;
3708 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003710
Victor Stinner31bf2d52015-04-01 21:57:09 +02003711 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3712 s->sock_proto);
3713 if (*addr == NULL)
3714 return -1;
3715
3716 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003717}
3718
3719/* s.recvfrom(nbytes [,flags]) method */
3720
3721static PyObject *
3722sock_recvfrom(PySocketSockObject *s, PyObject *args)
3723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 PyObject *buf = NULL;
3725 PyObject *addr = NULL;
3726 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003727 int flags = 0;
3728 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003729
Antoine Pitrou19467d22010-08-17 19:33:30 +00003730 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 if (recvlen < 0) {
3734 PyErr_SetString(PyExc_ValueError,
3735 "negative buffersize in recvfrom");
3736 return NULL;
3737 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3740 if (buf == NULL)
3741 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3744 recvlen, flags, &addr);
3745 if (outlen < 0) {
3746 goto finally;
3747 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 if (outlen != recvlen) {
3750 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003751 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003753 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 goto finally;
3755 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003758
3759finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 Py_XDECREF(buf);
3761 Py_XDECREF(addr);
3762 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003763}
3764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003765PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003766"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3767\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003768Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003769
Thomas Wouters477c8d52006-05-27 19:21:47 +00003770
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003771/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003772
3773static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003774sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003777
Antoine Pitrou19467d22010-08-17 19:33:30 +00003778 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 Py_buffer pbuf;
3780 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003781 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003784
Antoine Pitrou19467d22010-08-17 19:33:30 +00003785 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 kwlist, &pbuf,
3787 &recvlen, &flags))
3788 return NULL;
3789 buf = pbuf.buf;
3790 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 if (recvlen < 0) {
3793 PyBuffer_Release(&pbuf);
3794 PyErr_SetString(PyExc_ValueError,
3795 "negative buffersize in recvfrom_into");
3796 return NULL;
3797 }
3798 if (recvlen == 0) {
3799 /* If nbytes was not specified, use the buffer's length */
3800 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003801 } else if (recvlen > buflen) {
3802 PyBuffer_Release(&pbuf);
3803 PyErr_SetString(PyExc_ValueError,
3804 "nbytes is greater than the length of the buffer");
3805 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3809 if (readlen < 0) {
3810 PyBuffer_Release(&pbuf);
3811 /* Return an error */
3812 Py_XDECREF(addr);
3813 return NULL;
3814 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 PyBuffer_Release(&pbuf);
3817 /* Return the number of bytes read and the address. Note that we do
3818 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003819 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003820}
3821
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003822PyDoc_STRVAR(recvfrom_into_doc,
3823"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003824\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003825Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003826
Victor Stinner35bee932015-04-02 12:28:07 +02003827/* The sendmsg() and recvmsg[_into]() methods require a working
3828 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3829#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003830struct sock_recvmsg {
3831 struct msghdr *msg;
3832 int flags;
3833 ssize_t result;
3834};
3835
3836static int
3837sock_recvmsg_impl(PySocketSockObject *s, void *data)
3838{
3839 struct sock_recvmsg *ctx = data;
3840
3841 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3842 return (ctx->result >= 0);
3843}
3844
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003845/*
3846 * Call recvmsg() with the supplied iovec structures, flags, and
3847 * ancillary data buffer size (controllen). Returns the tuple return
3848 * value for recvmsg() or recvmsg_into(), with the first item provided
3849 * by the supplied makeval() function. makeval() will be called with
3850 * the length read and makeval_data as arguments, and must return a
3851 * new reference (which will be decrefed if there is a subsequent
3852 * error). On error, closes any file descriptors received via
3853 * SCM_RIGHTS.
3854 */
3855static PyObject *
3856sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3857 int flags, Py_ssize_t controllen,
3858 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3859{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003860 sock_addr_t addrbuf;
3861 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003862 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003863 PyObject *cmsg_list = NULL, *retval = NULL;
3864 void *controlbuf = NULL;
3865 struct cmsghdr *cmsgh;
3866 size_t cmsgdatalen = 0;
3867 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003868 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003869
3870 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3871 ignored" when the socket is connected (Linux fills them in
3872 anyway for AF_UNIX sockets at least). Normally msg_namelen
3873 seems to be set to 0 if there's no address, but try to
3874 initialize msg_name to something that won't be mistaken for a
3875 real address if that doesn't happen. */
3876 if (!getsockaddrlen(s, &addrbuflen))
3877 return NULL;
3878 memset(&addrbuf, 0, addrbuflen);
3879 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3880
3881 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3882 PyErr_SetString(PyExc_ValueError,
3883 "invalid ancillary data buffer length");
3884 return NULL;
3885 }
3886 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3887 return PyErr_NoMemory();
3888
3889 /* Make the system call. */
3890 if (!IS_SELECTABLE(s)) {
3891 select_error();
3892 goto finally;
3893 }
3894
Victor Stinner31bf2d52015-04-01 21:57:09 +02003895 msg.msg_name = SAS2SA(&addrbuf);
3896 msg.msg_namelen = addrbuflen;
3897 msg.msg_iov = iov;
3898 msg.msg_iovlen = iovlen;
3899 msg.msg_control = controlbuf;
3900 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003901
Victor Stinner31bf2d52015-04-01 21:57:09 +02003902 ctx.msg = &msg;
3903 ctx.flags = flags;
3904 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003905 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003906
3907 /* Make list of (level, type, data) tuples from control messages. */
3908 if ((cmsg_list = PyList_New(0)) == NULL)
3909 goto err_closefds;
3910 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3911 implementations didn't do so. */
3912 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3913 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3914 PyObject *bytes, *tuple;
3915 int tmp;
3916
3917 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3918 if (cmsg_status != 0) {
3919 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3920 "received malformed or improperly-truncated "
3921 "ancillary data", 1) == -1)
3922 goto err_closefds;
3923 }
3924 if (cmsg_status < 0)
3925 break;
3926 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003927 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003928 goto err_closefds;
3929 }
3930
3931 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3932 cmsgdatalen);
3933 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3934 (int)cmsgh->cmsg_type, bytes);
3935 if (tuple == NULL)
3936 goto err_closefds;
3937 tmp = PyList_Append(cmsg_list, tuple);
3938 Py_DECREF(tuple);
3939 if (tmp != 0)
3940 goto err_closefds;
3941
3942 if (cmsg_status != 0)
3943 break;
3944 }
3945
3946 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003947 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003948 cmsg_list,
3949 (int)msg.msg_flags,
3950 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3951 ((msg.msg_namelen > addrbuflen) ?
3952 addrbuflen : msg.msg_namelen),
3953 s->sock_proto));
3954 if (retval == NULL)
3955 goto err_closefds;
3956
3957finally:
3958 Py_XDECREF(cmsg_list);
3959 PyMem_Free(controlbuf);
3960 return retval;
3961
3962err_closefds:
3963#ifdef SCM_RIGHTS
3964 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3965 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3966 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3967 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3968 if (cmsg_status < 0)
3969 break;
3970 if (cmsgh->cmsg_level == SOL_SOCKET &&
3971 cmsgh->cmsg_type == SCM_RIGHTS) {
3972 size_t numfds;
3973 int *fdp;
3974
3975 numfds = cmsgdatalen / sizeof(int);
3976 fdp = (int *)CMSG_DATA(cmsgh);
3977 while (numfds-- > 0)
3978 close(*fdp++);
3979 }
3980 if (cmsg_status != 0)
3981 break;
3982 }
3983#endif /* SCM_RIGHTS */
3984 goto finally;
3985}
3986
3987
3988static PyObject *
3989makeval_recvmsg(ssize_t received, void *data)
3990{
3991 PyObject **buf = data;
3992
3993 if (received < PyBytes_GET_SIZE(*buf))
3994 _PyBytes_Resize(buf, received);
3995 Py_XINCREF(*buf);
3996 return *buf;
3997}
3998
3999/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
4000
4001static PyObject *
4002sock_recvmsg(PySocketSockObject *s, PyObject *args)
4003{
4004 Py_ssize_t bufsize, ancbufsize = 0;
4005 int flags = 0;
4006 struct iovec iov;
4007 PyObject *buf = NULL, *retval = NULL;
4008
4009 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
4010 return NULL;
4011
4012 if (bufsize < 0) {
4013 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
4014 return NULL;
4015 }
4016 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
4017 return NULL;
4018 iov.iov_base = PyBytes_AS_STRING(buf);
4019 iov.iov_len = bufsize;
4020
4021 /* Note that we're passing a pointer to *our pointer* to the bytes
4022 object here (&buf); makeval_recvmsg() may incref the object, or
4023 deallocate it and set our pointer to NULL. */
4024 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
4025 &makeval_recvmsg, &buf);
4026 Py_XDECREF(buf);
4027 return retval;
4028}
4029
4030PyDoc_STRVAR(recvmsg_doc,
4031"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
4032\n\
4033Receive normal data (up to bufsize bytes) and ancillary data from the\n\
4034socket. The ancbufsize argument sets the size in bytes of the\n\
4035internal buffer used to receive the ancillary data; it defaults to 0,\n\
4036meaning that no ancillary data will be received. Appropriate buffer\n\
4037sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
4038CMSG_LEN(), and items which do not fit into the buffer might be\n\
4039truncated or discarded. The flags argument defaults to 0 and has the\n\
4040same meaning as for recv().\n\
4041\n\
4042The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
4043The data item is a bytes object holding the non-ancillary data\n\
4044received. The ancdata item is a list of zero or more tuples\n\
4045(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
4046(control messages) received: cmsg_level and cmsg_type are integers\n\
4047specifying the protocol level and protocol-specific type respectively,\n\
4048and cmsg_data is a bytes object holding the associated data. The\n\
4049msg_flags item is the bitwise OR of various flags indicating\n\
4050conditions on the received message; see your system documentation for\n\
4051details. If the receiving socket is unconnected, address is the\n\
4052address of the sending socket, if available; otherwise, its value is\n\
4053unspecified.\n\
4054\n\
4055If recvmsg() raises an exception after the system call returns, it\n\
4056will first attempt to close any file descriptors received via the\n\
4057SCM_RIGHTS mechanism.");
4058
4059
4060static PyObject *
4061makeval_recvmsg_into(ssize_t received, void *data)
4062{
4063 return PyLong_FromSsize_t(received);
4064}
4065
4066/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
4067
4068static PyObject *
4069sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
4070{
4071 Py_ssize_t ancbufsize = 0;
4072 int flags = 0;
4073 struct iovec *iovs = NULL;
4074 Py_ssize_t i, nitems, nbufs = 0;
4075 Py_buffer *bufs = NULL;
4076 PyObject *buffers_arg, *fast, *retval = NULL;
4077
4078 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
4079 &buffers_arg, &ancbufsize, &flags))
4080 return NULL;
4081
4082 if ((fast = PySequence_Fast(buffers_arg,
4083 "recvmsg_into() argument 1 must be an "
4084 "iterable")) == NULL)
4085 return NULL;
4086 nitems = PySequence_Fast_GET_SIZE(fast);
4087 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004088 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 goto finally;
4090 }
4091
4092 /* Fill in an iovec for each item, and save the Py_buffer
4093 structs to release afterwards. */
4094 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4095 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4096 PyErr_NoMemory();
4097 goto finally;
4098 }
4099 for (; nbufs < nitems; nbufs++) {
4100 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4101 "w*;recvmsg_into() argument 1 must be an iterable "
4102 "of single-segment read-write buffers",
4103 &bufs[nbufs]))
4104 goto finally;
4105 iovs[nbufs].iov_base = bufs[nbufs].buf;
4106 iovs[nbufs].iov_len = bufs[nbufs].len;
4107 }
4108
4109 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4110 &makeval_recvmsg_into, NULL);
4111finally:
4112 for (i = 0; i < nbufs; i++)
4113 PyBuffer_Release(&bufs[i]);
4114 PyMem_Free(bufs);
4115 PyMem_Free(iovs);
4116 Py_DECREF(fast);
4117 return retval;
4118}
4119
4120PyDoc_STRVAR(recvmsg_into_doc,
4121"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4122\n\
4123Receive normal data and ancillary data from the socket, scattering the\n\
4124non-ancillary data into a series of buffers. The buffers argument\n\
4125must be an iterable of objects that export writable buffers\n\
4126(e.g. bytearray objects); these will be filled with successive chunks\n\
4127of the non-ancillary data until it has all been written or there are\n\
4128no more buffers. The ancbufsize argument sets the size in bytes of\n\
4129the internal buffer used to receive the ancillary data; it defaults to\n\
41300, meaning that no ancillary data will be received. Appropriate\n\
4131buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4132or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4133truncated or discarded. The flags argument defaults to 0 and has the\n\
4134same meaning as for recv().\n\
4135\n\
4136The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4137The nbytes item is the total number of bytes of non-ancillary data\n\
4138written into the buffers. The ancdata item is a list of zero or more\n\
4139tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4140data (control messages) received: cmsg_level and cmsg_type are\n\
4141integers specifying the protocol level and protocol-specific type\n\
4142respectively, and cmsg_data is a bytes object holding the associated\n\
4143data. The msg_flags item is the bitwise OR of various flags\n\
4144indicating conditions on the received message; see your system\n\
4145documentation for details. If the receiving socket is unconnected,\n\
4146address is the address of the sending socket, if available; otherwise,\n\
4147its value is unspecified.\n\
4148\n\
4149If recvmsg_into() raises an exception after the system call returns,\n\
4150it will first attempt to close any file descriptors received via the\n\
4151SCM_RIGHTS mechanism.");
4152#endif /* CMSG_LEN */
4153
4154
Victor Stinner31bf2d52015-04-01 21:57:09 +02004155struct sock_send {
4156 char *buf;
4157 Py_ssize_t len;
4158 int flags;
4159 Py_ssize_t result;
4160};
4161
4162static int
4163sock_send_impl(PySocketSockObject *s, void *data)
4164{
4165 struct sock_send *ctx = data;
4166
4167#ifdef MS_WINDOWS
4168 if (ctx->len > INT_MAX)
4169 ctx->len = INT_MAX;
4170 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4171#else
4172 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4173#endif
4174 return (ctx->result >= 0);
4175}
4176
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004177/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004178
Guido van Rossum73624e91994-10-10 17:59:00 +00004179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004180sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004181{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004182 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004184 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4187 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 if (!IS_SELECTABLE(s)) {
4190 PyBuffer_Release(&pbuf);
4191 return select_error();
4192 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004193 ctx.buf = pbuf.buf;
4194 ctx.len = pbuf.len;
4195 ctx.flags = flags;
4196 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004197 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 return NULL;
4199 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004200 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004201
4202 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004203}
4204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004205PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004206"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004207\n\
4208Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004209argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004210sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004211
4212
4213/* s.sendall(data [,flags]) method */
4214
4215static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004216sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004218 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004219 Py_ssize_t len, n;
4220 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004222 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004223 int has_timeout = (s->sock_timeout > 0);
4224 _PyTime_t interval = s->sock_timeout;
4225 _PyTime_t deadline = 0;
4226 int deadline_initialized = 0;
4227 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4230 return NULL;
4231 buf = pbuf.buf;
4232 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 if (!IS_SELECTABLE(s)) {
4235 PyBuffer_Release(&pbuf);
4236 return select_error();
4237 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004240 if (has_timeout) {
4241 if (deadline_initialized) {
4242 /* recompute the timeout */
4243 interval = deadline - _PyTime_GetMonotonicClock();
4244 }
4245 else {
4246 deadline_initialized = 1;
4247 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4248 }
4249
4250 if (interval <= 0) {
4251 PyErr_SetString(socket_timeout, "timed out");
4252 goto done;
4253 }
4254 }
4255
Victor Stinner02f32ab2015-04-01 22:53:26 +02004256 ctx.buf = buf;
4257 ctx.len = len;
4258 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004259 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4260 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004261 n = ctx.result;
4262 assert(n >= 0);
4263
4264 buf += n;
4265 len -= n;
4266
4267 /* We must run our signal handlers before looping again.
4268 send() can return a successful partial write when it is
4269 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004270 if (PyErr_CheckSignals())
4271 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004272 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004274
Victor Stinner8912d142015-04-06 23:16:34 +02004275 Py_INCREF(Py_None);
4276 res = Py_None;
4277
4278done:
4279 PyBuffer_Release(&pbuf);
4280 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004281}
4282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004283PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004284"sendall(data[, flags])\n\
4285\n\
4286Send a data string to the socket. For the optional flags\n\
4287argument, see the Unix manual. This calls send() repeatedly\n\
4288until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004289to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004290
Guido van Rossum30a685f1991-06-27 15:51:29 +00004291
Victor Stinner31bf2d52015-04-01 21:57:09 +02004292struct sock_sendto {
4293 char *buf;
4294 Py_ssize_t len;
4295 int flags;
4296 int addrlen;
4297 sock_addr_t *addrbuf;
4298 Py_ssize_t result;
4299};
4300
4301static int
4302sock_sendto_impl(PySocketSockObject *s, void *data)
4303{
4304 struct sock_sendto *ctx = data;
4305
4306#ifdef MS_WINDOWS
4307 if (ctx->len > INT_MAX)
4308 ctx->len = INT_MAX;
4309 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4310 SAS2SA(ctx->addrbuf), ctx->addrlen);
4311#else
4312 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4313 SAS2SA(ctx->addrbuf), ctx->addrlen);
4314#endif
4315 return (ctx->result >= 0);
4316}
4317
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004318/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004319
Guido van Rossum73624e91994-10-10 17:59:00 +00004320static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004321sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 Py_buffer pbuf;
4324 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004325 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004327 int addrlen, flags;
4328 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004331 arglen = PyTuple_Size(args);
4332 switch (arglen) {
4333 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004334 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4335 return NULL;
4336 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004337 break;
4338 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004339 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4340 &pbuf, &flags, &addro)) {
4341 return NULL;
4342 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004343 break;
4344 default:
4345 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004346 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004347 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004348 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 if (!IS_SELECTABLE(s)) {
4352 PyBuffer_Release(&pbuf);
4353 return select_error();
4354 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004355
Victor Stinnerd565fb92019-10-10 21:30:20 +02004356 if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004357 PyBuffer_Release(&pbuf);
4358 return NULL;
4359 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004360
Steve Dowerb82e17e2019-05-23 08:45:22 -07004361 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4362 return NULL;
4363 }
4364
Victor Stinner31bf2d52015-04-01 21:57:09 +02004365 ctx.buf = pbuf.buf;
4366 ctx.len = pbuf.len;
4367 ctx.flags = flags;
4368 ctx.addrlen = addrlen;
4369 ctx.addrbuf = &addrbuf;
4370 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004371 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 return NULL;
4373 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004374 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004375
4376 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004377}
4378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004379PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004380"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004381\n\
4382Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004383For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004384
Guido van Rossum30a685f1991-06-27 15:51:29 +00004385
Victor Stinner35bee932015-04-02 12:28:07 +02004386/* The sendmsg() and recvmsg[_into]() methods require a working
4387 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4388#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004389struct sock_sendmsg {
4390 struct msghdr *msg;
4391 int flags;
4392 ssize_t result;
4393};
4394
4395static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004396sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4397 struct msghdr *msg,
4398 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4399 Py_ssize_t ndataparts, ndatabufs = 0;
4400 int result = -1;
4401 struct iovec *iovs = NULL;
4402 PyObject *data_fast = NULL;
4403 Py_buffer *databufs = NULL;
4404
4405 /* Fill in an iovec for each message part, and save the Py_buffer
4406 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004407 data_fast = PySequence_Fast(data_arg,
4408 "sendmsg() argument 1 must be an "
4409 "iterable");
4410 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004411 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004412 }
4413
Christian Heimesdffa3942016-09-05 23:54:41 +02004414 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4415 if (ndataparts > INT_MAX) {
4416 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4417 goto finally;
4418 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004419
Christian Heimesdffa3942016-09-05 23:54:41 +02004420 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004421 if (ndataparts > 0) {
4422 iovs = PyMem_New(struct iovec, ndataparts);
4423 if (iovs == NULL) {
4424 PyErr_NoMemory();
4425 goto finally;
4426 }
4427 msg->msg_iov = iovs;
4428
4429 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004430 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004431 PyErr_NoMemory();
4432 goto finally;
4433 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004434 }
4435 for (; ndatabufs < ndataparts; ndatabufs++) {
4436 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4437 "y*;sendmsg() argument 1 must be an iterable of "
4438 "bytes-like objects",
4439 &databufs[ndatabufs]))
4440 goto finally;
4441 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4442 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4443 }
4444 result = 0;
4445 finally:
4446 *databufsout = databufs;
4447 *ndatabufsout = ndatabufs;
4448 Py_XDECREF(data_fast);
4449 return result;
4450}
4451
4452static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004453sock_sendmsg_impl(PySocketSockObject *s, void *data)
4454{
4455 struct sock_sendmsg *ctx = data;
4456
4457 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4458 return (ctx->result >= 0);
4459}
4460
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004461/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4462
4463static PyObject *
4464sock_sendmsg(PySocketSockObject *s, PyObject *args)
4465{
Christian Heimesdffa3942016-09-05 23:54:41 +02004466 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004467 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004468 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004469 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004470 struct cmsginfo {
4471 int level;
4472 int type;
4473 Py_buffer data;
4474 } *cmsgs = NULL;
4475 void *controlbuf = NULL;
4476 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004477 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004478 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004479 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004480 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004481
4482 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004483 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004484 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004485 }
4486
4487 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004488
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004489 /* Parse destination address. */
4490 if (addr_arg != NULL && addr_arg != Py_None) {
Victor Stinnerd565fb92019-10-10 21:30:20 +02004491 if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
Oren Milman735171e2018-09-11 19:51:29 +03004492 "sendmsg"))
4493 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004494 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004495 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004496 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4497 return NULL;
4498 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004499 msg.msg_name = &addrbuf;
4500 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004501 } else {
4502 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4503 return NULL;
4504 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004505 }
4506
4507 /* Fill in an iovec for each message part, and save the Py_buffer
4508 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004509 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004510 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004511 }
4512
4513 if (cmsg_arg == NULL)
4514 ncmsgs = 0;
4515 else {
4516 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4517 "sendmsg() argument 2 must be an "
4518 "iterable")) == NULL)
4519 goto finally;
4520 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4521 }
4522
4523#ifndef CMSG_SPACE
4524 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004525 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004526 "sending multiple control messages is not supported "
4527 "on this system");
4528 goto finally;
4529 }
4530#endif
4531 /* Save level, type and Py_buffer for each control message,
4532 and calculate total size. */
4533 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4534 PyErr_NoMemory();
4535 goto finally;
4536 }
4537 controllen = controllen_last = 0;
4538 while (ncmsgbufs < ncmsgs) {
4539 size_t bufsize, space;
4540
4541 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4542 "(iiy*):[sendmsg() ancillary data items]",
4543 &cmsgs[ncmsgbufs].level,
4544 &cmsgs[ncmsgbufs].type,
4545 &cmsgs[ncmsgbufs].data))
4546 goto finally;
4547 bufsize = cmsgs[ncmsgbufs++].data.len;
4548
4549#ifdef CMSG_SPACE
4550 if (!get_CMSG_SPACE(bufsize, &space)) {
4551#else
4552 if (!get_CMSG_LEN(bufsize, &space)) {
4553#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004554 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004555 goto finally;
4556 }
4557 controllen += space;
4558 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004559 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004560 goto finally;
4561 }
4562 controllen_last = controllen;
4563 }
4564
4565 /* Construct ancillary data block from control message info. */
4566 if (ncmsgbufs > 0) {
4567 struct cmsghdr *cmsgh = NULL;
4568
Victor Stinner52d61e42016-09-12 11:41:58 +02004569 controlbuf = PyMem_Malloc(controllen);
4570 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004571 PyErr_NoMemory();
4572 goto finally;
4573 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004574 msg.msg_control = controlbuf;
4575
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004576 msg.msg_controllen = controllen;
4577
4578 /* Need to zero out the buffer as a workaround for glibc's
4579 CMSG_NXTHDR() implementation. After getting the pointer to
4580 the next header, it checks its (uninitialized) cmsg_len
4581 member to see if the "message" fits in the buffer, and
4582 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004583 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004584 memset(controlbuf, 0, controllen);
4585
4586 for (i = 0; i < ncmsgbufs; i++) {
4587 size_t msg_len, data_len = cmsgs[i].data.len;
4588 int enough_space = 0;
4589
4590 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4591 if (cmsgh == NULL) {
4592 PyErr_Format(PyExc_RuntimeError,
4593 "unexpected NULL result from %s()",
4594 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4595 goto finally;
4596 }
4597 if (!get_CMSG_LEN(data_len, &msg_len)) {
4598 PyErr_SetString(PyExc_RuntimeError,
4599 "item size out of range for CMSG_LEN()");
4600 goto finally;
4601 }
4602 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4603 size_t space;
4604
4605 cmsgh->cmsg_len = msg_len;
4606 if (get_cmsg_data_space(&msg, cmsgh, &space))
4607 enough_space = (space >= data_len);
4608 }
4609 if (!enough_space) {
4610 PyErr_SetString(PyExc_RuntimeError,
4611 "ancillary data does not fit in calculated "
4612 "space");
4613 goto finally;
4614 }
4615 cmsgh->cmsg_level = cmsgs[i].level;
4616 cmsgh->cmsg_type = cmsgs[i].type;
4617 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4618 }
4619 }
4620
4621 /* Make the system call. */
4622 if (!IS_SELECTABLE(s)) {
4623 select_error();
4624 goto finally;
4625 }
4626
Victor Stinner31bf2d52015-04-01 21:57:09 +02004627 ctx.msg = &msg;
4628 ctx.flags = flags;
4629 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004630 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004631
4632 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004633
4634finally:
4635 PyMem_Free(controlbuf);
4636 for (i = 0; i < ncmsgbufs; i++)
4637 PyBuffer_Release(&cmsgs[i].data);
4638 PyMem_Free(cmsgs);
4639 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004640 PyMem_Free(msg.msg_iov);
4641 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004642 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004643 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004644 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004645 return retval;
4646}
4647
4648PyDoc_STRVAR(sendmsg_doc,
4649"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4650\n\
4651Send normal and ancillary data to the socket, gathering the\n\
4652non-ancillary data from a series of buffers and concatenating it into\n\
4653a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004654data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004655The ancdata argument specifies the ancillary data (control messages)\n\
4656as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4657cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4658protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004659is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004660argument defaults to 0 and has the same meaning as for send(). If\n\
4661address is supplied and not None, it sets a destination address for\n\
4662the message. The return value is the number of bytes of non-ancillary\n\
4663data sent.");
4664#endif /* CMSG_LEN */
4665
Christian Heimesdffa3942016-09-05 23:54:41 +02004666#ifdef HAVE_SOCKADDR_ALG
4667static PyObject*
4668sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4669{
4670 PyObject *retval = NULL;
4671
4672 Py_ssize_t i, ndatabufs = 0;
4673 Py_buffer *databufs = NULL;
4674 PyObject *data_arg = NULL;
4675
4676 Py_buffer iv = {NULL, NULL};
4677
4678 PyObject *opobj = NULL;
4679 int op = -1;
4680
4681 PyObject *assoclenobj = NULL;
4682 int assoclen = -1;
4683
4684 unsigned int *uiptr;
4685 int flags = 0;
4686
4687 struct msghdr msg;
4688 struct cmsghdr *header = NULL;
4689 struct af_alg_iv *alg_iv = NULL;
4690 struct sock_sendmsg ctx;
4691 Py_ssize_t controllen;
4692 void *controlbuf = NULL;
4693 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4694
4695 if (self->sock_family != AF_ALG) {
4696 PyErr_SetString(PyExc_OSError,
4697 "algset is only supported for AF_ALG");
4698 return NULL;
4699 }
4700
4701 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4702 "|O$O!y*O!i:sendmsg_afalg", keywords,
4703 &data_arg,
4704 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004705 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004706 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004707 }
4708
4709 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004710
4711 /* op is a required, keyword-only argument >= 0 */
4712 if (opobj != NULL) {
4713 op = _PyLong_AsInt(opobj);
4714 }
4715 if (op < 0) {
4716 /* override exception from _PyLong_AsInt() */
4717 PyErr_SetString(PyExc_TypeError,
4718 "Invalid or missing argument 'op'");
4719 goto finally;
4720 }
4721 /* assoclen is optional but must be >= 0 */
4722 if (assoclenobj != NULL) {
4723 assoclen = _PyLong_AsInt(assoclenobj);
4724 if (assoclen == -1 && PyErr_Occurred()) {
4725 goto finally;
4726 }
4727 if (assoclen < 0) {
4728 PyErr_SetString(PyExc_TypeError,
4729 "assoclen must be positive");
4730 goto finally;
4731 }
4732 }
4733
4734 controllen = CMSG_SPACE(4);
4735 if (iv.buf != NULL) {
4736 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4737 }
4738 if (assoclen >= 0) {
4739 controllen += CMSG_SPACE(4);
4740 }
4741
4742 controlbuf = PyMem_Malloc(controllen);
4743 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004744 PyErr_NoMemory();
4745 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004746 }
4747 memset(controlbuf, 0, controllen);
4748
Christian Heimesdffa3942016-09-05 23:54:41 +02004749 msg.msg_controllen = controllen;
4750 msg.msg_control = controlbuf;
4751
4752 /* Fill in an iovec for each message part, and save the Py_buffer
4753 structs to release afterwards. */
4754 if (data_arg != NULL) {
4755 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4756 goto finally;
4757 }
4758 }
4759
4760 /* set operation to encrypt or decrypt */
4761 header = CMSG_FIRSTHDR(&msg);
4762 if (header == NULL) {
4763 PyErr_SetString(PyExc_RuntimeError,
4764 "unexpected NULL result from CMSG_FIRSTHDR");
4765 goto finally;
4766 }
4767 header->cmsg_level = SOL_ALG;
4768 header->cmsg_type = ALG_SET_OP;
4769 header->cmsg_len = CMSG_LEN(4);
4770 uiptr = (void*)CMSG_DATA(header);
4771 *uiptr = (unsigned int)op;
4772
4773 /* set initialization vector */
4774 if (iv.buf != NULL) {
4775 header = CMSG_NXTHDR(&msg, header);
4776 if (header == NULL) {
4777 PyErr_SetString(PyExc_RuntimeError,
4778 "unexpected NULL result from CMSG_NXTHDR(iv)");
4779 goto finally;
4780 }
4781 header->cmsg_level = SOL_ALG;
4782 header->cmsg_type = ALG_SET_IV;
4783 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4784 alg_iv = (void*)CMSG_DATA(header);
4785 alg_iv->ivlen = iv.len;
4786 memcpy(alg_iv->iv, iv.buf, iv.len);
4787 }
4788
4789 /* set length of associated data for AEAD */
4790 if (assoclen >= 0) {
4791 header = CMSG_NXTHDR(&msg, header);
4792 if (header == NULL) {
4793 PyErr_SetString(PyExc_RuntimeError,
4794 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4795 goto finally;
4796 }
4797 header->cmsg_level = SOL_ALG;
4798 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4799 header->cmsg_len = CMSG_LEN(4);
4800 uiptr = (void*)CMSG_DATA(header);
4801 *uiptr = (unsigned int)assoclen;
4802 }
4803
4804 ctx.msg = &msg;
4805 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004806 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004807 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004808 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004809
4810 retval = PyLong_FromSsize_t(ctx.result);
4811
4812 finally:
4813 PyMem_Free(controlbuf);
4814 if (iv.buf != NULL) {
4815 PyBuffer_Release(&iv);
4816 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004817 PyMem_Free(msg.msg_iov);
4818 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004819 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004820 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004821 PyMem_Free(databufs);
4822 return retval;
4823}
4824
4825PyDoc_STRVAR(sendmsg_afalg_doc,
4826"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4827\n\
4828Set operation mode, IV and length of associated data for an AF_ALG\n\
4829operation socket.");
4830#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004831
Guido van Rossum30a685f1991-06-27 15:51:29 +00004832/* s.shutdown(how) method */
4833
Guido van Rossum73624e91994-10-10 17:59:00 +00004834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004835sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 int how;
4838 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004839
Serhiy Storchaka78980432013-01-15 01:12:17 +02004840 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 if (how == -1 && PyErr_Occurred())
4842 return NULL;
4843 Py_BEGIN_ALLOW_THREADS
4844 res = shutdown(s->sock_fd, how);
4845 Py_END_ALLOW_THREADS
4846 if (res < 0)
4847 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004848 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004849}
4850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004851PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004852"shutdown(flag)\n\
4853\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004854Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4855of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004856
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004857#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004858static PyObject*
4859sock_ioctl(PySocketSockObject *s, PyObject *arg)
4860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 unsigned long cmd = SIO_RCVALL;
4862 PyObject *argO;
4863 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4866 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 switch (cmd) {
4869 case SIO_RCVALL: {
4870 unsigned int option = RCVALL_ON;
4871 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4872 return NULL;
4873 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4874 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4875 return set_error();
4876 }
4877 return PyLong_FromUnsignedLong(recv); }
4878 case SIO_KEEPALIVE_VALS: {
4879 struct tcp_keepalive ka;
4880 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4881 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4882 return NULL;
4883 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4884 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4885 return set_error();
4886 }
4887 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004888#if defined(SIO_LOOPBACK_FAST_PATH)
4889 case SIO_LOOPBACK_FAST_PATH: {
4890 unsigned int option;
4891 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4892 return NULL;
4893 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4894 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4895 return set_error();
4896 }
4897 return PyLong_FromUnsignedLong(recv); }
4898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004900 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 return NULL;
4902 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004903}
4904PyDoc_STRVAR(sock_ioctl_doc,
4905"ioctl(cmd, option) -> long\n\
4906\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004907Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4908SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004909SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4910SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004911#endif
4912
4913#if defined(MS_WINDOWS)
4914static PyObject*
4915sock_share(PySocketSockObject *s, PyObject *arg)
4916{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004917 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004918 DWORD processId;
4919 int result;
4920
4921 if (!PyArg_ParseTuple(arg, "I", &processId))
4922 return NULL;
4923
4924 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004925 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004926 Py_END_ALLOW_THREADS
4927 if (result == SOCKET_ERROR)
4928 return set_error();
4929 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4930}
4931PyDoc_STRVAR(sock_share_doc,
4932"share(process_id) -> bytes\n\
4933\n\
4934Share the socket with another process. The target process id\n\
4935must be provided and the resulting bytes object passed to the target\n\
4936process. There the shared socket can be instantiated by calling\n\
4937socket.fromshare().");
4938
Christian Heimesfaf2f632008-01-06 16:59:19 +00004939
4940#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004941
4942/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004943
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4946 accept_doc},
4947 {"bind", (PyCFunction)sock_bind, METH_O,
4948 bind_doc},
4949 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004950 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 {"connect", (PyCFunction)sock_connect, METH_O,
4952 connect_doc},
4953 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4954 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004955 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4956 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4958 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004959#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 {"getpeername", (PyCFunction)sock_getpeername,
4961 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 {"getsockname", (PyCFunction)sock_getsockname,
4964 METH_NOARGS, getsockname_doc},
4965 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4966 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004967#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4969 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004970#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004971#if defined(MS_WINDOWS)
4972 {"share", (PyCFunction)sock_share, METH_VARARGS,
4973 sock_share_doc},
4974#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004975 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 listen_doc},
4977 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4978 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004979 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 recv_into_doc},
4981 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4982 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004983 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 recvfrom_into_doc},
4985 {"send", (PyCFunction)sock_send, METH_VARARGS,
4986 send_doc},
4987 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4988 sendall_doc},
4989 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4990 sendto_doc},
4991 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4992 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004993 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4994 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4996 settimeout_doc},
4997 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4998 gettimeout_doc},
4999 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
5000 setsockopt_doc},
5001 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
5002 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005003#ifdef CMSG_LEN
5004 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
5005 recvmsg_doc},
5006 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
5007 recvmsg_into_doc,},
5008 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
5009 sendmsg_doc},
5010#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02005011#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005012 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02005013 sendmsg_afalg_doc},
5014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005016};
5017
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005018/* SockObject members */
5019static PyMemberDef sock_memberlist[] = {
5020 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
5021 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
5022 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005023 {0},
5024};
Guido van Rossum30a685f1991-06-27 15:51:29 +00005025
Victor Stinner71694d52015-03-28 01:18:54 +01005026static PyGetSetDef sock_getsetlist[] = {
5027 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
5028 {NULL} /* sentinel */
5029};
5030
Guido van Rossum73624e91994-10-10 17:59:00 +00005031/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00005032 First close the file description. */
5033
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005034static void
Victor Stinner19a8e842016-03-21 16:36:48 +01005035sock_finalize(PySocketSockObject *s)
5036{
5037 SOCKET_T fd;
5038 PyObject *error_type, *error_value, *error_traceback;
5039
5040 /* Save the current exception, if any. */
5041 PyErr_Fetch(&error_type, &error_value, &error_traceback);
5042
Victor Stinnerd3afb622016-07-22 17:47:09 +02005043 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01005044 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
5045 /* Spurious errors can appear at shutdown */
5046 if (PyErr_ExceptionMatches(PyExc_Warning)) {
5047 PyErr_WriteUnraisable((PyObject *)s);
5048 }
5049 }
5050
5051 /* Only close the socket *after* logging the ResourceWarning warning
5052 to allow the logger to call socket methods like
5053 socket.getsockname(). If the socket is closed before, socket
5054 methods fails with the EBADF error. */
5055 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02005056 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01005057
5058 /* We do not want to retry upon EINTR: see sock_close() */
5059 Py_BEGIN_ALLOW_THREADS
5060 (void) SOCKETCLOSE(fd);
5061 Py_END_ALLOW_THREADS
5062 }
5063
5064 /* Restore the saved exception. */
5065 PyErr_Restore(error_type, error_value, error_traceback);
5066}
5067
5068static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005069sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005070{
Victor Stinner19a8e842016-03-21 16:36:48 +01005071 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
5072 return;
5073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005075}
5076
Guido van Rossum30a685f1991-06-27 15:51:29 +00005077
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005079sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005080{
Victor Stinnere254e532014-07-26 14:36:55 +02005081 long sock_fd;
5082 /* On Windows, this test is needed because SOCKET_T is unsigned */
5083 if (s->sock_fd == INVALID_SOCKET) {
5084 sock_fd = -1;
5085 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005086#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005087 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 /* this can occur on Win64, and actually there is a special
5089 ugly printf formatter for decimal pointer length integer
5090 printing, only bother if necessary*/
5091 PyErr_SetString(PyExc_OverflowError,
5092 "no printf formatter to display "
5093 "the socket descriptor in decimal");
5094 return NULL;
5095 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005096#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005097 else
5098 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 return PyUnicode_FromFormat(
5100 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005101 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 s->sock_type,
5103 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005104}
5105
5106
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005107/* Create a new, uninitialized socket object. */
5108
5109static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005110sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 new = type->tp_alloc(type, 0);
5115 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005116 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005117 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 ((PySocketSockObject *)new)->errorhandler = &set_error;
5119 }
5120 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005121}
5122
5123
5124/* Initialize a new socket object. */
5125
Victor Stinnerdaf45552013-08-28 00:53:59 +02005126#ifdef SOCK_CLOEXEC
5127/* socket() and socketpair() fail with EINVAL on Linux kernel older
5128 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5129static int sock_cloexec_works = -1;
5130#endif
5131
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005132/*ARGSUSED*/
5133static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005134sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 PySocketSockObject *s = (PySocketSockObject *)self;
5137 PyObject *fdobj = NULL;
5138 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005139 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005141#ifndef MS_WINDOWS
5142#ifdef SOCK_CLOEXEC
5143 int *atomic_flag_works = &sock_cloexec_works;
5144#else
5145 int *atomic_flag_works = NULL;
5146#endif
5147#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005149 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5150 "|iiiO:socket", keywords,
5151 &family, &type, &proto, &fdobj))
5152 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005153
Steve Dowerb82e17e2019-05-23 08:45:22 -07005154#ifdef MS_WINDOWS
5155 /* In this case, we don't use the family, type and proto args */
Steve Dower63ba5cc2020-03-31 12:38:53 +01005156 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005157#endif
5158 {
5159 if (PySys_Audit("socket.__new__", "Oiii",
5160 s, family, type, proto) < 0) {
5161 return -1;
5162 }
5163 }
5164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005166#ifdef MS_WINDOWS
5167 /* recreate a socket that was duplicated */
5168 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005169 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005170 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5171 PyErr_Format(PyExc_ValueError,
5172 "socket descriptor string has wrong size, "
5173 "should be %zu bytes.", sizeof(info));
5174 return -1;
5175 }
5176 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005177
Steve Dower63ba5cc2020-03-31 12:38:53 +01005178 if (PySys_Audit("socket.__new__", "Oiii", s,
5179 info.iAddressFamily, info.iSocketType,
5180 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005181 return -1;
5182 }
5183
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005184 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005185 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005186 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5187 Py_END_ALLOW_THREADS
5188 if (fd == INVALID_SOCKET) {
5189 set_error();
5190 return -1;
5191 }
5192 family = info.iAddressFamily;
5193 type = info.iSocketType;
5194 proto = info.iProtocol;
5195 }
5196 else
5197#endif
5198 {
Dima Tisneke9912702018-12-17 22:07:55 +09005199
5200 if (PyFloat_Check(fdobj)) {
5201 PyErr_SetString(PyExc_TypeError,
5202 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005203 return -1;
5204 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005205
Dima Tisneke9912702018-12-17 22:07:55 +09005206 fd = PyLong_AsSocket_t(fdobj);
5207 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5208 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005209#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005210 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005211#else
Dima Tisneke9912702018-12-17 22:07:55 +09005212 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005213#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005214 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5215 return -1;
5216 }
5217
5218 /* validate that passed file descriptor is valid and a socket. */
5219 sock_addr_t addrbuf;
5220 socklen_t addrlen = sizeof(sock_addr_t);
5221
5222 memset(&addrbuf, 0, addrlen);
5223 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5224 if (family == -1) {
5225 family = SAS2SA(&addrbuf)->sa_family;
5226 }
5227 } else {
5228#ifdef MS_WINDOWS
5229 /* getsockname() on an unbound socket is an error on Windows.
5230 Invalid descriptor and not a socket is same error code.
5231 Error out if family must be resolved, or bad descriptor. */
5232 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5233#else
5234 /* getsockname() is not supported for SOL_ALG on Linux. */
5235 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5236#endif
5237 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005238 return -1;
5239 }
5240 }
5241#ifdef SO_TYPE
5242 if (type == -1) {
5243 int tmp;
5244 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005245 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5246 (void *)&tmp, &slen) == 0)
5247 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005248 type = tmp;
5249 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005250 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005251 return -1;
5252 }
5253 }
5254#else
5255 type = SOCK_STREAM;
5256#endif
5257#ifdef SO_PROTOCOL
5258 if (proto == -1) {
5259 int tmp;
5260 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005261 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5262 (void *)&tmp, &slen) == 0)
5263 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005264 proto = tmp;
5265 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005266 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005267 return -1;
5268 }
5269 }
5270#else
5271 proto = 0;
5272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 }
5274 }
5275 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005276 /* No fd, default to AF_INET and SOCK_STREAM */
5277 if (family == -1) {
5278 family = AF_INET;
5279 }
5280 if (type == -1) {
5281 type = SOCK_STREAM;
5282 }
5283 if (proto == -1) {
5284 proto = 0;
5285 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005286#ifdef MS_WINDOWS
5287 /* Windows implementation */
5288#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5289#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5290#endif
5291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005293 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005294 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005295 NULL, 0,
5296 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5297 if (fd == INVALID_SOCKET) {
5298 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5299 support_wsa_no_inherit = 0;
5300 fd = socket(family, type, proto);
5301 }
5302 }
5303 else {
5304 fd = socket(family, type, proto);
5305 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 if (fd == INVALID_SOCKET) {
5309 set_error();
5310 return -1;
5311 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005312
5313 if (!support_wsa_no_inherit) {
5314 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5315 closesocket(fd);
5316 PyErr_SetFromWindowsErr(0);
5317 return -1;
5318 }
5319 }
5320#else
5321 /* UNIX */
5322 Py_BEGIN_ALLOW_THREADS
5323#ifdef SOCK_CLOEXEC
5324 if (sock_cloexec_works != 0) {
5325 fd = socket(family, type | SOCK_CLOEXEC, proto);
5326 if (sock_cloexec_works == -1) {
5327 if (fd >= 0) {
5328 sock_cloexec_works = 1;
5329 }
5330 else if (errno == EINVAL) {
5331 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5332 sock_cloexec_works = 0;
5333 fd = socket(family, type, proto);
5334 }
5335 }
5336 }
5337 else
5338#endif
5339 {
5340 fd = socket(family, type, proto);
5341 }
5342 Py_END_ALLOW_THREADS
5343
5344 if (fd == INVALID_SOCKET) {
5345 set_error();
5346 return -1;
5347 }
5348
5349 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5350 SOCKETCLOSE(fd);
5351 return -1;
5352 }
5353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005355 if (init_sockobject(s, fd, family, type, proto) == -1) {
5356 SOCKETCLOSE(fd);
5357 return -1;
5358 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005361
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005362}
5363
5364
Guido van Rossumb6775db1994-08-01 11:34:53 +00005365/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005366
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005367static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5369 "_socket.socket", /* tp_name */
5370 sizeof(PySocketSockObject), /* tp_basicsize */
5371 0, /* tp_itemsize */
5372 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005373 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 0, /* tp_getattr */
5375 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005376 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 (reprfunc)sock_repr, /* tp_repr */
5378 0, /* tp_as_number */
5379 0, /* tp_as_sequence */
5380 0, /* tp_as_mapping */
5381 0, /* tp_hash */
5382 0, /* tp_call */
5383 0, /* tp_str */
5384 PyObject_GenericGetAttr, /* tp_getattro */
5385 0, /* tp_setattro */
5386 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005387 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 sock_doc, /* tp_doc */
5389 0, /* tp_traverse */
5390 0, /* tp_clear */
5391 0, /* tp_richcompare */
5392 0, /* tp_weaklistoffset */
5393 0, /* tp_iter */
5394 0, /* tp_iternext */
5395 sock_methods, /* tp_methods */
5396 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005397 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 0, /* tp_base */
5399 0, /* tp_dict */
5400 0, /* tp_descr_get */
5401 0, /* tp_descr_set */
5402 0, /* tp_dictoffset */
5403 sock_initobj, /* tp_init */
5404 PyType_GenericAlloc, /* tp_alloc */
5405 sock_new, /* tp_new */
5406 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005407 0, /* tp_is_gc */
5408 0, /* tp_bases */
5409 0, /* tp_mro */
5410 0, /* tp_cache */
5411 0, /* tp_subclasses */
5412 0, /* tp_weaklist */
5413 0, /* tp_del */
5414 0, /* tp_version_tag */
5415 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005416};
5417
Guido van Rossum30a685f1991-06-27 15:51:29 +00005418
Guido van Rossum81194471991-07-27 21:42:02 +00005419/* Python interface to gethostname(). */
5420
5421/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005422static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005423socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005424{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005425 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5426 return NULL;
5427 }
5428
Martin v. Löwis72f48422010-10-29 18:20:08 +00005429#ifdef MS_WINDOWS
5430 /* Don't use winsock's gethostname, as this returns the ANSI
5431 version of the hostname, whereas we need a Unicode string.
5432 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005433 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005434 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005435 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005436 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005437
5438 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005439 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005440
5441 if (GetLastError() != ERROR_MORE_DATA)
5442 return PyErr_SetFromWindowsErr(0);
5443
5444 if (size == 0)
5445 return PyUnicode_New(0, 0);
5446
5447 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5448 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005449 name = PyMem_New(wchar_t, size);
5450 if (!name) {
5451 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005452 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005453 }
Victor Stinner74168972011-11-17 01:11:36 +01005454 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5455 name,
5456 &size))
5457 {
5458 PyMem_Free(name);
5459 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005460 }
Victor Stinner74168972011-11-17 01:11:36 +01005461
5462 result = PyUnicode_FromWideChar(name, size);
5463 PyMem_Free(name);
5464 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005465#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 char buf[1024];
5467 int res;
5468 Py_BEGIN_ALLOW_THREADS
5469 res = gethostname(buf, (int) sizeof buf - 1);
5470 Py_END_ALLOW_THREADS
5471 if (res < 0)
5472 return set_error();
5473 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005474 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005475#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005476}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005478PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005479"gethostname() -> string\n\
5480\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005481Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005482
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005483#ifdef HAVE_SETHOSTNAME
5484PyDoc_STRVAR(sethostname_doc,
5485"sethostname(name)\n\n\
5486Sets the hostname to name.");
5487
5488static PyObject *
5489socket_sethostname(PyObject *self, PyObject *args)
5490{
5491 PyObject *hnobj;
5492 Py_buffer buf;
5493 int res, flag = 0;
5494
Christian Heimesd2774c72013-06-19 02:06:29 +02005495#ifdef _AIX
5496/* issue #18259, not declared in any useful header file */
5497extern int sethostname(const char *, size_t);
5498#endif
5499
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005500 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5501 PyErr_Clear();
5502 if (!PyArg_ParseTuple(args, "O&:sethostname",
5503 PyUnicode_FSConverter, &hnobj))
5504 return NULL;
5505 flag = 1;
5506 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005507
5508 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5509 return NULL;
5510 }
5511
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005512 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5513 if (!res) {
5514 res = sethostname(buf.buf, buf.len);
5515 PyBuffer_Release(&buf);
5516 }
5517 if (flag)
5518 Py_DECREF(hnobj);
5519 if (res)
5520 return set_error();
5521 Py_RETURN_NONE;
5522}
5523#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005524
Guido van Rossum30a685f1991-06-27 15:51:29 +00005525/* Python interface to gethostbyname(name). */
5526
5527/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005529socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005532 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005533 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005534
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005535 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005537 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5538 goto finally;
5539 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005540 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005541 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005542 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005543finally:
5544 PyMem_Free(name);
5545 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005546}
5547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005548PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005549"gethostbyname(host) -> address\n\
5550\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005551Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005552
5553
Victor Stinner72400302016-01-28 15:41:01 +01005554static PyObject*
5555sock_decode_hostname(const char *name)
5556{
5557#ifdef MS_WINDOWS
5558 /* Issue #26227: gethostbyaddr() returns a string encoded
5559 * to the ANSI code page */
5560 return PyUnicode_DecodeFSDefault(name);
5561#else
5562 /* Decode from UTF-8 */
5563 return PyUnicode_FromString(name);
5564#endif
5565}
5566
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005567/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5568
5569static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005570gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 char **pch;
5573 PyObject *rtn_tuple = (PyObject *)NULL;
5574 PyObject *name_list = (PyObject *)NULL;
5575 PyObject *addr_list = (PyObject *)NULL;
5576 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005577 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 if (h == NULL) {
5580 /* Let's get real error message to return */
5581 set_herror(h_errno);
5582 return NULL;
5583 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 if (h->h_addrtype != af) {
5586 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005587 errno = EAFNOSUPPORT;
5588 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 return NULL;
5590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 case AF_INET:
5595 if (alen < sizeof(struct sockaddr_in))
5596 return NULL;
5597 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005598
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005599#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 case AF_INET6:
5601 if (alen < sizeof(struct sockaddr_in6))
5602 return NULL;
5603 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005604#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 if ((name_list = PyList_New(0)) == NULL)
5609 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 if ((addr_list = PyList_New(0)) == NULL)
5612 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 /* SF #1511317: h_aliases can be NULL */
5615 if (h->h_aliases) {
5616 for (pch = h->h_aliases; *pch != NULL; pch++) {
5617 int status;
5618 tmp = PyUnicode_FromString(*pch);
5619 if (tmp == NULL)
5620 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 status = PyList_Append(name_list, tmp);
5623 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 if (status)
5626 goto err;
5627 }
5628 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5631 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 case AF_INET:
5636 {
5637 struct sockaddr_in sin;
5638 memset(&sin, 0, sizeof(sin));
5639 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005640#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005644 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 if (pch == h->h_addr_list && alen >= sizeof(sin))
5647 memcpy((char *) addr, &sin, sizeof(sin));
5648 break;
5649 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005650
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005651#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 case AF_INET6:
5653 {
5654 struct sockaddr_in6 sin6;
5655 memset(&sin6, 0, sizeof(sin6));
5656 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005657#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005661 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5664 memcpy((char *) addr, &sin6, sizeof(sin6));
5665 break;
5666 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005667#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005670 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 "unsupported address family");
5672 return NULL;
5673 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 if (tmp == NULL)
5676 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 status = PyList_Append(addr_list, tmp);
5679 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 if (status)
5682 goto err;
5683 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005684
Victor Stinner72400302016-01-28 15:41:01 +01005685 name = sock_decode_hostname(h->h_name);
5686 if (name == NULL)
5687 goto err;
5688 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005689
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005690 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 Py_XDECREF(name_list);
5692 Py_XDECREF(addr_list);
5693 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005694}
5695
5696
5697/* Python interface to gethostbyname_ex(name). */
5698
5699/*ARGSUSED*/
5700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005701socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 char *name;
5704 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005705 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005707 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005708#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005710#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005712#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005713 char buf[16384];
5714 int buf_len = (sizeof buf) - 1;
5715 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005716#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005717#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005719#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005720#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005721
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005722 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005724 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5725 goto finally;
5726 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005727 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005728 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005730#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005731#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005732 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005734#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005736#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 memset((void *) &data, '\0', sizeof(data));
5738 result = gethostbyname_r(name, &hp_allocated, &data);
5739 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005740#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005741#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005742#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005744#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005745 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005747#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 Py_END_ALLOW_THREADS
5749 /* Some C libraries would require addr.__ss_family instead of
5750 addr.ss_family.
5751 Therefore, we cast the sockaddr_storage into sockaddr to
5752 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005753 sa = SAS2SA(&addr);
5754 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005756#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005758#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005759finally:
5760 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005762}
5763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005764PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005765"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5766\n\
5767Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005768for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005769
5770
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005771/* Python interface to gethostbyaddr(IP). */
5772
5773/*ARGSUSED*/
5774static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005775socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005776{
Charles-François Natali8b759652011-12-23 16:44:51 +01005777 sock_addr_t addr;
5778 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 char *ip_num;
5780 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005781 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005782#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005784#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005785 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005786#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 /* glibcs up to 2.10 assume that the buf argument to
5788 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5789 does not ensure. The attribute below instructs the compiler
5790 to maintain this alignment. */
5791 char buf[16384] Py_ALIGNED(8);
5792 int buf_len = (sizeof buf) - 1;
5793 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005794#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005795#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005797#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005798#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005799 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 int al;
5801 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005802
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005803 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005805 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5806 goto finally;
5807 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 af = AF_UNSPEC;
5809 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005810 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 af = sa->sa_family;
5812 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005813 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 switch (af) {
5815 case AF_INET:
5816 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5817 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5818 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005819#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 case AF_INET6:
5821 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5822 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5823 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005826 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005827 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 }
5829 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005830#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005831#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005832 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 &hp_allocated, buf, buf_len,
5834 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005835#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 h = gethostbyaddr_r(ap, al, af,
5837 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005838#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 memset((void *) &data, '\0', sizeof(data));
5840 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5841 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005842#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005843#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005844#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005846#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005847 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005849#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005851 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005852#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005854#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005855finally:
5856 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005858}
5859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005860PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005861"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5862\n\
5863Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005864for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005865
Guido van Rossum30a685f1991-06-27 15:51:29 +00005866
5867/* Python interface to getservbyname(name).
5868 This only returns the port number, since the other info is already
5869 known or not useful (like the list of aliases). */
5870
5871/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005873socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005874{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005875 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 struct servent *sp;
5877 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5878 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005879
5880 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5881 return NULL;
5882 }
5883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 Py_BEGIN_ALLOW_THREADS
5885 sp = getservbyname(name, proto);
5886 Py_END_ALLOW_THREADS
5887 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005888 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 return NULL;
5890 }
5891 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005892}
5893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005894PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005895"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005896\n\
5897Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005898The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5899otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005900
Guido van Rossum30a685f1991-06-27 15:51:29 +00005901
Barry Warsaw11b91a02004-06-28 00:50:43 +00005902/* Python interface to getservbyport(port).
5903 This only returns the service name, since the other info is already
5904 known or not useful (like the list of aliases). */
5905
5906/*ARGSUSED*/
5907static PyObject *
5908socket_getservbyport(PyObject *self, PyObject *args)
5909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005911 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 struct servent *sp;
5913 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5914 return NULL;
5915 if (port < 0 || port > 0xffff) {
5916 PyErr_SetString(
5917 PyExc_OverflowError,
5918 "getservbyport: port must be 0-65535.");
5919 return NULL;
5920 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005921
5922 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5923 return NULL;
5924 }
5925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 Py_BEGIN_ALLOW_THREADS
5927 sp = getservbyport(htons((short)port), proto);
5928 Py_END_ALLOW_THREADS
5929 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005930 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 return NULL;
5932 }
5933 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005934}
5935
5936PyDoc_STRVAR(getservbyport_doc,
5937"getservbyport(port[, protocolname]) -> string\n\
5938\n\
5939Return the service name from a port number and protocol name.\n\
5940The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5941otherwise any protocol will match.");
5942
Guido van Rossum3901d851996-12-19 16:35:04 +00005943/* Python interface to getprotobyname(name).
5944 This only returns the protocol number, since the other info is
5945 already known or not useful (like the list of aliases). */
5946
5947/*ARGSUSED*/
5948static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005949socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005950{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005951 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 struct protoent *sp;
5953 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5954 return NULL;
5955 Py_BEGIN_ALLOW_THREADS
5956 sp = getprotobyname(name);
5957 Py_END_ALLOW_THREADS
5958 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005959 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 return NULL;
5961 }
5962 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005963}
5964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005965PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005966"getprotobyname(name) -> integer\n\
5967\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005968Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005969
Christian Heimesd0e31b92018-01-27 09:54:13 +01005970static PyObject *
5971socket_close(PyObject *self, PyObject *fdobj)
5972{
5973 SOCKET_T fd;
5974 int res;
5975
5976 fd = PyLong_AsSocket_t(fdobj);
5977 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5978 return NULL;
5979 Py_BEGIN_ALLOW_THREADS
5980 res = SOCKETCLOSE(fd);
5981 Py_END_ALLOW_THREADS
5982 /* bpo-30319: The peer can already have closed the connection.
5983 Python ignores ECONNRESET on close(). */
5984 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5985 return set_error();
5986 }
5987 Py_RETURN_NONE;
5988}
5989
5990PyDoc_STRVAR(close_doc,
5991"close(integer) -> None\n\
5992\n\
5993Close an integer socket file descriptor. This is like os.close(), but for\n\
5994sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005995
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005996#ifndef NO_DUP
5997/* dup() function for socket fds */
5998
5999static PyObject *
6000socket_dup(PyObject *self, PyObject *fdobj)
6001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 SOCKET_T fd, newfd;
6003 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006004#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006005 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006006#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 fd = PyLong_AsSocket_t(fdobj);
6009 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
6010 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006011
Victor Stinnerdaf45552013-08-28 00:53:59 +02006012#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006013 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02006014 return set_error();
6015
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006016 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006017 FROM_PROTOCOL_INFO,
6018 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 if (newfd == INVALID_SOCKET)
6020 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006021
Victor Stinnerdaf45552013-08-28 00:53:59 +02006022 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
6023 closesocket(newfd);
6024 PyErr_SetFromWindowsErr(0);
6025 return NULL;
6026 }
6027#else
6028 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
6029 newfd = _Py_dup(fd);
6030 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01006031 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006032#endif
6033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 newfdobj = PyLong_FromSocket_t(newfd);
6035 if (newfdobj == NULL)
6036 SOCKETCLOSE(newfd);
6037 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006038}
6039
6040PyDoc_STRVAR(dup_doc,
6041"dup(integer) -> integer\n\
6042\n\
6043Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
6044sockets; on some platforms os.dup() won't work for socket file descriptors.");
6045#endif
6046
6047
Dave Cole331708b2004-08-09 04:51:41 +00006048#ifdef HAVE_SOCKETPAIR
6049/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00006050 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00006051 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00006052
6053/*ARGSUSED*/
6054static PyObject *
6055socket_socketpair(PyObject *self, PyObject *args)
6056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 PySocketSockObject *s0 = NULL, *s1 = NULL;
6058 SOCKET_T sv[2];
6059 int family, type = SOCK_STREAM, proto = 0;
6060 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006061#ifdef SOCK_CLOEXEC
6062 int *atomic_flag_works = &sock_cloexec_works;
6063#else
6064 int *atomic_flag_works = NULL;
6065#endif
6066 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00006067
6068#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00006070#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00006072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 if (!PyArg_ParseTuple(args, "|iii:socketpair",
6074 &family, &type, &proto))
6075 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02006076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02006078 Py_BEGIN_ALLOW_THREADS
6079#ifdef SOCK_CLOEXEC
6080 if (sock_cloexec_works != 0) {
6081 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
6082 if (sock_cloexec_works == -1) {
6083 if (ret >= 0) {
6084 sock_cloexec_works = 1;
6085 }
6086 else if (errno == EINVAL) {
6087 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6088 sock_cloexec_works = 0;
6089 ret = socketpair(family, type, proto, sv);
6090 }
6091 }
6092 }
6093 else
6094#endif
6095 {
6096 ret = socketpair(family, type, proto, sv);
6097 }
6098 Py_END_ALLOW_THREADS
6099
6100 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006102
6103 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6104 goto finally;
6105 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6106 goto finally;
6107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 s0 = new_sockobject(sv[0], family, type, proto);
6109 if (s0 == NULL)
6110 goto finally;
6111 s1 = new_sockobject(sv[1], family, type, proto);
6112 if (s1 == NULL)
6113 goto finally;
6114 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006115
6116finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 if (res == NULL) {
6118 if (s0 == NULL)
6119 SOCKETCLOSE(sv[0]);
6120 if (s1 == NULL)
6121 SOCKETCLOSE(sv[1]);
6122 }
6123 Py_XDECREF(s0);
6124 Py_XDECREF(s1);
6125 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006126}
6127
6128PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006129"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006130\n\
6131Create a pair of socket objects from the sockets returned by the platform\n\
6132socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006133The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006134AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006135
6136#endif /* HAVE_SOCKETPAIR */
6137
6138
Guido van Rossum006bf911996-06-12 04:04:55 +00006139static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006140socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006141{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006142 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006143
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006144 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 return NULL;
6146 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006147 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006149 "ntohs: can't convert negative Python int to C "
6150 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 return NULL;
6152 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006153 if (x > 0xffff) {
6154 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6155 "ntohs: Python int too large to convert to C "
6156 "16-bit unsigned integer (The silent truncation "
6157 "is deprecated)",
6158 1)) {
6159 return NULL;
6160 }
6161 }
6162 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006163}
6164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006165PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006166"ntohs(integer) -> integer\n\
6167\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006168Convert a 16-bit unsigned integer from network to host byte order.\n\
6169Note that in case the received integer does not fit in 16-bit unsigned\n\
6170integer, but does fit in a positive C int, it is silently truncated to\n\
617116-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006172However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006173exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006174
6175
Guido van Rossum006bf911996-06-12 04:04:55 +00006176static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006177socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006181 if (PyLong_Check(arg)) {
6182 x = PyLong_AsUnsignedLong(arg);
6183 if (x == (unsigned long) -1 && PyErr_Occurred())
6184 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006185#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 {
6187 unsigned long y;
6188 /* only want the trailing 32 bits */
6189 y = x & 0xFFFFFFFFUL;
6190 if (y ^ x)
6191 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006192 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193 x = y;
6194 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 }
6197 else
6198 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006199 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006202}
6203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006204PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006205"ntohl(integer) -> integer\n\
6206\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006207Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006208
6209
Guido van Rossum006bf911996-06-12 04:04:55 +00006210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006211socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006212{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006213 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006214
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006215 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 return NULL;
6217 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006218 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006220 "htons: can't convert negative Python int to C "
6221 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 return NULL;
6223 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006224 if (x > 0xffff) {
6225 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6226 "htons: Python int too large to convert to C "
6227 "16-bit unsigned integer (The silent truncation "
6228 "is deprecated)",
6229 1)) {
6230 return NULL;
6231 }
6232 }
6233 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006234}
6235
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006236PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006237"htons(integer) -> integer\n\
6238\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006239Convert a 16-bit unsigned integer from host to network byte order.\n\
6240Note that in case the received integer does not fit in 16-bit unsigned\n\
6241integer, but does fit in a positive C int, it is silently truncated to\n\
624216-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006243However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006244exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006245
6246
Guido van Rossum006bf911996-06-12 04:04:55 +00006247static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006248socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 if (PyLong_Check(arg)) {
6253 x = PyLong_AsUnsignedLong(arg);
6254 if (x == (unsigned long) -1 && PyErr_Occurred())
6255 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006256#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 {
6258 unsigned long y;
6259 /* only want the trailing 32 bits */
6260 y = x & 0xFFFFFFFFUL;
6261 if (y ^ x)
6262 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006263 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 x = y;
6265 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 }
6268 else
6269 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006270 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 Py_TYPE(arg)->tp_name);
6272 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006273}
6274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006275PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006276"htonl(integer) -> integer\n\
6277\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006278Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006279
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006280/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006282PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006283"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006284\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006285Convert 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 +00006286binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006287
6288static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006289socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006290{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006291#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006293#endif
6294
6295#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006296#if (SIZEOF_INT != 4)
6297#error "Not sure if in_addr_t exists and int is not 32-bits."
6298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 /* Have to use inet_addr() instead */
6300 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006301#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006302 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6305 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006306
Tim Peters1df9fdd2003-02-13 03:13:40 +00006307
6308#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006309
6310#ifdef USE_INET_ATON_WEAKLINK
6311 if (inet_aton != NULL) {
6312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 if (inet_aton(ip_addr, &buf))
6314 return PyBytes_FromStringAndSize((char *)(&buf),
6315 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006316
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006317 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 "illegal IP address string passed to inet_aton");
6319 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006320
Thomas Wouters477c8d52006-05-27 19:21:47 +00006321#ifdef USE_INET_ATON_WEAKLINK
6322 } else {
6323#endif
6324
6325#endif
6326
6327#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 /* special-case this address as inet_addr might return INADDR_NONE
6330 * for this */
6331 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006332 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006334
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006335 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006338 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006339 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340 "illegal IP address string passed to inet_aton");
6341 return NULL;
6342 }
6343 }
6344 return PyBytes_FromStringAndSize((char *) &packed_addr,
6345 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006346
6347#ifdef USE_INET_ATON_WEAKLINK
6348 }
6349#endif
6350
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006351#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006352}
6353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006354PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006355"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006356\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006357Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006358
6359static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006360socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006361{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006362 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006364
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006365 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 return NULL;
6367 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006368
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006369 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006370 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006372 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 return NULL;
6374 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006375
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006376 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6377 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006378
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006379 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006381}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006382
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006383#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006384
6385PyDoc_STRVAR(inet_pton_doc,
6386"inet_pton(af, ip) -> packed IP address string\n\
6387\n\
6388Convert an IP address from string format to a packed string suitable\n\
6389for use with low-level network functions.");
6390
6391static PyObject *
6392socket_inet_pton(PyObject *self, PyObject *args)
6393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006395 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006397#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006398 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006399#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6403 return NULL;
6404 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006405
Martin v. Löwis04697e82004-06-02 12:35:29 +00006406#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006408 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409 "can't use AF_INET6, IPv6 is disabled");
6410 return NULL;
6411 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006412#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 retval = inet_pton(af, ip, packed);
6415 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006416 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 return NULL;
6418 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006419 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 "illegal IP address string passed to inet_pton");
6421 return NULL;
6422 } else if (af == AF_INET) {
6423 return PyBytes_FromStringAndSize(packed,
6424 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006425#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 } else if (af == AF_INET6) {
6427 return PyBytes_FromStringAndSize(packed,
6428 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006431 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 return NULL;
6433 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006434}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006435
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006436PyDoc_STRVAR(inet_ntop_doc,
6437"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6438\n\
6439Convert a packed IP address of the given family to string format.");
6440
6441static PyObject *
6442socket_inet_ntop(PyObject *self, PyObject *args)
6443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006445 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006447#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006448 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006449#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006450 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006451#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006452
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006453 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 return NULL;
6455 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006458 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 PyErr_SetString(PyExc_ValueError,
6460 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006461 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 return NULL;
6463 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006464#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006466 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 PyErr_SetString(PyExc_ValueError,
6468 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006469 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 return NULL;
6471 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 } else {
6474 PyErr_Format(PyExc_ValueError,
6475 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006476 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 return NULL;
6478 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006479
Коренберг Марк7766b962018-02-13 00:47:42 +05006480 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006481 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6482 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006484 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485 return NULL;
6486 } else {
6487 return PyUnicode_FromString(retval);
6488 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006489}
6490
6491#endif /* HAVE_INET_PTON */
6492
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006493/* Python interface to getaddrinfo(host, port). */
6494
6495/*ARGSUSED*/
6496static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006497socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006498{
Victor Stinner77af1722011-05-26 14:05:59 +02006499 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006500 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 struct addrinfo hints, *res;
6502 struct addrinfo *res0 = NULL;
6503 PyObject *hobj = NULL;
6504 PyObject *pobj = (PyObject *)NULL;
6505 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006506 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 int family, socktype, protocol, flags;
6508 int error;
6509 PyObject *all = (PyObject *)NULL;
6510 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006511
Georg Brandl6083a4b2013-10-14 06:51:46 +02006512 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006514 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006515 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516 &protocol, &flags)) {
6517 return NULL;
6518 }
6519 if (hobj == Py_None) {
6520 hptr = NULL;
6521 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006522 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523 if (!idna)
6524 return NULL;
6525 assert(PyBytes_Check(idna));
6526 hptr = PyBytes_AS_STRING(idna);
6527 } else if (PyBytes_Check(hobj)) {
6528 hptr = PyBytes_AsString(hobj);
6529 } else {
6530 PyErr_SetString(PyExc_TypeError,
6531 "getaddrinfo() argument 1 must be string or None");
6532 return NULL;
6533 }
6534 if (PyLong_CheckExact(pobj)) {
6535 long value = PyLong_AsLong(pobj);
6536 if (value == -1 && PyErr_Occurred())
6537 goto err;
6538 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6539 pptr = pbuf;
6540 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006541 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006542 if (pptr == NULL)
6543 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006545 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 } else if (pobj == Py_None) {
6547 pptr = (char *)NULL;
6548 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006549 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 goto err;
6551 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006552#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006553 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006554 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006555 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6556 * This workaround avoids a segfault in libsystem.
6557 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006558 pptr = "00";
6559 }
6560#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006561
6562 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6563 hobj, pobj, family, socktype, protocol) < 0) {
6564 return NULL;
6565 }
6566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 memset(&hints, 0, sizeof(hints));
6568 hints.ai_family = family;
6569 hints.ai_socktype = socktype;
6570 hints.ai_protocol = protocol;
6571 hints.ai_flags = flags;
6572 Py_BEGIN_ALLOW_THREADS
6573 ACQUIRE_GETADDRINFO_LOCK
6574 error = getaddrinfo(hptr, pptr, &hints, &res0);
6575 Py_END_ALLOW_THREADS
6576 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6577 if (error) {
6578 set_gaierror(error);
6579 goto err;
6580 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006581
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006582 all = PyList_New(0);
6583 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 goto err;
6585 for (res = res0; res; res = res->ai_next) {
6586 PyObject *single;
6587 PyObject *addr =
6588 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6589 if (addr == NULL)
6590 goto err;
6591 single = Py_BuildValue("iiisO", res->ai_family,
6592 res->ai_socktype, res->ai_protocol,
6593 res->ai_canonname ? res->ai_canonname : "",
6594 addr);
6595 Py_DECREF(addr);
6596 if (single == NULL)
6597 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006598
Zackery Spytz4c596d52018-11-14 15:39:01 -07006599 if (PyList_Append(all, single)) {
6600 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006602 }
6603 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604 }
6605 Py_XDECREF(idna);
6606 if (res0)
6607 freeaddrinfo(res0);
6608 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006609 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 Py_XDECREF(all);
6611 Py_XDECREF(idna);
6612 if (res0)
6613 freeaddrinfo(res0);
6614 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006615}
6616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006617PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006618"getaddrinfo(host, port [, family, type, proto, flags])\n\
6619 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006620\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006621Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006622
6623/* Python interface to getnameinfo(sa, flags). */
6624
6625/*ARGSUSED*/
6626static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006627socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 PyObject *sa = (PyObject *)NULL;
6630 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006631 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006632 int port;
6633 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6635 struct addrinfo hints, *res = NULL;
6636 int error;
6637 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006638 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640 flags = flowinfo = scope_id = 0;
6641 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6642 return NULL;
6643 if (!PyTuple_Check(sa)) {
6644 PyErr_SetString(PyExc_TypeError,
6645 "getnameinfo() argument 1 must be a tuple");
6646 return NULL;
6647 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006648 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006650 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006652 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006653 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006654 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006655 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006656 return NULL;
6657 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006658
6659 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6660 return NULL;
6661 }
6662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6664 memset(&hints, 0, sizeof(hints));
6665 hints.ai_family = AF_UNSPEC;
6666 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006667 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 Py_BEGIN_ALLOW_THREADS
6669 ACQUIRE_GETADDRINFO_LOCK
6670 error = getaddrinfo(hostp, pbuf, &hints, &res);
6671 Py_END_ALLOW_THREADS
6672 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6673 if (error) {
6674 set_gaierror(error);
6675 goto fail;
6676 }
6677 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006678 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 "sockaddr resolved to multiple addresses");
6680 goto fail;
6681 }
6682 switch (res->ai_family) {
6683 case AF_INET:
6684 {
6685 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006686 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 "IPv4 sockaddr must be 2 tuple");
6688 goto fail;
6689 }
6690 break;
6691 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006692#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 case AF_INET6:
6694 {
6695 struct sockaddr_in6 *sin6;
6696 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006697 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 sin6->sin6_scope_id = scope_id;
6699 break;
6700 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006703 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6705 if (error) {
6706 set_gaierror(error);
6707 goto fail;
6708 }
Victor Stinner72400302016-01-28 15:41:01 +01006709
6710 name = sock_decode_hostname(hbuf);
6711 if (name == NULL)
6712 goto fail;
6713 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006714
6715fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716 if (res)
6717 freeaddrinfo(res);
6718 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006719}
6720
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006721PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006722"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006723\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006724Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006725
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006726
6727/* Python API to getting and setting the default timeout value. */
6728
6729static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306730socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006731{
Victor Stinner71694d52015-03-28 01:18:54 +01006732 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006733 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 }
Victor Stinner71694d52015-03-28 01:18:54 +01006735 else {
6736 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6737 return PyFloat_FromDouble(seconds);
6738 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006739}
6740
6741PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006742"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006743\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006744Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006745A value of None indicates that new socket objects have no timeout.\n\
6746When the socket module is first imported, the default is None.");
6747
6748static PyObject *
6749socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6750{
Victor Stinner71694d52015-03-28 01:18:54 +01006751 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006752
Victor Stinner71694d52015-03-28 01:18:54 +01006753 if (socket_parse_timeout(&timeout, arg) < 0)
6754 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006757
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006758 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006759}
6760
6761PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006762"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006763\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006764Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006765A value of None indicates that new socket objects have no timeout.\n\
6766When the socket module is first imported, the default is None.");
6767
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006768#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006769/* Python API for getting interface indices and names */
6770
6771static PyObject *
6772socket_if_nameindex(PyObject *self, PyObject *arg)
6773{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006774 PyObject *list = PyList_New(0);
6775 if (list == NULL) {
6776 return NULL;
6777 }
6778#ifdef MS_WINDOWS
6779 PMIB_IF_TABLE2 tbl;
6780 int ret;
6781 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6782 Py_DECREF(list);
6783 // ret is used instead of GetLastError()
6784 return PyErr_SetFromWindowsErr(ret);
6785 }
6786 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6787 MIB_IF_ROW2 r = tbl->Table[i];
6788 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6789 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6790 Py_ARRAY_LENGTH(buf)))) {
6791 Py_DECREF(list);
6792 FreeMibTable(tbl);
6793 // ret is used instead of GetLastError()
6794 return PyErr_SetFromWindowsErr(ret);
6795 }
6796 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6797 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6798 Py_XDECREF(tuple);
6799 Py_DECREF(list);
6800 FreeMibTable(tbl);
6801 return NULL;
6802 }
6803 Py_DECREF(tuple);
6804 }
6805 FreeMibTable(tbl);
6806 return list;
6807#else
Charles-François Natali60713592011-05-20 16:55:06 +02006808 int i;
6809 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006810
Charles-François Natali60713592011-05-20 16:55:06 +02006811 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006812 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006813 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006814 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006815 return NULL;
6816 }
6817
Gregory P. Smithb474e672018-12-30 17:05:36 -08006818#ifdef _Py_MEMORY_SANITIZER
6819 __msan_unpoison(ni, sizeof(ni));
6820 __msan_unpoison(&ni[0], sizeof(ni[0]));
6821#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006822 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006823#ifdef _Py_MEMORY_SANITIZER
6824 /* This one isn't the end sentinel, the next one must exist. */
6825 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6826 /* Otherwise Py_BuildValue internals are flagged by MSan when
6827 they access the not-msan-tracked if_name string data. */
6828 {
6829 char *to_sanitize = ni[i].if_name;
6830 do {
6831 __msan_unpoison(to_sanitize, 1);
6832 } while (*to_sanitize++ != '\0');
6833 }
6834#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006835 PyObject *ni_tuple = Py_BuildValue("IO&",
6836 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006837
6838 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6839 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006840 Py_DECREF(list);
6841 if_freenameindex(ni);
6842 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006843 }
6844 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006845 }
6846
6847 if_freenameindex(ni);
6848 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006849#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006850}
6851
6852PyDoc_STRVAR(if_nameindex_doc,
6853"if_nameindex()\n\
6854\n\
6855Returns a list of network interface information (index, name) tuples.");
6856
Charles-François Natali60713592011-05-20 16:55:06 +02006857static PyObject *
6858socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006859{
Charles-François Natali60713592011-05-20 16:55:06 +02006860 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006861#ifdef MS_WINDOWS
6862 NET_IFINDEX index;
6863#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006864 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006865#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006866 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6867 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006868 return NULL;
6869
Charles-François Natali60713592011-05-20 16:55:06 +02006870 index = if_nametoindex(PyBytes_AS_STRING(oname));
6871 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006872 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006873 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006874 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006875 return NULL;
6876 }
6877
6878 return PyLong_FromUnsignedLong(index);
6879}
6880
6881PyDoc_STRVAR(if_nametoindex_doc,
6882"if_nametoindex(if_name)\n\
6883\n\
6884Returns the interface index corresponding to the interface name if_name.");
6885
Charles-François Natali60713592011-05-20 16:55:06 +02006886static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006887socket_if_indextoname(PyObject *self, PyObject *arg)
6888{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006889#ifdef MS_WINDOWS
6890 NET_IFINDEX index;
6891#else
Charles-François Natali60713592011-05-20 16:55:06 +02006892 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006893#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006894 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006895
Charles-François Natali60713592011-05-20 16:55:06 +02006896 index = PyLong_AsUnsignedLong(arg);
6897 if (index == (unsigned long) -1)
6898 return NULL;
6899
6900 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006901 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006902 return NULL;
6903 }
6904
Charles-François Natali60713592011-05-20 16:55:06 +02006905 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006906}
6907
6908PyDoc_STRVAR(if_indextoname_doc,
6909"if_indextoname(if_index)\n\
6910\n\
6911Returns the interface name corresponding to the interface index if_index.");
6912
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006913#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006914
6915
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006916#ifdef CMSG_LEN
6917/* Python interface to CMSG_LEN(length). */
6918
6919static PyObject *
6920socket_CMSG_LEN(PyObject *self, PyObject *args)
6921{
6922 Py_ssize_t length;
6923 size_t result;
6924
6925 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6926 return NULL;
6927 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6928 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6929 return NULL;
6930 }
6931 return PyLong_FromSize_t(result);
6932}
6933
6934PyDoc_STRVAR(CMSG_LEN_doc,
6935"CMSG_LEN(length) -> control message length\n\
6936\n\
6937Return the total length, without trailing padding, of an ancillary\n\
6938data item with associated data of the given length. This value can\n\
6939often be used as the buffer size for recvmsg() to receive a single\n\
6940item of ancillary data, but RFC 3542 requires portable applications to\n\
6941use CMSG_SPACE() and thus include space for padding, even when the\n\
6942item will be the last in the buffer. Raises OverflowError if length\n\
6943is outside the permissible range of values.");
6944
6945
6946#ifdef CMSG_SPACE
6947/* Python interface to CMSG_SPACE(length). */
6948
6949static PyObject *
6950socket_CMSG_SPACE(PyObject *self, PyObject *args)
6951{
6952 Py_ssize_t length;
6953 size_t result;
6954
6955 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6956 return NULL;
6957 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6958 PyErr_SetString(PyExc_OverflowError,
6959 "CMSG_SPACE() argument out of range");
6960 return NULL;
6961 }
6962 return PyLong_FromSize_t(result);
6963}
6964
6965PyDoc_STRVAR(CMSG_SPACE_doc,
6966"CMSG_SPACE(length) -> buffer size\n\
6967\n\
6968Return the buffer size needed for recvmsg() to receive an ancillary\n\
6969data item with associated data of the given length, along with any\n\
6970trailing padding. The buffer space needed to receive multiple items\n\
6971is the sum of the CMSG_SPACE() values for their associated data\n\
6972lengths. Raises OverflowError if length is outside the permissible\n\
6973range of values.");
6974#endif /* CMSG_SPACE */
6975#endif /* CMSG_LEN */
6976
6977
Guido van Rossum30a685f1991-06-27 15:51:29 +00006978/* List of functions exported by this module. */
6979
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006980static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 {"gethostbyname", socket_gethostbyname,
6982 METH_VARARGS, gethostbyname_doc},
6983 {"gethostbyname_ex", socket_gethostbyname_ex,
6984 METH_VARARGS, ghbn_ex_doc},
6985 {"gethostbyaddr", socket_gethostbyaddr,
6986 METH_VARARGS, gethostbyaddr_doc},
6987 {"gethostname", socket_gethostname,
6988 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006989#ifdef HAVE_SETHOSTNAME
6990 {"sethostname", socket_sethostname,
6991 METH_VARARGS, sethostname_doc},
6992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993 {"getservbyname", socket_getservbyname,
6994 METH_VARARGS, getservbyname_doc},
6995 {"getservbyport", socket_getservbyport,
6996 METH_VARARGS, getservbyport_doc},
6997 {"getprotobyname", socket_getprotobyname,
6998 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006999 {"close", socket_close,
7000 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007001#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007002 {"dup", socket_dup,
7003 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007004#endif
Dave Cole331708b2004-08-09 04:51:41 +00007005#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007006 {"socketpair", socket_socketpair,
7007 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00007008#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 {"ntohs", socket_ntohs,
7010 METH_VARARGS, ntohs_doc},
7011 {"ntohl", socket_ntohl,
7012 METH_O, ntohl_doc},
7013 {"htons", socket_htons,
7014 METH_VARARGS, htons_doc},
7015 {"htonl", socket_htonl,
7016 METH_O, htonl_doc},
7017 {"inet_aton", socket_inet_aton,
7018 METH_VARARGS, inet_aton_doc},
7019 {"inet_ntoa", socket_inet_ntoa,
7020 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03007021#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007022 {"inet_pton", socket_inet_pton,
7023 METH_VARARGS, inet_pton_doc},
7024 {"inet_ntop", socket_inet_ntop,
7025 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007026#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02007027 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00007028 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029 {"getnameinfo", socket_getnameinfo,
7030 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05307031 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032 METH_NOARGS, getdefaulttimeout_doc},
7033 {"setdefaulttimeout", socket_setdefaulttimeout,
7034 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06007035#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07007036 {"if_nameindex", socket_if_nameindex,
7037 METH_NOARGS, if_nameindex_doc},
7038 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02007039 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07007040 {"if_indextoname", socket_if_indextoname,
7041 METH_O, if_indextoname_doc},
7042#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007043#ifdef CMSG_LEN
7044 {"CMSG_LEN", socket_CMSG_LEN,
7045 METH_VARARGS, CMSG_LEN_doc},
7046#ifdef CMSG_SPACE
7047 {"CMSG_SPACE", socket_CMSG_SPACE,
7048 METH_VARARGS, CMSG_SPACE_doc},
7049#endif
7050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007052};
7053
Guido van Rossum30a685f1991-06-27 15:51:29 +00007054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007055#ifdef MS_WINDOWS
7056#define OS_INIT_DEFINED
7057
7058/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007059
7060static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007061os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00007064}
7065
7066static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007067os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00007068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069 WSADATA WSAData;
7070 int ret;
7071 ret = WSAStartup(0x0101, &WSAData);
7072 switch (ret) {
7073 case 0: /* No error */
7074 Py_AtExit(os_cleanup);
7075 return 1; /* Success */
7076 case WSASYSNOTREADY:
7077 PyErr_SetString(PyExc_ImportError,
7078 "WSAStartup failed: network not ready");
7079 break;
7080 case WSAVERNOTSUPPORTED:
7081 case WSAEINVAL:
7082 PyErr_SetString(
7083 PyExc_ImportError,
7084 "WSAStartup failed: requested version not supported");
7085 break;
7086 default:
7087 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7088 break;
7089 }
7090 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007091}
7092
Guido van Rossum8d665e61996-06-26 18:22:49 +00007093#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007094
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007095
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007096
7097#ifndef OS_INIT_DEFINED
7098static int
7099os_init(void)
7100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007102}
7103#endif
7104
7105
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007106/* C API table - always add new things to the end for binary
7107 compatibility. */
7108static
7109PySocketModule_APIObject PySocketModuleAPI =
7110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007112 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007114};
7115
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007116
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007117/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007118
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007119 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007120 "socket.py" which implements some additional functionality.
7121 The import of "_socket" may fail with an ImportError exception if
7122 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007123 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007124 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007125*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007127PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007128"Implementation module for socket operations.\n\
7129\n\
7130See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007131
Martin v. Löwis1a214512008-06-11 05:26:20 +00007132static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133 PyModuleDef_HEAD_INIT,
7134 PySocket_MODULE_NAME,
7135 socket_doc,
7136 -1,
7137 socket_methods,
7138 NULL,
7139 NULL,
7140 NULL,
7141 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007142};
7143
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007144PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007145PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149 if (!os_init())
7150 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007151
Victor Stinnerdaf45552013-08-28 00:53:59 +02007152#ifdef MS_WINDOWS
7153 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007154 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007155 }
7156#endif
7157
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007158 Py_SET_TYPE(&sock_type, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159 m = PyModule_Create(&socketmodule);
7160 if (m == NULL)
7161 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007162
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007163 Py_INCREF(PyExc_OSError);
7164 PySocketModuleAPI.error = PyExc_OSError;
7165 Py_INCREF(PyExc_OSError);
7166 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007167 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007168 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007169 if (socket_herror == NULL)
7170 return NULL;
7171 Py_INCREF(socket_herror);
7172 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007173 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174 NULL);
7175 if (socket_gaierror == NULL)
7176 return NULL;
7177 Py_INCREF(socket_gaierror);
7178 PyModule_AddObject(m, "gaierror", socket_gaierror);
7179 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007180 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181 if (socket_timeout == NULL)
7182 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007183 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 Py_INCREF(socket_timeout);
7185 PyModule_AddObject(m, "timeout", socket_timeout);
7186 Py_INCREF((PyObject *)&sock_type);
7187 if (PyModule_AddObject(m, "SocketType",
7188 (PyObject *)&sock_type) != 0)
7189 return NULL;
7190 Py_INCREF((PyObject *)&sock_type);
7191 if (PyModule_AddObject(m, "socket",
7192 (PyObject *)&sock_type) != 0)
7193 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007194
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007195#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007196 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007197#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 Py_INCREF(has_ipv6);
7201 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203 /* Export C API */
7204 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7205 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7206 ) != 0)
7207 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007210#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007212#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007214#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007216#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007217#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007220#endif
7221#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007223#endif
7224#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007227#endif
7228#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007231#endif
7232#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007235#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007236#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007239#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007240#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007243#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007244#ifdef HAVE_SOCKADDR_ALG
7245 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7246#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007247#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007250#endif
7251#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007253#endif
7254#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007256 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007257#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007258#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007261#endif
7262#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007265#endif
7266#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007269#endif
7270#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007271 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007272 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007273#endif
7274#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, AF_NETLINK);
7277 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007278#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007280#endif
7281#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007283#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7285 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007286#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007288#endif
7289#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007291#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007292#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007293 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007294#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007295#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007297#endif
7298#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007300#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007302#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007304#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007305#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007307#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007308#ifdef NETLINK_CRYPTO
7309 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7310#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007311#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007312
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007313#ifdef AF_QIPCRTR
7314 /* Qualcomm IPCROUTER */
7315 PyModule_AddIntMacro(m, AF_QIPCRTR);
7316#endif
7317
caaveryeffc12f2017-09-06 18:18:10 -04007318#ifdef AF_VSOCK
7319 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7320 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7321 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7322 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7323 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7324 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7325 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7326 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7327 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7328#endif
7329
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007330#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007333#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007334#ifdef AF_LINK
7335 PyModule_AddIntMacro(m, AF_LINK);
7336#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007337#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007340#endif
7341#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007344#endif
7345#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007348#endif
7349#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007352#endif
7353#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007356#endif
7357#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007358 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007359 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007360#endif
7361#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007364#endif
7365#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007368#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007369
Hye-Shik Chang81268602004-02-02 06:05:24 +00007370#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, AF_BLUETOOTH);
Greg Bowser8fbece12019-08-02 16:29:52 -04007372#ifdef BTPROTO_L2CAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
Greg Bowser8fbece12019-08-02 16:29:52 -04007374#endif /* BTPROTO_L2CAP */
7375#ifdef BTPROTO_HCI
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, BTPROTO_HCI);
7377 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007378#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007379 PyModule_AddIntMacro(m, HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007380#if !defined(__FreeBSD__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007382 PyModule_AddIntMacro(m, HCI_DATA_DIR);
Greg Bowser8fbece12019-08-02 16:29:52 -04007383#endif /* !__FreeBSD__ */
7384#endif /* !__NetBSD__ && !__DragonFly__ */
7385#endif /* BTPROTO_HCI */
7386#ifdef BTPROTO_RFCOMM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Greg Bowser8fbece12019-08-02 16:29:52 -04007388#endif /* BTPROTO_RFCOMM */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7390 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Greg Bowser8fbece12019-08-02 16:29:52 -04007391#ifdef BTPROTO_SCO
7392 PyModule_AddIntMacro(m, BTPROTO_SCO);
7393#endif /* BTPROTO_SCO */
7394#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00007395
Charles-François Natali47413c12011-10-06 19:47:44 +02007396#ifdef AF_CAN
7397 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007399#endif
7400#ifdef PF_CAN
7401 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007403#endif
7404
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007405/* Reliable Datagram Sockets */
7406#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007408#endif
7409#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007411#endif
7412
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007413/* Kernel event messages */
7414#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007416#endif
7417#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007419#endif
7420
Antoine Pitroub156a462010-10-27 20:13:57 +00007421#ifdef AF_PACKET
7422 PyModule_AddIntMacro(m, AF_PACKET);
7423#endif
7424#ifdef PF_PACKET
7425 PyModule_AddIntMacro(m, PF_PACKET);
7426#endif
7427#ifdef PACKET_HOST
7428 PyModule_AddIntMacro(m, PACKET_HOST);
7429#endif
7430#ifdef PACKET_BROADCAST
7431 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7432#endif
7433#ifdef PACKET_MULTICAST
7434 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7435#endif
7436#ifdef PACKET_OTHERHOST
7437 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7438#endif
7439#ifdef PACKET_OUTGOING
7440 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7441#endif
7442#ifdef PACKET_LOOPBACK
7443 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7444#endif
7445#ifdef PACKET_FASTROUTE
7446 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007447#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007448
Christian Heimes043d6f62008-01-07 17:19:16 +00007449#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7454 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7455 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007456
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007457 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7458 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7459 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, SOL_TIPC);
7463 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7464 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7465 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7466 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007467
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7469 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7470 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7471 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7475 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007476#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007477 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007479#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7481 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7482 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7483 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7484 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7485 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007486#endif
7487
Christian Heimesdffa3942016-09-05 23:54:41 +02007488#ifdef HAVE_SOCKADDR_ALG
7489 /* Socket options */
7490 PyModule_AddIntMacro(m, ALG_SET_KEY);
7491 PyModule_AddIntMacro(m, ALG_SET_IV);
7492 PyModule_AddIntMacro(m, ALG_SET_OP);
7493 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7494 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7495 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7496
7497 /* Operations */
7498 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7499 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7500 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7501 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7502#endif
7503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, SOCK_STREAM);
7506 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007507/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007508#ifdef SOCK_RAW
7509 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007511#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007513#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007515#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007516#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007518#endif
7519#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007521#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007531#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007532#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007534#endif
7535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007536#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007539#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007542#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007548#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007553#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007554#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007557#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007559#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007566 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007572 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007574#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007575 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007577#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007580#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007581 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007583#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007584 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007585#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007586#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007587 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007588#endif
7589#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007590 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007591#endif
7592#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007594#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007595#ifdef SO_PASSSEC
7596 PyModule_AddIntMacro(m, SO_PASSSEC);
7597#endif
7598#ifdef SO_PEERSEC
7599 PyModule_AddIntMacro(m, SO_PEERSEC);
7600#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007601#ifdef SO_BINDTODEVICE
7602 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7603#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007604#ifdef SO_PRIORITY
7605 PyModule_AddIntMacro(m, SO_PRIORITY);
7606#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007607#ifdef SO_MARK
7608 PyModule_AddIntMacro(m, SO_MARK);
7609#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007610#ifdef SO_DOMAIN
7611 PyModule_AddIntMacro(m, SO_DOMAIN);
7612#endif
7613#ifdef SO_PROTOCOL
7614 PyModule_AddIntMacro(m, SO_PROTOCOL);
7615#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007617 /* Maximum number of connections for "listen" */
7618#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007620#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007622#endif
7623
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007624 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007625#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007627#endif
7628#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007630#endif
7631#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007633#endif
7634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635 /* Flags for send, recv */
7636#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007642#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007645#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007648#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007654#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007655 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007660#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007663#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007665#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007666#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007667 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007668#endif
7669#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007671#endif
7672#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007674#endif
7675#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007677#endif
7678#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007680#endif
7681#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007683#endif
7684#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007686#endif
7687#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007689#endif
7690#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007692#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007693#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007695#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007697 /* Protocol level and numbers, usable for [gs]etsockopt */
7698#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007699 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007701#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007702 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007706#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007715#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007716 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007718#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007719 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007721#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007723#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007728#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007730#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007731#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007732 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007733#endif
7734#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007735 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7736 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007737#endif
7738#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7740 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7741 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007742
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007743 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7744 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7745 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007746#ifdef CAN_ISOTP
7747 PyModule_AddIntMacro(m, CAN_ISOTP);
7748#endif
karl ding360371f2020-04-29 15:31:19 -07007749#ifdef CAN_J1939
7750 PyModule_AddIntMacro(m, CAN_J1939);
7751#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007752#endif
7753#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7755 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7756 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7757 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007758#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007759#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7760 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7761#endif
Zackery Spytz97e0de02020-04-09 06:03:49 -06007762#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS
7763 PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS);
7764#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007765#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007766 PyModule_AddIntMacro(m, CAN_BCM);
karl ding31c4fd22019-07-31 01:47:16 -07007767
7768 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007769 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7770 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7771 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7772 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7773 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7774 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7775 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7776 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7777 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7778 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7779 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7780 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
karl ding31c4fd22019-07-31 01:47:16 -07007781
7782 /* BCM flags */
7783 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7784 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7785 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7786 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7787 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7788 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7789 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7790 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7791 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7792 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7793 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7794#ifdef CAN_FD_FRAME
7795 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7796 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7797#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007798#endif
karl ding360371f2020-04-29 15:31:19 -07007799#ifdef HAVE_LINUX_CAN_J1939_H
7800 PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR);
7801 PyModule_AddIntMacro(m, J1939_IDLE_ADDR);
7802 PyModule_AddIntMacro(m, J1939_NO_ADDR);
7803 PyModule_AddIntMacro(m, J1939_NO_NAME);
7804 PyModule_AddIntMacro(m, J1939_PGN_REQUEST);
7805 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED);
7806 PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED);
7807 PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX);
7808 PyModule_AddIntMacro(m, J1939_PGN_MAX);
7809 PyModule_AddIntMacro(m, J1939_NO_PGN);
7810
7811 /* J1939 socket options */
7812 PyModule_AddIntMacro(m, SO_J1939_FILTER);
7813 PyModule_AddIntMacro(m, SO_J1939_PROMISC);
7814 PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO);
7815 PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE);
7816
7817 PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR);
7818 PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME);
7819 PyModule_AddIntMacro(m, SCM_J1939_PRIO);
7820 PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE);
7821
7822 PyModule_AddIntMacro(m, J1939_NLA_PAD);
7823 PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED);
7824
7825 PyModule_AddIntMacro(m, J1939_EE_INFO_NONE);
7826 PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT);
7827
7828 PyModule_AddIntMacro(m, J1939_FILTER_MAX);
7829#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007830#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007831 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007832#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007833#ifdef HAVE_SOCKADDR_ALG
7834 PyModule_AddIntMacro(m, SOL_ALG);
7835#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007836#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007837 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007838#endif
7839#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007840 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007841#endif
7842#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007843 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007844#endif
7845#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007846 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007847#endif
7848#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007849 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007850#endif
7851#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007852 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007854#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007855 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007856#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007857 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007859#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007860 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007862#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007863 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007864#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007865 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007873#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007879#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007884#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007887#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007890#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007893#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007894 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007895#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007896 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007897#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007898#ifdef IPPROTO_UDPLITE
7899 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7900 #ifndef UDPLITE_SEND_CSCOV
7901 #define UDPLITE_SEND_CSCOV 10
7902 #endif
7903 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7904 #ifndef UDPLITE_RECV_CSCOV
7905 #define UDPLITE_RECV_CSCOV 11
7906 #endif
7907 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007910 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007912#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007913 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007915#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007918#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007921#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007924#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007927#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007930#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007931 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007933#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007934 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007936#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007939#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007940 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007942#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007943 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007945#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007948#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007951#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007954#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007955 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007957#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007958 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007960#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007961 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007963#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007965#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007966#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007969#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007970 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007971#endif
7972/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007974 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007976 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007980#endif
7981
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007982#ifdef MS_WINDOWS
7983 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7984 PyModule_AddIntMacro(m, IPPROTO_ST);
7985 PyModule_AddIntMacro(m, IPPROTO_CBT);
7986 PyModule_AddIntMacro(m, IPPROTO_IGP);
7987 PyModule_AddIntMacro(m, IPPROTO_RDP);
7988 PyModule_AddIntMacro(m, IPPROTO_PGM);
7989 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7990 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7991#endif
7992
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007993#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007994 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007995#endif
7996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997 /* Some port configuration */
7998#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008000#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008001 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008003#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008004 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008005#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008006 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008007#endif
8008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008009 /* Some reserved IP v.4 addresses */
8010#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008012#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008013 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008014#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008016 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008017#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008018 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008020#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008021 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008022#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008023 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008025#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008026 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008027#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008028 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008030#ifdef INADDR_ALLHOSTS_GROUP
8031 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
8032 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008033#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008034 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008036#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008037 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008038#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008039 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008040#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008041#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008042 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008043#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008044 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00008045#endif
8046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008047 /* IPv4 [gs]etsockopt options */
8048#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008049 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008051#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008052 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008054#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008055 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008057#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008058 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008060#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008061 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008063#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008064 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008066#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008067 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008069#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008070 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008072#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008073 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008075#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008076 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008078#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008079 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008081#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008082 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008084#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008085 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00008086#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008087#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008088 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00008089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008090#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008091 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00008092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008093#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008094 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00008095#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01008096#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008097 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01008098#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008100 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
8101#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008102 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008104#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008105 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008107#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008108 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008110#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008111 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008113#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008114 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008116#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008117 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008119 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008120#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008121 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008123 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00008124#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008126#endif
8127#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008129#endif
8130#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008132#endif
8133#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008135#endif
8136#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008138#endif
8139#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008141#endif
8142#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008143 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008144#endif
8145#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008146 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008147#endif
8148#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008149 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008150#endif
8151#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008152 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008153#endif
8154#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008155 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008156#endif
8157#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008158 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008159#endif
8160#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008161 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008162#endif
8163#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008165#endif
8166#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008168#endif
8169#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008171#endif
8172#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008173 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008174#endif
8175#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008176 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008177#endif
8178#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008180#endif
8181#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008182 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008183#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008185 /* TCP options */
8186#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008187 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008189#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008190 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008192#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008193 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008195#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008196 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008198#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008199 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008201#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008202 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008204#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008205 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008207#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008208 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008210#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008211 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008213#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008216#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008217 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008219#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008221#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008222#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008224#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008225#ifdef TCP_CONGESTION
8226 PyModule_AddIntMacro(m, TCP_CONGESTION);
8227#endif
8228#ifdef TCP_USER_TIMEOUT
8229 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8230#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008231#ifdef TCP_NOTSENT_LOWAT
8232 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8233#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008235 /* IPX options */
8236#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008237 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008238#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008239
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008240/* Reliable Datagram Sockets */
8241#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008242 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008243#endif
8244#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008245 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008246#endif
8247#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008248 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008249#endif
8250#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008251 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008252#endif
8253#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008254 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008255#endif
8256#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008257 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008258#endif
8259#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008260 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008261#endif
8262#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008263 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008264#endif
8265#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008266 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008267#endif
8268#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008269 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008270#endif
8271#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008272 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008273#endif
8274#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008275 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008276#endif
8277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008278 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008279#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008280 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008281#endif
8282#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008283 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008284#endif
8285#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008287#endif
8288#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008289 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008290#endif
8291#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008292 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008293#endif
8294#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008295 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008296#endif
8297#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008298 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008299#endif
8300#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008301 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008302#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008303#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008304 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008305#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008306#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008307 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008308#endif
8309#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008310 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008311#endif
8312#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008313 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008314#endif
8315#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008316 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008317#endif
8318#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008319 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008320#endif
8321#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008322 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008323#endif
8324#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008325 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008326#endif
8327#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008328 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008329#endif
8330#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008331 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008332#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008333#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008334 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008335#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008336#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008337 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008338#endif
8339#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008340 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008341#endif
8342#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008343 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008344#endif
8345#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008346 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008347#endif
8348#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008349 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008350#endif
8351#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008352 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008353#endif
8354#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008355 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008356#endif
8357#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008358 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008359#endif
8360#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008361 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008362#endif
8363#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008364 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008365#endif
8366#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008367 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008368#endif
8369#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008370 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008371#endif
8372#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008373 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008374#endif
8375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008376 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008377#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008378 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008379#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008380 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008381#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008382 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008383#endif
8384#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008385 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008386#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008387 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008388#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008389 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008390#endif
8391#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008392 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008393#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008394 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008395#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008396 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008397#endif
8398
Christian Heimesfaf2f632008-01-06 16:59:19 +00008399#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008400 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008401 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8402#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008403 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008404#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008405 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008406 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8407#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008408 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008409#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008410 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008411 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008412 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008413 PyObject *tmp;
8414 tmp = PyLong_FromUnsignedLong(codes[i]);
8415 if (tmp == NULL)
8416 return NULL;
8417 PyModule_AddObject(m, names[i], tmp);
8418 }
8419 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008420 PyModule_AddIntMacro(m, RCVALL_OFF);
8421 PyModule_AddIntMacro(m, RCVALL_ON);
8422 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008423#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008424 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008425#endif
8426#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008427 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008428#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008429#endif /* _MSTCPIP_ */
8430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008431 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008432#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008433 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008434#endif
animalize19e7d482018-02-27 02:10:36 +08008435
8436#ifdef MS_WINDOWS
8437 /* remove some flags on older version Windows during run-time */
8438 remove_unusable_flags(m);
8439#endif
8440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008441 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008442}