blob: 73e64f235a6f2d708f2cd244e2bc9250293ce9ba [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"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000104#include "structmember.h"
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\
149setblocking(0 | 1) -- 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
237#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000239#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241
Serhiy Storchakad3187152017-11-09 18:00:38 +0200242#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243# include <sys/ioctl.h>
244#endif
245
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248/* make sure that the reentrant (gethostbyaddr_r etc)
249 functions are declared correctly if compiling with
250 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Thomas Wouters477c8d52006-05-27 19:21:47 +0000252/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000255#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000256
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000257#undef _XOPEN_SOURCE
258#include <sys/socket.h>
259#include <sys/types.h>
260#include <netinet/in.h>
261#ifdef _SS_ALIGNSIZE
262#define HAVE_GETADDRINFO 1
263#define HAVE_GETNAMEINFO 1
264#endif
265
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000266#define HAVE_INET_PTON
267#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000268#endif
269
Benjamin Peterson06930632017-09-04 16:36:05 -0700270/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100271#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000272#define INET_ADDRSTRLEN 16
273#endif
274
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000276#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000277#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000278#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700280#ifdef HAVE_SYS_SOCKET_H
281#include <sys/socket.h>
282#endif
283
284#ifdef HAVE_NET_IF_H
285#include <net/if.h>
286#endif
287
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000288/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000290#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291
292/* Addressing includes */
293
Guido van Rossum6f489d91996-06-28 20:15:15 +0000294#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295
296/* Non-MS WINDOWS includes */
297# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000298# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000299
Guido van Rossum9376b741999-09-15 22:01:40 +0000300/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000305#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000308# ifdef HAVE_FCNTL_H
309# include <fcntl.h>
310# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100312/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
313#ifdef MS_WINDOWS
314#define IPPROTO_ICMP IPPROTO_ICMP
315#define IPPROTO_IGMP IPPROTO_IGMP
316#define IPPROTO_GGP IPPROTO_GGP
317#define IPPROTO_TCP IPPROTO_TCP
318#define IPPROTO_PUP IPPROTO_PUP
319#define IPPROTO_UDP IPPROTO_UDP
320#define IPPROTO_IDP IPPROTO_IDP
321#define IPPROTO_ND IPPROTO_ND
322#define IPPROTO_RAW IPPROTO_RAW
323#define IPPROTO_MAX IPPROTO_MAX
324#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
325#define IPPROTO_IPV4 IPPROTO_IPV4
326#define IPPROTO_IPV6 IPPROTO_IPV6
327#define IPPROTO_ROUTING IPPROTO_ROUTING
328#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
329#define IPPROTO_ESP IPPROTO_ESP
330#define IPPROTO_AH IPPROTO_AH
331#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
332#define IPPROTO_NONE IPPROTO_NONE
333#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
334#define IPPROTO_EGP IPPROTO_EGP
335#define IPPROTO_PIM IPPROTO_PIM
336#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
337#define IPPROTO_ST IPPROTO_ST // WinSock2 only
338#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
339#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
340#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
341#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
342#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
343#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
344#endif /* MS_WINDOWS */
345
Steve Dower65e4cb12014-11-22 12:54:57 -0800346/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200347#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600348// For if_nametoindex() and if_indextoname()
349#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800350
animalize19e7d482018-02-27 02:10:36 +0800351/* remove some flags on older version Windows during run-time.
352 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
353typedef struct {
354 DWORD build_number; /* available starting with this Win10 BuildNumber */
355 const char flag_name[20];
356} FlagRuntimeInfo;
357
358/* IMPORTANT: make sure the list ordered by descending build_number */
359static FlagRuntimeInfo win_runtime_flags[] = {
360 /* available starting with Windows 10 1709 */
361 {16299, "TCP_KEEPIDLE"},
362 {16299, "TCP_KEEPINTVL"},
363 /* available starting with Windows 10 1703 */
364 {15063, "TCP_KEEPCNT"},
365 /* available starting with Windows 10 1607 */
366 {14393, "TCP_FASTOPEN"}
367};
368
369static void
370remove_unusable_flags(PyObject *m)
371{
372 PyObject *dict;
373 OSVERSIONINFOEX info;
374 DWORDLONG dwlConditionMask;
375
376 dict = PyModule_GetDict(m);
377 if (dict == NULL) {
378 return;
379 }
380
381 /* set to Windows 10, except BuildNumber. */
382 memset(&info, 0, sizeof(info));
383 info.dwOSVersionInfoSize = sizeof(info);
384 info.dwMajorVersion = 10;
385 info.dwMinorVersion = 0;
386
387 /* set Condition Mask */
388 dwlConditionMask = 0;
389 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
390 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
391 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
392
393 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
394 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100395 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800396 Compatibility Mode will not cheat VerifyVersionInfo(...) */
397 if (VerifyVersionInfo(
398 &info,
399 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
400 dwlConditionMask)) {
401 break;
402 }
403 else {
404 if (PyDict_GetItemString(
405 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200406 win_runtime_flags[i].flag_name) != NULL)
407 {
408 if (PyDict_DelItemString(
409 dict,
410 win_runtime_flags[i].flag_name))
411 {
412 PyErr_Clear();
413 }
animalize19e7d482018-02-27 02:10:36 +0800414 }
415 }
416 }
417}
418
Jeremy Hylton22308652001-02-02 03:23:09 +0000419#endif
420
Skip Montanaro7befb992004-02-10 16:50:21 +0000421#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000422
Neal Norwitz39d22e52002-11-02 19:55:21 +0000423#ifndef O_NONBLOCK
424# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000425#endif
426
Trent Micka708d6e2004-09-07 17:48:26 +0000427/* include Python's addrinfo.h unless it causes trouble */
428#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
429 /* Do not include addinfo.h on some newer IRIX versions.
430 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
431 * for example, but not by 6.5.10.
432 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000433#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000434 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
435 * EAI_* constants are defined in (the already included) ws2tcpip.h.
436 */
437#else
438# include "addrinfo.h"
439#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000440
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000441#ifdef __APPLE__
442/* On OS X, getaddrinfo returns no error indication of lookup
443 failure, so we must use the emulation instead of the libinfo
444 implementation. Unfortunately, performing an autoconf test
445 for this bug would require DNS access for the machine performing
446 the configuration, which is not acceptable. Therefore, we
447 determine the bug just by checking for __APPLE__. If this bug
448 gets ever fixed, perhaps checking for sys/version.h would be
449 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000450#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600451/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000452 Find to check for Jaguar is that it has getnameinfo(), which
453 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000454#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000455#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000456
457#ifdef HAVE_INET_ATON
458#define USE_INET_ATON_WEAKLINK
459#endif
460
Jack Jansen84262fb2002-07-02 14:40:42 +0000461#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000462
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000463/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000464#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000465/* avoid clashes with the C library definition of the symbol. */
466#define getaddrinfo fake_getaddrinfo
467#define gai_strerror fake_gai_strerror
468#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000469#include "getaddrinfo.c"
470#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000471#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000472#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000473#include "getnameinfo.c"
474#endif
475
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000476#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000477#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000478#endif
479
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000481#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482#define EAFNOSUPPORT WSAEAFNOSUPPORT
483#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000484#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000485
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000486#ifndef SOCKETCLOSE
487#define SOCKETCLOSE close
488#endif
489
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000490#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000491#define USE_BLUETOOTH 1
492#if defined(__FreeBSD__)
493#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
494#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000495#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000496#define SOL_HCI SOL_HCI_RAW
497#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000498#define sockaddr_l2 sockaddr_l2cap
499#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000501#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
502#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000503#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000504#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000505#define sockaddr_l2 sockaddr_bt
506#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000507#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000508#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000509#define SOL_HCI BTPROTO_HCI
510#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000511#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
512#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000513#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000515#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000516#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
517#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000518#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000519#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
520#endif
521#endif
522
Charles-François Natali8b759652011-12-23 16:44:51 +0100523/* Convert "sock_addr_t *" to "struct sockaddr *". */
524#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000525
Martin v. Löwise9416172003-05-03 10:12:45 +0000526/*
527 * Constants for getnameinfo()
528 */
529#if !defined(NI_MAXHOST)
530#define NI_MAXHOST 1025
531#endif
532#if !defined(NI_MAXSERV)
533#define NI_MAXSERV 32
534#endif
535
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000536#ifndef INVALID_SOCKET /* MS defines this */
537#define INVALID_SOCKET (-1)
538#endif
539
Charles-François Natali0cc86852013-09-13 19:53:08 +0200540#ifndef INADDR_NONE
541#define INADDR_NONE (-1)
542#endif
543
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000544/* XXX There's a problem here: *static* functions are not supposed to have
545 a Py prefix (or use CapitalizedWords). Later... */
546
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547/* Global variable holding the exception type for errors detected
548 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000549static PyObject *socket_herror;
550static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000551static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000552
Tim Peters643a7fc2002-02-17 04:13:21 +0000553/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000554 The sock_type variable contains pointers to various functions,
555 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000556 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000557static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000558
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000559#if defined(HAVE_POLL_H)
560#include <poll.h>
561#elif defined(HAVE_SYS_POLL_H)
562#include <sys/poll.h>
563#endif
564
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000565/* Largest value to try to store in a socklen_t (used when handling
566 ancillary data). POSIX requires socklen_t to hold at least
567 (2**31)-1 and recommends against storing larger values, but
568 socklen_t was originally int in the BSD interface, so to be on the
569 safe side we use the smaller of (2**31)-1 and INT_MAX. */
570#if INT_MAX > 0x7fffffff
571#define SOCKLEN_T_LIMIT 0x7fffffff
572#else
573#define SOCKLEN_T_LIMIT INT_MAX
574#endif
575
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200576#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000577/* Instead of select(), we'll use poll() since poll() works on any fd. */
578#define IS_SELECTABLE(s) 1
579/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000580#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200581/* If there's no timeout left, we don't have to call select, so it's a safe,
582 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100583#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000584#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000585
586static PyObject*
587select_error(void)
588{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200589 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000591}
592
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000593#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000594#ifndef WSAEAGAIN
595#define WSAEAGAIN WSAEWOULDBLOCK
596#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000597#define CHECK_ERRNO(expected) \
598 (WSAGetLastError() == WSA ## expected)
599#else
600#define CHECK_ERRNO(expected) \
601 (errno == expected)
602#endif
603
Victor Stinnerdaf45552013-08-28 00:53:59 +0200604#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200605# define GET_SOCK_ERROR WSAGetLastError()
606# define SET_SOCK_ERROR(err) WSASetLastError(err)
607# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
608# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
609#else
610# define GET_SOCK_ERROR errno
611# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
612# define SOCK_TIMEOUT_ERR EWOULDBLOCK
613# define SOCK_INPROGRESS_ERR EINPROGRESS
614#endif
615
Erik Janssens874809e2018-09-05 08:29:42 +0200616#ifdef _MSC_VER
617# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
618#else
619# define SUPPRESS_DEPRECATED_CALL
620#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200621
622#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200623/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
624static int support_wsa_no_inherit = -1;
625#endif
626
Guido van Rossum30a685f1991-06-27 15:51:29 +0000627/* Convenience function to raise an error according to errno
628 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629
Guido van Rossum73624e91994-10-10 17:59:00 +0000630static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000631set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000633#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 int err_no = WSAGetLastError();
635 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
636 recognizes the error codes used by both GetLastError() and
637 WSAGetLastError */
638 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200639 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000640#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000641
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200642 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643}
644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000647set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650
651#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (v != NULL) {
657 PyErr_SetObject(socket_herror, v);
658 Py_DECREF(v);
659 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662}
663
664
665static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000666set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669
Martin v. Löwis272cb402002-03-01 08:31:07 +0000670#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 /* EAI_SYSTEM is not available on Windows XP. */
672 if (error == EAI_SYSTEM)
673 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000674#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000676#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 if (v != NULL) {
682 PyErr_SetObject(socket_gaierror, v);
683 Py_DECREF(v);
684 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687}
688
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000689/* Function to perform the setting of socket blocking mode
690 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691static int
692internal_setblocking(PySocketSockObject *s, int block)
693{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400694 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200695#ifdef MS_WINDOWS
696 u_long arg;
697#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100698#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100699 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100700 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000701#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000704#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100705#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200707 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400708 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100709#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200711 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400712 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100714 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 else
Victor Stinner9a954832013-12-04 00:41:24 +0100716 new_delay_flag = delay_flag | O_NONBLOCK;
717 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200718 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400719 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100720#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000721#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200722 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200723 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400724 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000725#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400726
727 result = 0;
728
729 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Yury Selivanovfa22b292016-10-18 16:03:52 -0400732 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200733#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400734 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200735#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400736 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200737#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400738 }
739
740 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000741}
742
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000743static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200744internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
745 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100748#ifdef HAVE_POLL
749 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200750 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100751#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200752 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200753 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100754#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000755
Victor Stinnerb7df3142015-03-27 22:59:32 +0100756 /* must be called with the GIL held */
757 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100758
Victor Stinner416f2e62015-03-31 13:56:29 +0200759 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200763 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* Prefer poll, if available, since you can poll() any fd
767 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000768#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100769 pollfd.fd = s->sock_fd;
770 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 if (connect) {
772 /* On Windows, the socket becomes writable on connection success,
773 but a connection failure is notified as an error. On POSIX, the
774 socket becomes writable on connection success or on connection
775 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200776 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000778
Victor Stinner71694d52015-03-28 01:18:54 +0100779 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200780 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200781 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000782
Victor Stinner71694d52015-03-28 01:18:54 +0100783 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200784 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100785 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000786#else
Victor Stinnerced11742015-04-09 10:27:25 +0200787 if (interval >= 0) {
788 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
789 tvp = &tv;
790 }
791 else
792 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793
Victor Stinner71694d52015-03-28 01:18:54 +0100794 FD_ZERO(&fds);
795 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200796 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 if (connect) {
798 /* On Windows, the socket becomes writable on connection success,
799 but a connection failure is notified as an error. On POSIX, the
800 socket becomes writable on connection success or on connection
801 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200802 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 }
Victor Stinner71694d52015-03-28 01:18:54 +0100804
805 /* See if the socket is ready */
806 Py_BEGIN_ALLOW_THREADS;
807 if (writing)
808 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200809 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100810 else
811 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200812 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100813 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000814#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 if (n < 0)
817 return -1;
818 if (n == 0)
819 return 1;
820 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000821}
822
Victor Stinner31bf2d52015-04-01 21:57:09 +0200823/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000824
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 On error, raise an exception and return -1 if err is set, or fill err and
826 return -1 otherwise. If a signal was received and the signal handler raised
827 an exception, return -1, and set err to -1 if err is set.
828
829 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100830
Victor Stinner31bf2d52015-04-01 21:57:09 +0200831 If the socket has a timeout, wait until the socket is ready before calling
832 the function: wait until the socket is writable if writing is nonzero, wait
833 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100834
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200836 the function, except if the signal handler raised an exception (PEP 475).
837
838 When the function is retried, recompute the timeout using a monotonic clock.
839
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 sock_call_ex() must be called with the GIL held. The socket function is
841 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200843sock_call_ex(PySocketSockObject *s,
844 int writing,
845 int (*sock_func) (PySocketSockObject *s, void *data),
846 void *data,
847 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200848 int *err,
849 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850{
Victor Stinner8912d142015-04-06 23:16:34 +0200851 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200852 _PyTime_t deadline = 0;
853 int deadline_initialized = 0;
854 int res;
855
856 /* sock_call() must be called with the GIL held. */
857 assert(PyGILState_Check());
858
859 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200862 /* For connect(), poll even for blocking socket. The connection
863 runs asynchronously. */
864 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200865 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200866 _PyTime_t interval;
867
Victor Stinner81c41db2015-04-02 11:50:57 +0200868 if (deadline_initialized) {
869 /* recompute the timeout */
870 interval = deadline - _PyTime_GetMonotonicClock();
871 }
872 else {
873 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200874 deadline = _PyTime_GetMonotonicClock() + timeout;
875 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200877
Victor Stinner10550cd2015-04-03 13:22:27 +0200878 if (interval >= 0)
879 res = internal_select(s, writing, interval, connect);
880 else
881 res = 1;
882 }
883 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200884 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200885 }
886
Victor Stinner31bf2d52015-04-01 21:57:09 +0200887 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200888 if (err)
889 *err = GET_SOCK_ERROR;
890
Victor Stinner31bf2d52015-04-01 21:57:09 +0200891 if (CHECK_ERRNO(EINTR)) {
892 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200893 if (PyErr_CheckSignals()) {
894 if (err)
895 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200896 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200897 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898
899 /* retry select() */
900 continue;
901 }
902
903 /* select() failed */
904 s->errorhandler();
905 return -1;
906 }
907
908 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200909 if (err)
910 *err = SOCK_TIMEOUT_ERR;
911 else
912 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200913 return -1;
914 }
915
916 /* the socket is ready */
917 }
918
Victor Stinner81c41db2015-04-02 11:50:57 +0200919 /* inner loop to retry sock_func() when sock_func() is interrupted
920 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200921 while (1) {
922 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200923 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200924 Py_END_ALLOW_THREADS
925
926 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200927 /* sock_func() succeeded */
928 if (err)
929 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200930 return 0;
931 }
932
Victor Stinner81c41db2015-04-02 11:50:57 +0200933 if (err)
934 *err = GET_SOCK_ERROR;
935
Victor Stinner31bf2d52015-04-01 21:57:09 +0200936 if (!CHECK_ERRNO(EINTR))
937 break;
938
Victor Stinner81c41db2015-04-02 11:50:57 +0200939 /* sock_func() was interrupted by a signal */
940 if (PyErr_CheckSignals()) {
941 if (err)
942 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200943 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200944 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200945
Victor Stinner81c41db2015-04-02 11:50:57 +0200946 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200947 }
948
949 if (s->sock_timeout > 0
950 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200951 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200952
953 For example, select() could indicate a socket is ready for
954 reading, but the data then discarded by the OS because of a
955 wrong checksum.
956
957 Loop on select() to recheck for socket readyness. */
958 continue;
959 }
960
Victor Stinner81c41db2015-04-02 11:50:57 +0200961 /* sock_func() failed */
962 if (!err)
963 s->errorhandler();
964 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000965 return -1;
966 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200967}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000968
Victor Stinner81c41db2015-04-02 11:50:57 +0200969static int
970sock_call(PySocketSockObject *s,
971 int writing,
972 int (*func) (PySocketSockObject *s, void *data),
973 void *data)
974{
Victor Stinner8912d142015-04-06 23:16:34 +0200975 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200976}
977
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000978
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000979/* Initialize a new socket object. */
980
Victor Stinner88ed6402015-04-09 10:23:12 +0200981/* Default timeout for new sockets */
982static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000983
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200984static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000985init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 s->sock_fd = fd;
989 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500992
993 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
994 on some OSes as part of socket.type. We want to reset them here,
995 to make socket.type be set to the same value on all platforms.
996 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
997 not portable.
998 */
999#ifdef SOCK_NONBLOCK
1000 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
1001#endif
1002#ifdef SOCK_CLOEXEC
1003 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1004#endif
1005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001009#ifdef SOCK_NONBLOCK
1010 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001011 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001012 else
1013#endif
1014 {
1015 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001016 if (defaulttimeout >= 0) {
1017 if (internal_setblocking(s, 0) == -1) {
1018 return -1;
1019 }
1020 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001021 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001022 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001023}
1024
1025
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026/* Create a new socket object.
1027 This just creates the object and initializes it.
1028 If the creation fails, return NULL and set an exception (implicit
1029 in NEWOBJ()). */
1030
Guido van Rossum73624e91994-10-10 17:59:00 +00001031static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001032new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 PySocketSockObject *s;
1035 s = (PySocketSockObject *)
1036 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001037 if (s == NULL)
1038 return NULL;
1039 if (init_sockobject(s, fd, family, type, proto) == -1) {
1040 Py_DECREF(s);
1041 return NULL;
1042 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044}
1045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046
Guido van Rossum48a680c2001-03-02 06:34:14 +00001047/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001048 thread to be in gethostbyname or getaddrinfo */
1049#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001050static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001051#endif
1052
1053
Guido van Rossum30a685f1991-06-27 15:51:29 +00001054/* Convert a string specifying a host name or one of a few symbolic
1055 names to a numeric IP address. This usually calls gethostbyname()
1056 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001057 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001058 an error occurred; then an exception is raised. */
1059
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001060static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001061setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 struct addrinfo hints, *res;
1064 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1067 if (name[0] == '\0') {
1068 int siz;
1069 memset(&hints, 0, sizeof(hints));
1070 hints.ai_family = af;
1071 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1072 hints.ai_flags = AI_PASSIVE;
1073 Py_BEGIN_ALLOW_THREADS
1074 ACQUIRE_GETADDRINFO_LOCK
1075 error = getaddrinfo(NULL, "0", &hints, &res);
1076 Py_END_ALLOW_THREADS
1077 /* We assume that those thread-unsafe getaddrinfo() versions
1078 *are* safe regarding their return value, ie. that a
1079 subsequent call to getaddrinfo() does not destroy the
1080 outcome of the first call. */
1081 RELEASE_GETADDRINFO_LOCK
1082 if (error) {
1083 set_gaierror(error);
1084 return -1;
1085 }
1086 switch (res->ai_family) {
1087 case AF_INET:
1088 siz = 4;
1089 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001090#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case AF_INET6:
1092 siz = 16;
1093 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 default:
1096 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001097 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 "unsupported address family");
1099 return -1;
1100 }
1101 if (res->ai_next) {
1102 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001103 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 "wildcard resolved to multiple address");
1105 return -1;
1106 }
1107 if (res->ai_addrlen < addr_ret_size)
1108 addr_ret_size = res->ai_addrlen;
1109 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1110 freeaddrinfo(res);
1111 return siz;
1112 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001113 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001114 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001115 if (strcmp(name, "255.255.255.255") == 0 ||
1116 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 struct sockaddr_in *sin;
1118 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001119 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 "address family mismatched");
1121 return -1;
1122 }
1123 sin = (struct sockaddr_in *)addr_ret;
1124 memset((void *) sin, '\0', sizeof(*sin));
1125 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001126#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 sin->sin_addr.s_addr = INADDR_BROADCAST;
1130 return sizeof(sin->sin_addr);
1131 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001132
1133 /* avoid a name resolution in case of numeric address */
1134#ifdef HAVE_INET_PTON
1135 /* check for an IPv4 address */
1136 if (af == AF_UNSPEC || af == AF_INET) {
1137 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1138 memset(sin, 0, sizeof(*sin));
1139 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1140 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001141#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001142 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001143#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001144 return 4;
1145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001147#ifdef ENABLE_IPV6
1148 /* check for an IPv6 address - if the address contains a scope ID, we
1149 * fallback to getaddrinfo(), which can handle translation from interface
1150 * name to interface index */
1151 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1152 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1153 memset(sin, 0, sizeof(*sin));
1154 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1155 sin->sin6_family = AF_INET6;
1156#ifdef HAVE_SOCKADDR_SA_LEN
1157 sin->sin6_len = sizeof(*sin);
1158#endif
1159 return 16;
1160 }
1161 }
1162#endif /* ENABLE_IPV6 */
1163#else /* HAVE_INET_PTON */
1164 /* check for an IPv4 address */
1165 if (af == AF_INET || af == AF_UNSPEC) {
1166 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1167 memset(sin, 0, sizeof(*sin));
1168 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1169 sin->sin_family = AF_INET;
1170#ifdef HAVE_SOCKADDR_SA_LEN
1171 sin->sin_len = sizeof(*sin);
1172#endif
1173 return 4;
1174 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001175 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001176#endif /* HAVE_INET_PTON */
1177
1178 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 memset(&hints, 0, sizeof(hints));
1180 hints.ai_family = af;
1181 Py_BEGIN_ALLOW_THREADS
1182 ACQUIRE_GETADDRINFO_LOCK
1183 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001184#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 if (error == EAI_NONAME && af == AF_UNSPEC) {
1186 /* On Tru64 V5.1, numeric-to-addr conversion fails
1187 if no address family is given. Assume IPv4 for now.*/
1188 hints.ai_family = AF_INET;
1189 error = getaddrinfo(name, NULL, &hints, &res);
1190 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 Py_END_ALLOW_THREADS
1193 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1194 if (error) {
1195 set_gaierror(error);
1196 return -1;
1197 }
1198 if (res->ai_addrlen < addr_ret_size)
1199 addr_ret_size = res->ai_addrlen;
1200 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1201 freeaddrinfo(res);
1202 switch (addr_ret->sa_family) {
1203 case AF_INET:
1204 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001205#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 case AF_INET6:
1207 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001210 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 return -1;
1212 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213}
1214
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Коренберг Марк7766b962018-02-13 00:47:42 +05001216/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
Guido van Rossum73624e91994-10-10 17:59:00 +00001218static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001219make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001220{
Коренберг Марк7766b962018-02-13 00:47:42 +05001221 char buf[INET_ADDRSTRLEN];
1222 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1223 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return NULL;
1225 }
1226 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227}
1228
Коренберг Марк7766b962018-02-13 00:47:42 +05001229#ifdef ENABLE_IPV6
1230/* Convert IPv6 sockaddr to a Python str. */
1231
1232static PyObject *
1233make_ipv6_addr(const struct sockaddr_in6 *addr)
1234{
1235 char buf[INET6_ADDRSTRLEN];
1236 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1237 PyErr_SetFromErrno(PyExc_OSError);
1238 return NULL;
1239 }
1240 return PyUnicode_FromString(buf);
1241}
1242#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001244#ifdef USE_BLUETOOTH
1245/* Convert a string representation of a Bluetooth address into a numeric
1246 address. Returns the length (6), or raises an exception and returns -1 if
1247 an error occurred. */
1248
1249static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001250setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 unsigned int b0, b1, b2, b3, b4, b5;
1253 char ch;
1254 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1257 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1258 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1259 bdaddr->b[0] = b0;
1260 bdaddr->b[1] = b1;
1261 bdaddr->b[2] = b2;
1262 bdaddr->b[3] = b3;
1263 bdaddr->b[4] = b4;
1264 bdaddr->b[5] = b5;
1265 return 6;
1266 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001267 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 return -1;
1269 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001270}
1271
1272/* Create a string representation of the Bluetooth address. This is always a
1273 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1274 value (zero padded if necessary). */
1275
1276static PyObject *
1277makebdaddr(bdaddr_t *bdaddr)
1278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1282 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1283 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1284 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001285}
1286#endif
1287
1288
Guido van Rossum30a685f1991-06-27 15:51:29 +00001289/* Create an object representing the given socket address,
1290 suitable for passing it back to bind(), connect() etc.
1291 The family field of the sockaddr structure is inspected
1292 to determine what kind of address it really is. */
1293
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001295static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001296makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 if (addrlen == 0) {
1299 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001300 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_INET:
1306 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001307 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1308 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 PyObject *ret = NULL;
1310 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1312 Py_DECREF(addrobj);
1313 }
1314 return ret;
1315 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001316
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001317#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 case AF_UNIX:
1319 {
1320 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001321#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001322 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1323 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1324 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 }
1326 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001327#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 {
1329 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001330 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 }
1332 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001333#endif /* AF_UNIX */
1334
Martin v. Löwis11017b12006-01-14 18:12:57 +00001335#if defined(AF_NETLINK)
1336 case AF_NETLINK:
1337 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1339 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001340 }
1341#endif /* AF_NETLINK */
1342
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001343#if defined(AF_QIPCRTR)
1344 case AF_QIPCRTR:
1345 {
1346 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1347 return Py_BuildValue("II", a->sq_node, a->sq_port);
1348 }
1349#endif /* AF_QIPCRTR */
1350
caaveryeffc12f2017-09-06 18:18:10 -04001351#if defined(AF_VSOCK)
1352 case AF_VSOCK:
1353 {
1354 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1355 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1356 }
1357#endif /* AF_VSOCK */
1358
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001359#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 case AF_INET6:
1361 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001362 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1363 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 PyObject *ret = NULL;
1365 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001366 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 addrobj,
1368 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001369 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 a->sin6_scope_id);
1371 Py_DECREF(addrobj);
1372 }
1373 return ret;
1374 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001375#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001377#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 case AF_BLUETOOTH:
1379 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 case BTPROTO_L2CAP:
1382 {
1383 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1384 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1385 PyObject *ret = NULL;
1386 if (addrobj) {
1387 ret = Py_BuildValue("Oi",
1388 addrobj,
1389 _BT_L2_MEMB(a, psm));
1390 Py_DECREF(addrobj);
1391 }
1392 return ret;
1393 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 case BTPROTO_RFCOMM:
1396 {
1397 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1398 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1399 PyObject *ret = NULL;
1400 if (addrobj) {
1401 ret = Py_BuildValue("Oi",
1402 addrobj,
1403 _BT_RC_MEMB(a, channel));
1404 Py_DECREF(addrobj);
1405 }
1406 return ret;
1407 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 case BTPROTO_HCI:
1410 {
1411 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001412#if defined(__NetBSD__) || defined(__DragonFly__)
1413 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001414#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 PyObject *ret = NULL;
1416 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1417 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001418#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001420
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001421#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 case BTPROTO_SCO:
1423 {
1424 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1425 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1426 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001427#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 default:
1430 PyErr_SetString(PyExc_ValueError,
1431 "Unknown Bluetooth protocol");
1432 return NULL;
1433 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001434#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001435
Antoine Pitroub156a462010-10-27 20:13:57 +00001436#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 case AF_PACKET:
1438 {
1439 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001440 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 struct ifreq ifr;
1442 /* need to look up interface name give index */
1443 if (a->sll_ifindex) {
1444 ifr.ifr_ifindex = a->sll_ifindex;
1445 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1446 ifname = ifr.ifr_name;
1447 }
1448 return Py_BuildValue("shbhy#",
1449 ifname,
1450 ntohs(a->sll_protocol),
1451 a->sll_pkttype,
1452 a->sll_hatype,
1453 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001454 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001456#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001457
Christian Heimes043d6f62008-01-07 17:19:16 +00001458#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 case AF_TIPC:
1460 {
1461 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1462 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1463 return Py_BuildValue("IIIII",
1464 a->addrtype,
1465 a->addr.nameseq.type,
1466 a->addr.nameseq.lower,
1467 a->addr.nameseq.upper,
1468 a->scope);
1469 } else if (a->addrtype == TIPC_ADDR_NAME) {
1470 return Py_BuildValue("IIIII",
1471 a->addrtype,
1472 a->addr.name.name.type,
1473 a->addr.name.name.instance,
1474 a->addr.name.name.instance,
1475 a->scope);
1476 } else if (a->addrtype == TIPC_ADDR_ID) {
1477 return Py_BuildValue("IIIII",
1478 a->addrtype,
1479 a->addr.id.node,
1480 a->addr.id.ref,
1481 0,
1482 a->scope);
1483 } else {
1484 PyErr_SetString(PyExc_ValueError,
1485 "Invalid address type");
1486 return NULL;
1487 }
1488 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001489#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001490
Serhiy Storchakad3187152017-11-09 18:00:38 +02001491#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001492 case AF_CAN:
1493 {
1494 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001495 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001496 struct ifreq ifr;
1497 /* need to look up interface name given index */
1498 if (a->can_ifindex) {
1499 ifr.ifr_ifindex = a->can_ifindex;
1500 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1501 ifname = ifr.ifr_name;
1502 }
1503
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001504 switch (proto) {
1505#ifdef CAN_ISOTP
1506 case CAN_ISOTP:
1507 {
1508 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1509 ifname,
1510 a->can_addr.tp.rx_id,
1511 a->can_addr.tp.tx_id);
1512 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001513#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001514 default:
1515 {
1516 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1517 ifname);
1518 }
1519 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001520 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001521#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001522
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001523#ifdef PF_SYSTEM
1524 case PF_SYSTEM:
1525 switch(proto) {
1526#ifdef SYSPROTO_CONTROL
1527 case SYSPROTO_CONTROL:
1528 {
1529 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1530 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1531 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001532#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001533 default:
1534 PyErr_SetString(PyExc_ValueError,
1535 "Invalid address type");
1536 return 0;
1537 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001538#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001539
Christian Heimesdffa3942016-09-05 23:54:41 +02001540#ifdef HAVE_SOCKADDR_ALG
1541 case AF_ALG:
1542 {
1543 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1544 return Py_BuildValue("s#s#HH",
1545 a->salg_type,
1546 strnlen((const char*)a->salg_type,
1547 sizeof(a->salg_type)),
1548 a->salg_name,
1549 strnlen((const char*)a->salg_name,
1550 sizeof(a->salg_name)),
1551 a->salg_feat,
1552 a->salg_mask);
1553 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001554#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 default:
1559 /* If we don't know the address family, don't raise an
1560 exception -- return it as an (int, bytes) tuple. */
1561 return Py_BuildValue("iy#",
1562 addr->sa_family,
1563 addr->sa_data,
1564 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567}
1568
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001569/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1570 (in particular, numeric IP addresses). */
1571struct maybe_idna {
1572 PyObject *obj;
1573 char *buf;
1574};
1575
1576static void
1577idna_cleanup(struct maybe_idna *data)
1578{
1579 Py_CLEAR(data->obj);
1580}
1581
1582static int
1583idna_converter(PyObject *obj, struct maybe_idna *data)
1584{
1585 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001586 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001587 if (obj == NULL) {
1588 idna_cleanup(data);
1589 return 1;
1590 }
1591 data->obj = NULL;
1592 len = -1;
1593 if (PyBytes_Check(obj)) {
1594 data->buf = PyBytes_AsString(obj);
1595 len = PyBytes_Size(obj);
1596 }
1597 else if (PyByteArray_Check(obj)) {
1598 data->buf = PyByteArray_AsString(obj);
1599 len = PyByteArray_Size(obj);
1600 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001601 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001602 if (PyUnicode_READY(obj) == -1) {
1603 return 0;
1604 }
1605 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001606 data->buf = PyUnicode_DATA(obj);
1607 len = PyUnicode_GET_LENGTH(obj);
1608 }
1609 else {
1610 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1611 if (!obj2) {
1612 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1613 return 0;
1614 }
1615 assert(PyBytes_Check(obj2));
1616 data->obj = obj2;
1617 data->buf = PyBytes_AS_STRING(obj2);
1618 len = PyBytes_GET_SIZE(obj2);
1619 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001620 }
1621 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001622 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1623 obj->ob_type->tp_name);
1624 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001625 }
1626 if (strlen(data->buf) != len) {
1627 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001628 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001629 return 0;
1630 }
1631 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001632}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633
1634/* Parse a socket address argument according to the socket object's
1635 address family. Return 1 if the address was in the proper format,
1636 0 of not. The address is returned through addr_ret, its length
1637 through len_ret. */
1638
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001641 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001645#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 case AF_UNIX:
1647 {
1648 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001649 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001650 int retval = 0;
1651
1652 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1653 allow embedded nulls on Linux. */
1654 if (PyUnicode_Check(args)) {
1655 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1656 return 0;
1657 }
1658 else
1659 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001660 if (!PyArg_Parse(args, "y*", &path)) {
1661 Py_DECREF(args);
1662 return retval;
1663 }
1664 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001667#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001668 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001670 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001671 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001673 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 }
1675 }
1676 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001677#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 {
1679 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001680 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001681 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001683 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001685 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 }
1687 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001688 memcpy(addr->sun_path, path.buf, path.len);
1689 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001690 retval = 1;
1691 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001692 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001693 Py_DECREF(args);
1694 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001696#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001697
Martin v. Löwis11017b12006-01-14 18:12:57 +00001698#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 case AF_NETLINK:
1700 {
1701 struct sockaddr_nl* addr;
1702 int pid, groups;
1703 addr = (struct sockaddr_nl *)addr_ret;
1704 if (!PyTuple_Check(args)) {
1705 PyErr_Format(
1706 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001707 "%s(): AF_NETLINK address must be tuple, not %.500s",
1708 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 return 0;
1710 }
Oren Milman735171e2018-09-11 19:51:29 +03001711 if (!PyArg_ParseTuple(args,
1712 "II;AF_NETLINK address must be a pair "
1713 "(pid, groups)",
1714 &pid, &groups))
1715 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001717 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 addr->nl_family = AF_NETLINK;
1719 addr->nl_pid = pid;
1720 addr->nl_groups = groups;
1721 *len_ret = sizeof(*addr);
1722 return 1;
1723 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001724#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001725
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001726#if defined(AF_QIPCRTR)
1727 case AF_QIPCRTR:
1728 {
1729 struct sockaddr_qrtr* addr;
1730 unsigned int node, port;
1731 addr = (struct sockaddr_qrtr *)addr_ret;
1732 if (!PyTuple_Check(args)) {
1733 PyErr_Format(
1734 PyExc_TypeError,
1735 "getsockaddrarg: "
1736 "AF_QIPCRTR address must be tuple, not %.500s",
1737 Py_TYPE(args)->tp_name);
1738 return 0;
1739 }
1740 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1741 return 0;
1742 addr->sq_family = AF_QIPCRTR;
1743 addr->sq_node = node;
1744 addr->sq_port = port;
1745 *len_ret = sizeof(*addr);
1746 return 1;
1747 }
1748#endif /* AF_QIPCRTR */
1749
caaveryeffc12f2017-09-06 18:18:10 -04001750#if defined(AF_VSOCK)
1751 case AF_VSOCK:
1752 {
1753 struct sockaddr_vm* addr;
1754 int port, cid;
1755 addr = (struct sockaddr_vm *)addr_ret;
1756 memset(addr, 0, sizeof(struct sockaddr_vm));
1757 if (!PyTuple_Check(args)) {
1758 PyErr_Format(
1759 PyExc_TypeError,
1760 "getsockaddrarg: "
1761 "AF_VSOCK address must be tuple, not %.500s",
1762 Py_TYPE(args)->tp_name);
1763 return 0;
1764 }
1765 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1766 return 0;
1767 addr->svm_family = s->sock_family;
1768 addr->svm_port = port;
1769 addr->svm_cid = cid;
1770 *len_ret = sizeof(*addr);
1771 return 1;
1772 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001773#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001774
1775
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001776#ifdef AF_RDS
1777 case AF_RDS:
1778 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001779#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 case AF_INET:
1782 {
1783 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001784 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 int port, result;
1786 if (!PyTuple_Check(args)) {
1787 PyErr_Format(
1788 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001789 "%s(): AF_INET address must be tuple, not %.500s",
1790 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return 0;
1792 }
Oren Milman735171e2018-09-11 19:51:29 +03001793 if (!PyArg_ParseTuple(args,
1794 "O&i;AF_INET address must be a pair "
1795 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001796 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001797 {
1798 assert(PyErr_Occurred());
1799 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1800 PyErr_Format(PyExc_OverflowError,
1801 "%s(): port must be 0-65535.", caller);
1802 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001804 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001806 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001808 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (result < 0)
1810 return 0;
1811 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001812 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001814 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 return 0;
1816 }
1817 addr->sin_family = AF_INET;
1818 addr->sin_port = htons((short)port);
1819 *len_ret = sizeof *addr;
1820 return 1;
1821 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001822
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001823#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 case AF_INET6:
1825 {
1826 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001827 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001828 int port, result;
1829 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 flowinfo = scope_id = 0;
1831 if (!PyTuple_Check(args)) {
1832 PyErr_Format(
1833 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001834 "%s(): AF_INET6 address must be tuple, not %.500s",
1835 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 return 0;
1837 }
Oren Milman735171e2018-09-11 19:51:29 +03001838 if (!PyArg_ParseTuple(args,
1839 "O&i|II;AF_INET6 address must be a tuple "
1840 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001841 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001842 &scope_id))
1843 {
1844 assert(PyErr_Occurred());
1845 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1846 PyErr_Format(PyExc_OverflowError,
1847 "%s(): port must be 0-65535.", caller);
1848 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 return 0;
1850 }
1851 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001852 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001854 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 if (result < 0)
1856 return 0;
1857 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001858 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001860 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 return 0;
1862 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001863 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001864 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001865 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001866 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001867 return 0;
1868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 addr->sin6_family = s->sock_family;
1870 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001871 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 addr->sin6_scope_id = scope_id;
1873 *len_ret = sizeof *addr;
1874 return 1;
1875 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001876#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001877
Hye-Shik Chang81268602004-02-02 06:05:24 +00001878#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 case AF_BLUETOOTH:
1880 {
1881 switch (s->sock_proto) {
1882 case BTPROTO_L2CAP:
1883 {
1884 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001885 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 addr = (struct sockaddr_l2 *)addr_ret;
1888 memset(addr, 0, sizeof(struct sockaddr_l2));
1889 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1890 if (!PyArg_ParseTuple(args, "si", &straddr,
1891 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001892 PyErr_Format(PyExc_OSError,
1893 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 return 0;
1895 }
1896 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1897 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 *len_ret = sizeof *addr;
1900 return 1;
1901 }
1902 case BTPROTO_RFCOMM:
1903 {
1904 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001905 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 addr = (struct sockaddr_rc *)addr_ret;
1908 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1909 if (!PyArg_ParseTuple(args, "si", &straddr,
1910 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001911 PyErr_Format(PyExc_OSError,
1912 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 return 0;
1914 }
1915 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1916 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 *len_ret = sizeof *addr;
1919 return 1;
1920 }
1921 case BTPROTO_HCI:
1922 {
1923 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001924#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001925 const char *straddr;
1926 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1927 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001928 PyErr_Format(PyExc_OSError, "%s: "
1929 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001930 return 0;
1931 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001932 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001933 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1934 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001935#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1937 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001938 PyErr_Format(PyExc_OSError,
1939 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 return 0;
1941 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001942#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 *len_ret = sizeof *addr;
1944 return 1;
1945 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001946#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 case BTPROTO_SCO:
1948 {
1949 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001950 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 addr = (struct sockaddr_sco *)addr_ret;
1953 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1954 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001955 PyErr_Format(PyExc_OSError,
1956 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 return 0;
1958 }
1959 straddr = PyBytes_AS_STRING(args);
1960 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1961 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 *len_ret = sizeof *addr;
1964 return 1;
1965 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001966#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 default:
Oren Milman735171e2018-09-11 19:51:29 +03001968 PyErr_Format(PyExc_OSError,
1969 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 return 0;
1971 }
1972 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001973#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001974
Antoine Pitroub156a462010-10-27 20:13:57 +00001975#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 case AF_PACKET:
1977 {
1978 struct sockaddr_ll* addr;
1979 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001980 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 int protoNumber;
1982 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001983 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001984 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 if (!PyTuple_Check(args)) {
1987 PyErr_Format(
1988 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001989 "%s(): AF_PACKET address must be tuple, not %.500s",
1990 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 return 0;
1992 }
Oren Milman735171e2018-09-11 19:51:29 +03001993 /* XXX: improve the default error message according to the
1994 documentation of AF_PACKET, which would be added as part
1995 of bpo-25041. */
1996 if (!PyArg_ParseTuple(args,
1997 "si|iiy*;AF_PACKET address must be a tuple of "
1998 "two to five elements",
1999 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002000 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002001 {
2002 assert(PyErr_Occurred());
2003 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2004 PyErr_Format(PyExc_OverflowError,
2005 "%s(): address argument out of range", caller);
2006 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002008 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2010 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2011 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2012 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002013 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
2015 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002016 if (haddr.buf && haddr.len > 8) {
2017 PyErr_SetString(PyExc_ValueError,
2018 "Hardware address must be 8 bytes or less");
2019 PyBuffer_Release(&haddr);
2020 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 }
2022 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002023 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002025 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002026 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 return 0;
2028 }
2029 addr = (struct sockaddr_ll*)addr_ret;
2030 addr->sll_family = AF_PACKET;
2031 addr->sll_protocol = htons((short)protoNumber);
2032 addr->sll_ifindex = ifr.ifr_ifindex;
2033 addr->sll_pkttype = pkttype;
2034 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002035 if (haddr.buf) {
2036 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2037 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002039 else
2040 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002042 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 return 1;
2044 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002045#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002046
Christian Heimes043d6f62008-01-07 17:19:16 +00002047#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 case AF_TIPC:
2049 {
2050 unsigned int atype, v1, v2, v3;
2051 unsigned int scope = TIPC_CLUSTER_SCOPE;
2052 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 if (!PyTuple_Check(args)) {
2055 PyErr_Format(
2056 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002057 "%s(): AF_TIPC address must be tuple, not %.500s",
2058 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 return 0;
2060 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002063 "IIII|I;AF_TIPC address must be a tuple "
2064 "(addr_type, v1, v2, v3[, scope])",
2065 &atype, &v1, &v2, &v3, &scope))
2066 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002068 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 addr = (struct sockaddr_tipc *) addr_ret;
2071 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 addr->family = AF_TIPC;
2074 addr->scope = scope;
2075 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 if (atype == TIPC_ADDR_NAMESEQ) {
2078 addr->addr.nameseq.type = v1;
2079 addr->addr.nameseq.lower = v2;
2080 addr->addr.nameseq.upper = v3;
2081 } else if (atype == TIPC_ADDR_NAME) {
2082 addr->addr.name.name.type = v1;
2083 addr->addr.name.name.instance = v2;
2084 } else if (atype == TIPC_ADDR_ID) {
2085 addr->addr.id.node = v1;
2086 addr->addr.id.ref = v2;
2087 } else {
2088 /* Shouldn't happen */
2089 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2090 return 0;
2091 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 return 1;
2096 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002097#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002098
Serhiy Storchakad3187152017-11-09 18:00:38 +02002099#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002100 case AF_CAN:
2101 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002102#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002103 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002104 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002105#endif
2106#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002107 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002108#endif
2109#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002110 {
2111 struct sockaddr_can *addr;
2112 PyObject *interfaceName;
2113 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002114 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002115 addr = (struct sockaddr_can *)addr_ret;
2116
Oren Milman735171e2018-09-11 19:51:29 +03002117 if (!PyTuple_Check(args)) {
2118 PyErr_Format(PyExc_TypeError,
2119 "%s(): AF_CAN address must be tuple, not %.500s",
2120 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002121 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002122 }
2123 if (!PyArg_ParseTuple(args,
2124 "O&;AF_CAN address must be a tuple "
2125 "(interface, )",
2126 PyUnicode_FSConverter, &interfaceName))
2127 {
2128 return 0;
2129 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002130
2131 len = PyBytes_GET_SIZE(interfaceName);
2132
2133 if (len == 0) {
2134 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002135 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002136 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2137 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002138 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2139 s->errorhandler();
2140 Py_DECREF(interfaceName);
2141 return 0;
2142 }
2143 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002144 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002145 "AF_CAN interface name too long");
2146 Py_DECREF(interfaceName);
2147 return 0;
2148 }
2149
2150 addr->can_family = AF_CAN;
2151 addr->can_ifindex = ifr.ifr_ifindex;
2152
2153 *len_ret = sizeof(*addr);
2154 Py_DECREF(interfaceName);
2155 return 1;
2156 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002157#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002158
2159#ifdef CAN_ISOTP
2160 case CAN_ISOTP:
2161 {
2162 struct sockaddr_can *addr;
2163 PyObject *interfaceName;
2164 struct ifreq ifr;
2165 Py_ssize_t len;
2166 unsigned long int rx_id, tx_id;
2167
2168 addr = (struct sockaddr_can *)addr_ret;
2169
2170 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2171 &interfaceName,
2172 &rx_id,
2173 &tx_id))
2174 return 0;
2175
2176 len = PyBytes_GET_SIZE(interfaceName);
2177
2178 if (len == 0) {
2179 ifr.ifr_ifindex = 0;
2180 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2181 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2182 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2183 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2184 s->errorhandler();
2185 Py_DECREF(interfaceName);
2186 return 0;
2187 }
2188 } else {
2189 PyErr_SetString(PyExc_OSError,
2190 "AF_CAN interface name too long");
2191 Py_DECREF(interfaceName);
2192 return 0;
2193 }
2194
2195 addr->can_family = AF_CAN;
2196 addr->can_ifindex = ifr.ifr_ifindex;
2197 addr->can_addr.tp.rx_id = rx_id;
2198 addr->can_addr.tp.tx_id = tx_id;
2199
2200 *len_ret = sizeof(*addr);
2201 Py_DECREF(interfaceName);
2202 return 1;
2203 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002204#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002205 default:
Oren Milman735171e2018-09-11 19:51:29 +03002206 PyErr_Format(PyExc_OSError,
2207 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002208 return 0;
2209 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002210#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002211
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002212#ifdef PF_SYSTEM
2213 case PF_SYSTEM:
2214 switch (s->sock_proto) {
2215#ifdef SYSPROTO_CONTROL
2216 case SYSPROTO_CONTROL:
2217 {
2218 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002219
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002220 addr = (struct sockaddr_ctl *)addr_ret;
2221 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002222 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002223
2224 if (PyUnicode_Check(args)) {
2225 struct ctl_info info;
2226 PyObject *ctl_name;
2227
2228 if (!PyArg_Parse(args, "O&",
2229 PyUnicode_FSConverter, &ctl_name)) {
2230 return 0;
2231 }
2232
Victor Stinnerf50e1872015-03-20 11:32:24 +01002233 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002234 PyErr_SetString(PyExc_ValueError,
2235 "provided string is too long");
2236 Py_DECREF(ctl_name);
2237 return 0;
2238 }
2239 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2240 sizeof(info.ctl_name));
2241 Py_DECREF(ctl_name);
2242
2243 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2244 PyErr_SetString(PyExc_OSError,
2245 "cannot find kernel control with provided name");
2246 return 0;
2247 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002248
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002249 addr->sc_id = info.ctl_id;
2250 addr->sc_unit = 0;
2251 } else if (!PyArg_ParseTuple(args, "II",
2252 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002253 PyErr_Format(PyExc_TypeError,
2254 "%s(): PF_SYSTEM address must be a str or "
2255 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002256 return 0;
2257 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002258
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002259 *len_ret = sizeof(*addr);
2260 return 1;
2261 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002262#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002263 default:
Oren Milman735171e2018-09-11 19:51:29 +03002264 PyErr_Format(PyExc_OSError,
2265 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002266 return 0;
2267 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002268#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002269#ifdef HAVE_SOCKADDR_ALG
2270 case AF_ALG:
2271 {
2272 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002273 const char *type;
2274 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002275 sa = (struct sockaddr_alg *)addr_ret;
2276
2277 memset(sa, 0, sizeof(*sa));
2278 sa->salg_family = AF_ALG;
2279
Oren Milman735171e2018-09-11 19:51:29 +03002280 if (!PyTuple_Check(args)) {
2281 PyErr_Format(PyExc_TypeError,
2282 "%s(): AF_ALG address must be tuple, not %.500s",
2283 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002284 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002285 }
2286 if (!PyArg_ParseTuple(args,
2287 "ss|HH;AF_ALG address must be a tuple "
2288 "(type, name[, feat[, mask]])",
2289 &type, &name, &sa->salg_feat, &sa->salg_mask))
2290 {
2291 return 0;
2292 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002293 /* sockaddr_alg has fixed-sized char arrays for type, and name
2294 * both must be NULL terminated.
2295 */
2296 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002297 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2298 return 0;
2299 }
2300 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002301 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002302 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2303 return 0;
2304 }
2305 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2306
2307 *len_ret = sizeof(*sa);
2308 return 1;
2309 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002310#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 default:
Oren Milman735171e2018-09-11 19:51:29 +03002315 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002319}
2320
Guido van Rossum30a685f1991-06-27 15:51:29 +00002321
Guido van Rossum48a680c2001-03-02 06:34:14 +00002322/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002323 Return 1 if the family is known, 0 otherwise. The length is returned
2324 through len_ret. */
2325
2326static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002327getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002330
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002331#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 case AF_UNIX:
2333 {
2334 *len_ret = sizeof (struct sockaddr_un);
2335 return 1;
2336 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002337#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002338
Martin v. Löwis11017b12006-01-14 18:12:57 +00002339#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002340 case AF_NETLINK:
2341 {
2342 *len_ret = sizeof (struct sockaddr_nl);
2343 return 1;
2344 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002345#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002346
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002347#if defined(AF_QIPCRTR)
2348 case AF_QIPCRTR:
2349 {
2350 *len_ret = sizeof (struct sockaddr_qrtr);
2351 return 1;
2352 }
2353#endif /* AF_QIPCRTR */
2354
caaveryeffc12f2017-09-06 18:18:10 -04002355#if defined(AF_VSOCK)
2356 case AF_VSOCK:
2357 {
2358 *len_ret = sizeof (struct sockaddr_vm);
2359 return 1;
2360 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002361#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002362
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002363#ifdef AF_RDS
2364 case AF_RDS:
2365 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002366#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 case AF_INET:
2369 {
2370 *len_ret = sizeof (struct sockaddr_in);
2371 return 1;
2372 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002373
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002374#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 case AF_INET6:
2376 {
2377 *len_ret = sizeof (struct sockaddr_in6);
2378 return 1;
2379 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002380#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002381
Hye-Shik Chang81268602004-02-02 06:05:24 +00002382#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 case AF_BLUETOOTH:
2384 {
2385 switch(s->sock_proto)
2386 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 case BTPROTO_L2CAP:
2389 *len_ret = sizeof (struct sockaddr_l2);
2390 return 1;
2391 case BTPROTO_RFCOMM:
2392 *len_ret = sizeof (struct sockaddr_rc);
2393 return 1;
2394 case BTPROTO_HCI:
2395 *len_ret = sizeof (struct sockaddr_hci);
2396 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002397#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 case BTPROTO_SCO:
2399 *len_ret = sizeof (struct sockaddr_sco);
2400 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002401#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002403 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 "unknown BT protocol");
2405 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 }
2408 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002409#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002410
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002411#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 case AF_PACKET:
2413 {
2414 *len_ret = sizeof (struct sockaddr_ll);
2415 return 1;
2416 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002417#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002418
Christian Heimes043d6f62008-01-07 17:19:16 +00002419#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 case AF_TIPC:
2421 {
2422 *len_ret = sizeof (struct sockaddr_tipc);
2423 return 1;
2424 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002425#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002426
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002427#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002428 case AF_CAN:
2429 {
2430 *len_ret = sizeof (struct sockaddr_can);
2431 return 1;
2432 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002433#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002434
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002435#ifdef PF_SYSTEM
2436 case PF_SYSTEM:
2437 switch(s->sock_proto) {
2438#ifdef SYSPROTO_CONTROL
2439 case SYSPROTO_CONTROL:
2440 *len_ret = sizeof (struct sockaddr_ctl);
2441 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002442#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002443 default:
2444 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2445 "unknown PF_SYSTEM protocol");
2446 return 0;
2447 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002448#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002449#ifdef HAVE_SOCKADDR_ALG
2450 case AF_ALG:
2451 {
2452 *len_ret = sizeof (struct sockaddr_alg);
2453 return 1;
2454 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002455#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002460 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002464}
2465
2466
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002467/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2468 Currently, these methods are only compiled if the RFC 2292/3542
2469 CMSG_LEN() macro is available. Older systems seem to have used
2470 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2471 it may be possible to define CMSG_LEN() that way if it's not
2472 provided. Some architectures might need extra padding after the
2473 cmsghdr, however, and CMSG_LEN() would have to take account of
2474 this. */
2475#ifdef CMSG_LEN
2476/* If length is in range, set *result to CMSG_LEN(length) and return
2477 true; otherwise, return false. */
2478static int
2479get_CMSG_LEN(size_t length, size_t *result)
2480{
2481 size_t tmp;
2482
2483 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2484 return 0;
2485 tmp = CMSG_LEN(length);
2486 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2487 return 0;
2488 *result = tmp;
2489 return 1;
2490}
2491
2492#ifdef CMSG_SPACE
2493/* If length is in range, set *result to CMSG_SPACE(length) and return
2494 true; otherwise, return false. */
2495static int
2496get_CMSG_SPACE(size_t length, size_t *result)
2497{
2498 size_t tmp;
2499
2500 /* Use CMSG_SPACE(1) here in order to take account of the padding
2501 necessary before *and* after the data. */
2502 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2503 return 0;
2504 tmp = CMSG_SPACE(length);
2505 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2506 return 0;
2507 *result = tmp;
2508 return 1;
2509}
2510#endif
2511
2512/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2513 pointer in msg->msg_control with at least "space" bytes after it,
2514 and its cmsg_len member inside the buffer. */
2515static int
2516cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2517{
2518 size_t cmsg_offset;
2519 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2520 sizeof(cmsgh->cmsg_len));
2521
Charles-François Natali466517d2011-08-28 18:23:43 +02002522 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002523 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002524 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002525 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2526 annoying under OS X as it's unsigned there and so it triggers a
2527 tautological comparison warning under Clang when compared against 0.
2528 Since the check is valid on other platforms, silence the warning under
2529 Clang. */
2530 #ifdef __clang__
2531 #pragma clang diagnostic push
2532 #pragma clang diagnostic ignored "-Wtautological-compare"
2533 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002534 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002535 #pragma GCC diagnostic push
2536 #pragma GCC diagnostic ignored "-Wtype-limits"
2537 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002538 if (msg->msg_controllen < 0)
2539 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002540 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002541 #pragma GCC diagnostic pop
2542 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002543 #ifdef __clang__
2544 #pragma clang diagnostic pop
2545 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002546 if (space < cmsg_len_end)
2547 space = cmsg_len_end;
2548 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2549 return (cmsg_offset <= (size_t)-1 - space &&
2550 cmsg_offset + space <= msg->msg_controllen);
2551}
2552
2553/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2554 *space to number of bytes following it in the buffer and return
2555 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2556 msg->msg_controllen are valid. */
2557static int
2558get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2559{
2560 size_t data_offset;
2561 char *data_ptr;
2562
2563 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2564 return 0;
2565 data_offset = data_ptr - (char *)msg->msg_control;
2566 if (data_offset > msg->msg_controllen)
2567 return 0;
2568 *space = msg->msg_controllen - data_offset;
2569 return 1;
2570}
2571
2572/* If cmsgh is invalid or not contained in the buffer pointed to by
2573 msg->msg_control, return -1. If cmsgh is valid and its associated
2574 data is entirely contained in the buffer, set *data_len to the
2575 length of the associated data and return 0. If only part of the
2576 associated data is contained in the buffer but cmsgh is otherwise
2577 valid, set *data_len to the length contained in the buffer and
2578 return 1. */
2579static int
2580get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2581{
2582 size_t space, cmsg_data_len;
2583
2584 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2585 cmsgh->cmsg_len < CMSG_LEN(0))
2586 return -1;
2587 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2588 if (!get_cmsg_data_space(msg, cmsgh, &space))
2589 return -1;
2590 if (space >= cmsg_data_len) {
2591 *data_len = cmsg_data_len;
2592 return 0;
2593 }
2594 *data_len = space;
2595 return 1;
2596}
2597#endif /* CMSG_LEN */
2598
2599
Victor Stinner31bf2d52015-04-01 21:57:09 +02002600struct sock_accept {
2601 socklen_t *addrlen;
2602 sock_addr_t *addrbuf;
2603 SOCKET_T result;
2604};
2605
2606#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2607/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2608static int accept4_works = -1;
2609#endif
2610
2611static int
2612sock_accept_impl(PySocketSockObject *s, void *data)
2613{
2614 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002615 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2616 socklen_t *paddrlen = ctx->addrlen;
2617#ifdef HAVE_SOCKADDR_ALG
2618 /* AF_ALG does not support accept() with addr and raises
2619 * ECONNABORTED instead. */
2620 if (s->sock_family == AF_ALG) {
2621 addr = NULL;
2622 paddrlen = NULL;
2623 *ctx->addrlen = 0;
2624 }
2625#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002626
2627#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2628 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002629 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002630 SOCK_CLOEXEC);
2631 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2632 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2633 accept4_works = (errno != ENOSYS);
2634 }
2635 }
2636 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002637 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002638#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002639 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002640#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002641
2642#ifdef MS_WINDOWS
2643 return (ctx->result != INVALID_SOCKET);
2644#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002645 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002646#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002647}
2648
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002649/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002650
Guido van Rossum73624e91994-10-10 17:59:00 +00002651static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302652sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002655 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 socklen_t addrlen;
2657 PyObject *sock = NULL;
2658 PyObject *addr = NULL;
2659 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002660 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (!getsockaddrlen(s, &addrlen))
2663 return NULL;
2664 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 if (!IS_SELECTABLE(s))
2667 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002668
Victor Stinner31bf2d52015-04-01 21:57:09 +02002669 ctx.addrlen = &addrlen;
2670 ctx.addrbuf = &addrbuf;
2671 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002673 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002674
Victor Stinnerdaf45552013-08-28 00:53:59 +02002675#ifdef MS_WINDOWS
2676 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2677 PyErr_SetFromWindowsErr(0);
2678 SOCKETCLOSE(newfd);
2679 goto finally;
2680 }
2681#else
2682
2683#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2684 if (!accept4_works)
2685#endif
2686 {
2687 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2688 SOCKETCLOSE(newfd);
2689 goto finally;
2690 }
2691 }
2692#endif
2693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 sock = PyLong_FromSocket_t(newfd);
2695 if (sock == NULL) {
2696 SOCKETCLOSE(newfd);
2697 goto finally;
2698 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2701 addrlen, s->sock_proto);
2702 if (addr == NULL)
2703 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002706
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 Py_XDECREF(sock);
2709 Py_XDECREF(addr);
2710 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002711}
2712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002714"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002715\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002716Wait for an incoming connection. Return a new socket file descriptor\n\
2717representing the connection, and the address of the client.\n\
2718For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002719
Guido van Rossum11ba0942002-06-13 15:07:44 +00002720/* s.setblocking(flag) method. Argument:
2721 False -- non-blocking mode; same as settimeout(0)
2722 True -- blocking mode; same as settimeout(None)
2723*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002724
Guido van Rossum73624e91994-10-10 17:59:00 +00002725static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002726sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002727{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002728 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 block = PyLong_AsLong(arg);
2731 if (block == -1 && PyErr_Occurred())
2732 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002733
Victor Stinner9001d802015-04-06 23:06:01 +02002734 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002735 if (internal_setblocking(s, block) == -1) {
2736 return NULL;
2737 }
2738 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002739}
Guido van Rossume4485b01994-09-07 14:32:49 +00002740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742"setblocking(flag)\n\
2743\n\
2744Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002745setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002746setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002747
Yury Selivanovf11b4602018-01-28 17:27:38 -05002748/* s.getblocking() method.
2749 Returns True if socket is in blocking mode,
2750 False if it is in non-blocking mode.
2751*/
2752static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302753sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002754{
2755 if (s->sock_timeout) {
2756 Py_RETURN_TRUE;
2757 }
2758 else {
2759 Py_RETURN_FALSE;
2760 }
2761}
2762
2763PyDoc_STRVAR(getblocking_doc,
2764"getblocking()\n\
2765\n\
2766Returns True if socket is in blocking mode, or False if it\n\
2767is in non-blocking mode.");
2768
Victor Stinner71694d52015-03-28 01:18:54 +01002769static int
2770socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2771{
2772#ifdef MS_WINDOWS
2773 struct timeval tv;
2774#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002775#ifndef HAVE_POLL
2776 _PyTime_t ms;
2777#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002778 int overflow = 0;
2779
2780 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002781 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002782 return 0;
2783 }
2784
Victor Stinner869e1772015-03-30 03:49:14 +02002785 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002786 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002787 return -1;
2788
2789 if (*timeout < 0) {
2790 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2791 return -1;
2792 }
2793
2794#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002795 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002796#endif
2797#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002798 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002799 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002800#endif
2801 if (overflow) {
2802 PyErr_SetString(PyExc_OverflowError,
2803 "timeout doesn't fit into C timeval");
2804 return -1;
2805 }
2806
2807 return 0;
2808}
2809
Guido van Rossum11ba0942002-06-13 15:07:44 +00002810/* s.settimeout(timeout) method. Argument:
2811 None -- no timeout, blocking mode; same as setblocking(True)
2812 0.0 -- non-blocking mode; same as setblocking(False)
2813 > 0 -- timeout mode; operations time out after timeout seconds
2814 < 0 -- illegal; raises an exception
2815*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002817sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002818{
Victor Stinner71694d52015-03-28 01:18:54 +01002819 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002820
Victor Stinner71694d52015-03-28 01:18:54 +01002821 if (socket_parse_timeout(&timeout, arg) < 0)
2822 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002825
2826 int block = timeout < 0;
2827 /* Blocking mode for a Python socket object means that operations
2828 like :meth:`recv` or :meth:`sendall` will block the execution of
2829 the current thread until they are complete or aborted with a
2830 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2831 the underlying FD is in a blocking mode. When timeout is a positive
2832 number, the FD is in a non-blocking mode, and socket ops are
2833 implemented with a `select()` call.
2834
2835 When timeout is 0.0, the FD is in a non-blocking mode.
2836
2837 This table summarizes all states in which the socket object and
2838 its underlying FD can be:
2839
2840 ==================== ===================== ==============
2841 `gettimeout()` `getblocking()` FD
2842 ==================== ===================== ==============
2843 ``None`` ``True`` blocking
2844 ``0.0`` ``False`` non-blocking
2845 ``> 0`` ``True`` non-blocking
2846 */
2847
2848 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002849 return NULL;
2850 }
2851 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852}
2853
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002854PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002855"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002856\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002857Set a timeout on socket operations. 'timeout' can be a float,\n\
2858giving in seconds, or None. Setting a timeout of None disables\n\
2859the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002860Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002861
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002862/* s.gettimeout() method.
2863 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002864static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302865sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002866{
Victor Stinner71694d52015-03-28 01:18:54 +01002867 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002868 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 }
Victor Stinner71694d52015-03-28 01:18:54 +01002870 else {
2871 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2872 return PyFloat_FromDouble(seconds);
2873 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002874}
2875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002876PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002877"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002878\n\
oldkaa0735f2018-02-02 16:52:55 +08002879Returns the timeout in seconds (float) associated with socket\n\
2880operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002882
Guido van Rossumaee08791992-09-08 09:05:33 +00002883/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002884 With an integer third argument, sets an integer optval with optlen=4.
2885 With None as third argument and an integer fourth argument, set
2886 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002887 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002888 use optional built-in module 'struct' to encode the string.
2889*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002890
Guido van Rossum73624e91994-10-10 17:59:00 +00002891static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002892sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 int level;
2895 int optname;
2896 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002897 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002899 unsigned int optlen;
2900 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002901
caaveryeffc12f2017-09-06 18:18:10 -04002902#ifdef AF_VSOCK
2903 if (s->sock_family == AF_VSOCK) {
2904 uint64_t vflag; // Must be set width of 64 bits
2905 /* setsockopt(level, opt, flag) */
2906 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2907 &level, &optname, &vflag)) {
2908 // level should always be set to AF_VSOCK
2909 res = setsockopt(s->sock_fd, level, optname,
2910 (void*)&vflag, sizeof vflag);
2911 goto done;
2912 }
2913 return NULL;
2914 }
2915#endif
2916
Christian Heimesdffa3942016-09-05 23:54:41 +02002917 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 if (PyArg_ParseTuple(args, "iii:setsockopt",
2919 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002920 res = setsockopt(s->sock_fd, level, optname,
2921 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002922 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002924
2925 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002926 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002927 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2928 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2929 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002930 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002931 NULL, (socklen_t)optlen);
2932 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002934
2935 PyErr_Clear();
2936 /* setsockopt(level, opt, buffer) */
2937 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2938 &level, &optname, &optval))
2939 return NULL;
2940
2941#ifdef MS_WINDOWS
2942 if (optval.len > INT_MAX) {
2943 PyBuffer_Release(&optval);
2944 PyErr_Format(PyExc_OverflowError,
2945 "socket option is larger than %i bytes",
2946 INT_MAX);
2947 return NULL;
2948 }
2949 res = setsockopt(s->sock_fd, level, optname,
2950 optval.buf, (int)optval.len);
2951#else
2952 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2953#endif
2954 PyBuffer_Release(&optval);
2955
2956done:
Victor Stinnercc739322016-03-23 21:35:29 +01002957 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002959 }
2960
2961 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002962}
2963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002965"setsockopt(level, option, value: int)\n\
2966setsockopt(level, option, value: buffer)\n\
2967setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002968\n\
2969Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002970The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002971None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002972
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002973
Guido van Rossumaee08791992-09-08 09:05:33 +00002974/* s.getsockopt() method.
2975 With two arguments, retrieves an integer option.
2976 With a third integer argument, retrieves a string buffer of that size;
2977 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002978
Guido van Rossum73624e91994-10-10 17:59:00 +00002979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 int level;
2983 int optname;
2984 int res;
2985 PyObject *buf;
2986 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002987 int flag = 0;
2988 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2991 &level, &optname, &buflen))
2992 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002995#ifdef AF_VSOCK
2996 if (s->sock_family == AF_VSOCK) {
2997 uint64_t vflag = 0; // Must be set width of 64 bits
2998 flagsize = sizeof vflag;
2999 res = getsockopt(s->sock_fd, level, optname,
3000 (void *)&vflag, &flagsize);
3001 if (res < 0)
3002 return s->errorhandler();
3003 return PyLong_FromUnsignedLong(vflag);
3004 }
3005#endif
3006 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 res = getsockopt(s->sock_fd, level, optname,
3008 (void *)&flag, &flagsize);
3009 if (res < 0)
3010 return s->errorhandler();
3011 return PyLong_FromLong(flag);
3012 }
caaveryeffc12f2017-09-06 18:18:10 -04003013#ifdef AF_VSOCK
3014 if (s->sock_family == AF_VSOCK) {
3015 PyErr_SetString(PyExc_OSError,
3016 "getsockopt string buffer not allowed");
3017 return NULL;
3018 }
3019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003021 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 "getsockopt buflen out of range");
3023 return NULL;
3024 }
3025 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3026 if (buf == NULL)
3027 return NULL;
3028 res = getsockopt(s->sock_fd, level, optname,
3029 (void *)PyBytes_AS_STRING(buf), &buflen);
3030 if (res < 0) {
3031 Py_DECREF(buf);
3032 return s->errorhandler();
3033 }
3034 _PyBytes_Resize(&buf, buflen);
3035 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003036}
3037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003038PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003039"getsockopt(level, option[, buffersize]) -> value\n\
3040\n\
3041Get a socket option. See the Unix manual for level and option.\n\
3042If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003043string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003044
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003045
Fred Drake728819a2000-07-01 03:40:12 +00003046/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003047
Guido van Rossum73624e91994-10-10 17:59:00 +00003048static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003049sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 sock_addr_t addrbuf;
3052 int addrlen;
3053 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003054
Oren Milman735171e2018-09-11 19:51:29 +03003055 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003057 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003058
3059 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3060 return NULL;
3061 }
3062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 Py_BEGIN_ALLOW_THREADS
3064 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3065 Py_END_ALLOW_THREADS
3066 if (res < 0)
3067 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003068 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003069}
3070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003071PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003072"bind(address)\n\
3073\n\
3074Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003075pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003076sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003077
Guido van Rossum30a685f1991-06-27 15:51:29 +00003078
3079/* s.close() method.
3080 Set the file descriptor to -1 so operations tried subsequently
3081 will surely fail. */
3082
Guido van Rossum73624e91994-10-10 17:59:00 +00003083static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303084sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003087 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003088
Victor Stinner19a8e842016-03-21 16:36:48 +01003089 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003090 if (fd != INVALID_SOCKET) {
3091 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003092
3093 /* We do not want to retry upon EINTR: see
3094 http://lwn.net/Articles/576478/ and
3095 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3096 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003098 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003100 /* bpo-30319: The peer can already have closed the connection.
3101 Python ignores ECONNRESET on close(). */
3102 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003103 return s->errorhandler();
3104 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003106 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003107}
3108
Christian Heimesd0e31b92018-01-27 09:54:13 +01003109PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003110"close()\n\
3111\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003112Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003113
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003114static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303115sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003116{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003117 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003118 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003119 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003120}
3121
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003122PyDoc_STRVAR(detach_doc,
3123"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003124\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003125Close the socket object without closing the underlying file descriptor.\n\
3126The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003127can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003128
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003129static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003130sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003131{
Victor Stinner81c41db2015-04-02 11:50:57 +02003132 int err;
3133 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003134
Victor Stinner81c41db2015-04-02 11:50:57 +02003135 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3136 /* getsockopt() failed */
3137 return 0;
3138 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003139
Victor Stinner81c41db2015-04-02 11:50:57 +02003140 if (err == EISCONN)
3141 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003142 if (err != 0) {
3143 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3144 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003145 return 0;
3146 }
3147 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003148}
3149
3150static int
3151internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3152 int raise)
3153{
3154 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003155
3156 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003158 Py_END_ALLOW_THREADS
3159
Victor Stinner70a46f62015-03-31 22:03:59 +02003160 if (!res) {
3161 /* connect() succeeded, the socket is connected */
3162 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003164
Victor Stinner81c41db2015-04-02 11:50:57 +02003165 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003166
Victor Stinner81c41db2015-04-02 11:50:57 +02003167 /* save error, PyErr_CheckSignals() can replace it */
3168 err = GET_SOCK_ERROR;
3169 if (CHECK_ERRNO(EINTR)) {
3170 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003171 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003172
3173 /* Issue #23618: when connect() fails with EINTR, the connection is
3174 running asynchronously.
3175
3176 If the socket is blocking or has a timeout, wait until the
3177 connection completes, fails or timed out using select(), and then
3178 get the connection status using getsockopt(SO_ERROR).
3179
3180 If the socket is non-blocking, raise InterruptedError. The caller is
3181 responsible to wait until the connection completes, fails or timed
3182 out (it's the case in asyncio for example). */
3183 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3184 }
3185 else {
3186 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3187 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003188 }
3189
Victor Stinner81c41db2015-04-02 11:50:57 +02003190 if (!wait_connect) {
3191 if (raise) {
3192 /* restore error, maybe replaced by PyErr_CheckSignals() */
3193 SET_SOCK_ERROR(err);
3194 s->errorhandler();
3195 return -1;
3196 }
3197 else
3198 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003199 }
3200
Victor Stinner81c41db2015-04-02 11:50:57 +02003201 if (raise) {
3202 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003203 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3204 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003205 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003206 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003207 else {
3208 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003209 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3210 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003211 return err;
3212 }
3213 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003214}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003215
Fred Drake728819a2000-07-01 03:40:12 +00003216/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003217
Guido van Rossum73624e91994-10-10 17:59:00 +00003218static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003219sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 sock_addr_t addrbuf;
3222 int addrlen;
3223 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003224
Oren Milman735171e2018-09-11 19:51:29 +03003225 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003227 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003228
Steve Dowerb82e17e2019-05-23 08:45:22 -07003229 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3230 return NULL;
3231 }
3232
Victor Stinner81c41db2015-04-02 11:50:57 +02003233 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003234 if (res < 0)
3235 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003236
Victor Stinneree699e92015-03-31 21:28:42 +02003237 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003238}
3239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003240PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003241"connect(address)\n\
3242\n\
3243Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003244is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003245
Guido van Rossum30a685f1991-06-27 15:51:29 +00003246
Fred Drake728819a2000-07-01 03:40:12 +00003247/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003248
3249static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003250sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 sock_addr_t addrbuf;
3253 int addrlen;
3254 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003255
Oren Milman735171e2018-09-11 19:51:29 +03003256 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003258 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003259
Steve Dowerb82e17e2019-05-23 08:45:22 -07003260 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3261 return NULL;
3262 }
3263
Victor Stinner81c41db2015-04-02 11:50:57 +02003264 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003265 if (res < 0)
3266 return NULL;
3267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003269}
3270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003271PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003272"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003273\n\
3274This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003275instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003276
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003277
Guido van Rossumed233a51992-06-23 09:07:03 +00003278/* s.fileno() method */
3279
Guido van Rossum73624e91994-10-10 17:59:00 +00003280static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303281sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003284}
3285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003286PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003287"fileno() -> integer\n\
3288\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003289Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290
Guido van Rossumed233a51992-06-23 09:07:03 +00003291
Guido van Rossumc89705d1992-11-26 08:54:07 +00003292/* s.getsockname() method */
3293
Guido van Rossum73624e91994-10-10 17:59:00 +00003294static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303295sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 sock_addr_t addrbuf;
3298 int res;
3299 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 if (!getsockaddrlen(s, &addrlen))
3302 return NULL;
3303 memset(&addrbuf, 0, addrlen);
3304 Py_BEGIN_ALLOW_THREADS
3305 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3306 Py_END_ALLOW_THREADS
3307 if (res < 0)
3308 return s->errorhandler();
3309 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3310 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003311}
3312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003313PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003314"getsockname() -> address info\n\
3315\n\
3316Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003317info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003318
Guido van Rossumc89705d1992-11-26 08:54:07 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003321/* s.getpeername() method */
3322
Guido van Rossum73624e91994-10-10 17:59:00 +00003323static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303324sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 sock_addr_t addrbuf;
3327 int res;
3328 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (!getsockaddrlen(s, &addrlen))
3331 return NULL;
3332 memset(&addrbuf, 0, addrlen);
3333 Py_BEGIN_ALLOW_THREADS
3334 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3335 Py_END_ALLOW_THREADS
3336 if (res < 0)
3337 return s->errorhandler();
3338 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3339 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003340}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003342PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003343"getpeername() -> address info\n\
3344\n\
3345Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003346info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003347
Guido van Rossumb6775db1994-08-01 11:34:53 +00003348#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003349
3350
Guido van Rossum30a685f1991-06-27 15:51:29 +00003351/* s.listen(n) method */
3352
Guido van Rossum73624e91994-10-10 17:59:00 +00003353static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003354sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003355{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003356 /* We try to choose a default backlog high enough to avoid connection drops
3357 * for common workloads, yet not too high to limit resource usage. */
3358 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003360
Charles-François Natali644b8f52014-05-22 19:45:39 +01003361 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003365 /* To avoid problems on systems that don't allow a negative backlog
3366 * (which doesn't make sense anyway) we force a minimum value of 0. */
3367 if (backlog < 0)
3368 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 res = listen(s->sock_fd, backlog);
3370 Py_END_ALLOW_THREADS
3371 if (res < 0)
3372 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003373 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003374}
3375
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003376PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003377"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003378\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003379Enable a server to accept connections. If backlog is specified, it must be\n\
3380at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003381unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003382connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003383
Victor Stinner31bf2d52015-04-01 21:57:09 +02003384struct sock_recv {
3385 char *cbuf;
3386 Py_ssize_t len;
3387 int flags;
3388 Py_ssize_t result;
3389};
3390
3391static int
3392sock_recv_impl(PySocketSockObject *s, void *data)
3393{
3394 struct sock_recv *ctx = data;
3395
3396#ifdef MS_WINDOWS
3397 if (ctx->len > INT_MAX)
3398 ctx->len = INT_MAX;
3399 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3400#else
3401 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3402#endif
3403 return (ctx->result >= 0);
3404}
3405
Guido van Rossum82a5c661998-07-07 20:45:43 +00003406
Thomas Wouters477c8d52006-05-27 19:21:47 +00003407/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003408 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003409 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003410 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003411 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003412 * also possible that we return a number of bytes smaller than the request
3413 * bytes.
3414 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003415
Antoine Pitrou19467d22010-08-17 19:33:30 +00003416static Py_ssize_t
3417sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003418{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003419 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 if (!IS_SELECTABLE(s)) {
3422 select_error();
3423 return -1;
3424 }
3425 if (len == 0) {
3426 /* If 0 bytes were requested, do nothing. */
3427 return 0;
3428 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003429
Victor Stinner31bf2d52015-04-01 21:57:09 +02003430 ctx.cbuf = cbuf;
3431 ctx.len = len;
3432 ctx.flags = flags;
3433 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003435
3436 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003437}
3438
Guido van Rossum48a680c2001-03-02 06:34:14 +00003439
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003440/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003441
Guido van Rossum73624e91994-10-10 17:59:00 +00003442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003443sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003444{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003445 Py_ssize_t recvlen, outlen;
3446 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003448
Antoine Pitrou19467d22010-08-17 19:33:30 +00003449 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 if (recvlen < 0) {
3453 PyErr_SetString(PyExc_ValueError,
3454 "negative buffersize in recv");
3455 return NULL;
3456 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 /* Allocate a new string. */
3459 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3460 if (buf == NULL)
3461 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 /* Call the guts */
3464 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3465 if (outlen < 0) {
3466 /* An error occurred, release the string and return an
3467 error. */
3468 Py_DECREF(buf);
3469 return NULL;
3470 }
3471 if (outlen != recvlen) {
3472 /* We did not read as many bytes as we anticipated, resize the
3473 string if possible and be successful. */
3474 _PyBytes_Resize(&buf, outlen);
3475 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003478}
3479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003480PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003481"recv(buffersize[, flags]) -> data\n\
3482\n\
3483Receive up to buffersize bytes from the socket. For the optional flags\n\
3484argument, see the Unix manual. When no data is available, block until\n\
3485at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003486the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003487
Guido van Rossum30a685f1991-06-27 15:51:29 +00003488
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003489/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003490
Thomas Wouters477c8d52006-05-27 19:21:47 +00003491static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003492sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003495
Antoine Pitrou19467d22010-08-17 19:33:30 +00003496 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 Py_buffer pbuf;
3498 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003499 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003502 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 &pbuf, &recvlen, &flags))
3504 return NULL;
3505 buf = pbuf.buf;
3506 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 if (recvlen < 0) {
3509 PyBuffer_Release(&pbuf);
3510 PyErr_SetString(PyExc_ValueError,
3511 "negative buffersize in recv_into");
3512 return NULL;
3513 }
3514 if (recvlen == 0) {
3515 /* If nbytes was not specified, use the buffer's length */
3516 recvlen = buflen;
3517 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 /* Check if the buffer is large enough */
3520 if (buflen < recvlen) {
3521 PyBuffer_Release(&pbuf);
3522 PyErr_SetString(PyExc_ValueError,
3523 "buffer too small for requested bytes");
3524 return NULL;
3525 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 /* Call the guts */
3528 readlen = sock_recv_guts(s, buf, recvlen, flags);
3529 if (readlen < 0) {
3530 /* Return an error. */
3531 PyBuffer_Release(&pbuf);
3532 return NULL;
3533 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 PyBuffer_Release(&pbuf);
3536 /* Return the number of bytes read. Note that we do not do anything
3537 special here in the case that readlen < recvlen. */
3538 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003539}
3540
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003541PyDoc_STRVAR(recv_into_doc,
3542"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003543\n\
oldkaa0735f2018-02-02 16:52:55 +08003544A version of recv() that stores its data into a buffer rather than creating\n\
3545a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003546is not specified (or 0), receive up to the size available in the given buffer.\n\
3547\n\
3548See recv() for documentation about the flags.");
3549
Victor Stinner31bf2d52015-04-01 21:57:09 +02003550struct sock_recvfrom {
3551 char* cbuf;
3552 Py_ssize_t len;
3553 int flags;
3554 socklen_t *addrlen;
3555 sock_addr_t *addrbuf;
3556 Py_ssize_t result;
3557};
3558
3559static int
3560sock_recvfrom_impl(PySocketSockObject *s, void *data)
3561{
3562 struct sock_recvfrom *ctx = data;
3563
3564 memset(ctx->addrbuf, 0, *ctx->addrlen);
3565
3566#ifdef MS_WINDOWS
3567 if (ctx->len > INT_MAX)
3568 ctx->len = INT_MAX;
3569 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3570 SAS2SA(ctx->addrbuf), ctx->addrlen);
3571#else
3572 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3573 SAS2SA(ctx->addrbuf), ctx->addrlen);
3574#endif
3575 return (ctx->result >= 0);
3576}
3577
Thomas Wouters477c8d52006-05-27 19:21:47 +00003578
3579/*
Christian Heimes99170a52007-12-19 02:07:34 +00003580 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3581 * into a char buffer. If you have any inc/def ref to do to the objects that
3582 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003583 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003584 * that it is also possible that we return a number of bytes smaller than the
3585 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003586 *
3587 * 'addr' is a return value for the address object. Note that you must decref
3588 * it yourself.
3589 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003590static Py_ssize_t
3591sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003596 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 if (!getsockaddrlen(s, &addrlen))
3601 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 if (!IS_SELECTABLE(s)) {
3604 select_error();
3605 return -1;
3606 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003607
Victor Stinner31bf2d52015-04-01 21:57:09 +02003608 ctx.cbuf = cbuf;
3609 ctx.len = len;
3610 ctx.flags = flags;
3611 ctx.addrbuf = &addrbuf;
3612 ctx.addrlen = &addrlen;
3613 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003615
Victor Stinner31bf2d52015-04-01 21:57:09 +02003616 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3617 s->sock_proto);
3618 if (*addr == NULL)
3619 return -1;
3620
3621 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003622}
3623
3624/* s.recvfrom(nbytes [,flags]) method */
3625
3626static PyObject *
3627sock_recvfrom(PySocketSockObject *s, PyObject *args)
3628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003629 PyObject *buf = NULL;
3630 PyObject *addr = NULL;
3631 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003632 int flags = 0;
3633 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003634
Antoine Pitrou19467d22010-08-17 19:33:30 +00003635 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 if (recvlen < 0) {
3639 PyErr_SetString(PyExc_ValueError,
3640 "negative buffersize in recvfrom");
3641 return NULL;
3642 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3645 if (buf == NULL)
3646 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3649 recvlen, flags, &addr);
3650 if (outlen < 0) {
3651 goto finally;
3652 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 if (outlen != recvlen) {
3655 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003656 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003658 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 goto finally;
3660 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003663
3664finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 Py_XDECREF(buf);
3666 Py_XDECREF(addr);
3667 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003668}
3669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003670PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003671"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3672\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003673Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003674
Thomas Wouters477c8d52006-05-27 19:21:47 +00003675
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003676/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003677
3678static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003679sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003682
Antoine Pitrou19467d22010-08-17 19:33:30 +00003683 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 Py_buffer pbuf;
3685 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003686 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003689
Antoine Pitrou19467d22010-08-17 19:33:30 +00003690 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 kwlist, &pbuf,
3692 &recvlen, &flags))
3693 return NULL;
3694 buf = pbuf.buf;
3695 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 if (recvlen < 0) {
3698 PyBuffer_Release(&pbuf);
3699 PyErr_SetString(PyExc_ValueError,
3700 "negative buffersize in recvfrom_into");
3701 return NULL;
3702 }
3703 if (recvlen == 0) {
3704 /* If nbytes was not specified, use the buffer's length */
3705 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003706 } else if (recvlen > buflen) {
3707 PyBuffer_Release(&pbuf);
3708 PyErr_SetString(PyExc_ValueError,
3709 "nbytes is greater than the length of the buffer");
3710 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3714 if (readlen < 0) {
3715 PyBuffer_Release(&pbuf);
3716 /* Return an error */
3717 Py_XDECREF(addr);
3718 return NULL;
3719 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 PyBuffer_Release(&pbuf);
3722 /* Return the number of bytes read and the address. Note that we do
3723 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003724 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003725}
3726
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003727PyDoc_STRVAR(recvfrom_into_doc,
3728"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003729\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003730Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003731
Victor Stinner35bee932015-04-02 12:28:07 +02003732/* The sendmsg() and recvmsg[_into]() methods require a working
3733 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3734#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003735struct sock_recvmsg {
3736 struct msghdr *msg;
3737 int flags;
3738 ssize_t result;
3739};
3740
3741static int
3742sock_recvmsg_impl(PySocketSockObject *s, void *data)
3743{
3744 struct sock_recvmsg *ctx = data;
3745
3746 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3747 return (ctx->result >= 0);
3748}
3749
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003750/*
3751 * Call recvmsg() with the supplied iovec structures, flags, and
3752 * ancillary data buffer size (controllen). Returns the tuple return
3753 * value for recvmsg() or recvmsg_into(), with the first item provided
3754 * by the supplied makeval() function. makeval() will be called with
3755 * the length read and makeval_data as arguments, and must return a
3756 * new reference (which will be decrefed if there is a subsequent
3757 * error). On error, closes any file descriptors received via
3758 * SCM_RIGHTS.
3759 */
3760static PyObject *
3761sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3762 int flags, Py_ssize_t controllen,
3763 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3764{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003765 sock_addr_t addrbuf;
3766 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003767 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003768 PyObject *cmsg_list = NULL, *retval = NULL;
3769 void *controlbuf = NULL;
3770 struct cmsghdr *cmsgh;
3771 size_t cmsgdatalen = 0;
3772 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003773 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003774
3775 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3776 ignored" when the socket is connected (Linux fills them in
3777 anyway for AF_UNIX sockets at least). Normally msg_namelen
3778 seems to be set to 0 if there's no address, but try to
3779 initialize msg_name to something that won't be mistaken for a
3780 real address if that doesn't happen. */
3781 if (!getsockaddrlen(s, &addrbuflen))
3782 return NULL;
3783 memset(&addrbuf, 0, addrbuflen);
3784 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3785
3786 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3787 PyErr_SetString(PyExc_ValueError,
3788 "invalid ancillary data buffer length");
3789 return NULL;
3790 }
3791 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3792 return PyErr_NoMemory();
3793
3794 /* Make the system call. */
3795 if (!IS_SELECTABLE(s)) {
3796 select_error();
3797 goto finally;
3798 }
3799
Victor Stinner31bf2d52015-04-01 21:57:09 +02003800 msg.msg_name = SAS2SA(&addrbuf);
3801 msg.msg_namelen = addrbuflen;
3802 msg.msg_iov = iov;
3803 msg.msg_iovlen = iovlen;
3804 msg.msg_control = controlbuf;
3805 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003806
Victor Stinner31bf2d52015-04-01 21:57:09 +02003807 ctx.msg = &msg;
3808 ctx.flags = flags;
3809 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003810 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003811
3812 /* Make list of (level, type, data) tuples from control messages. */
3813 if ((cmsg_list = PyList_New(0)) == NULL)
3814 goto err_closefds;
3815 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3816 implementations didn't do so. */
3817 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3818 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3819 PyObject *bytes, *tuple;
3820 int tmp;
3821
3822 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3823 if (cmsg_status != 0) {
3824 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3825 "received malformed or improperly-truncated "
3826 "ancillary data", 1) == -1)
3827 goto err_closefds;
3828 }
3829 if (cmsg_status < 0)
3830 break;
3831 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003832 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833 goto err_closefds;
3834 }
3835
3836 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3837 cmsgdatalen);
3838 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3839 (int)cmsgh->cmsg_type, bytes);
3840 if (tuple == NULL)
3841 goto err_closefds;
3842 tmp = PyList_Append(cmsg_list, tuple);
3843 Py_DECREF(tuple);
3844 if (tmp != 0)
3845 goto err_closefds;
3846
3847 if (cmsg_status != 0)
3848 break;
3849 }
3850
3851 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003852 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003853 cmsg_list,
3854 (int)msg.msg_flags,
3855 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3856 ((msg.msg_namelen > addrbuflen) ?
3857 addrbuflen : msg.msg_namelen),
3858 s->sock_proto));
3859 if (retval == NULL)
3860 goto err_closefds;
3861
3862finally:
3863 Py_XDECREF(cmsg_list);
3864 PyMem_Free(controlbuf);
3865 return retval;
3866
3867err_closefds:
3868#ifdef SCM_RIGHTS
3869 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3870 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3871 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3872 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3873 if (cmsg_status < 0)
3874 break;
3875 if (cmsgh->cmsg_level == SOL_SOCKET &&
3876 cmsgh->cmsg_type == SCM_RIGHTS) {
3877 size_t numfds;
3878 int *fdp;
3879
3880 numfds = cmsgdatalen / sizeof(int);
3881 fdp = (int *)CMSG_DATA(cmsgh);
3882 while (numfds-- > 0)
3883 close(*fdp++);
3884 }
3885 if (cmsg_status != 0)
3886 break;
3887 }
3888#endif /* SCM_RIGHTS */
3889 goto finally;
3890}
3891
3892
3893static PyObject *
3894makeval_recvmsg(ssize_t received, void *data)
3895{
3896 PyObject **buf = data;
3897
3898 if (received < PyBytes_GET_SIZE(*buf))
3899 _PyBytes_Resize(buf, received);
3900 Py_XINCREF(*buf);
3901 return *buf;
3902}
3903
3904/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3905
3906static PyObject *
3907sock_recvmsg(PySocketSockObject *s, PyObject *args)
3908{
3909 Py_ssize_t bufsize, ancbufsize = 0;
3910 int flags = 0;
3911 struct iovec iov;
3912 PyObject *buf = NULL, *retval = NULL;
3913
3914 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3915 return NULL;
3916
3917 if (bufsize < 0) {
3918 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3919 return NULL;
3920 }
3921 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3922 return NULL;
3923 iov.iov_base = PyBytes_AS_STRING(buf);
3924 iov.iov_len = bufsize;
3925
3926 /* Note that we're passing a pointer to *our pointer* to the bytes
3927 object here (&buf); makeval_recvmsg() may incref the object, or
3928 deallocate it and set our pointer to NULL. */
3929 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3930 &makeval_recvmsg, &buf);
3931 Py_XDECREF(buf);
3932 return retval;
3933}
3934
3935PyDoc_STRVAR(recvmsg_doc,
3936"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3937\n\
3938Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3939socket. The ancbufsize argument sets the size in bytes of the\n\
3940internal buffer used to receive the ancillary data; it defaults to 0,\n\
3941meaning that no ancillary data will be received. Appropriate buffer\n\
3942sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3943CMSG_LEN(), and items which do not fit into the buffer might be\n\
3944truncated or discarded. The flags argument defaults to 0 and has the\n\
3945same meaning as for recv().\n\
3946\n\
3947The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3948The data item is a bytes object holding the non-ancillary data\n\
3949received. The ancdata item is a list of zero or more tuples\n\
3950(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3951(control messages) received: cmsg_level and cmsg_type are integers\n\
3952specifying the protocol level and protocol-specific type respectively,\n\
3953and cmsg_data is a bytes object holding the associated data. The\n\
3954msg_flags item is the bitwise OR of various flags indicating\n\
3955conditions on the received message; see your system documentation for\n\
3956details. If the receiving socket is unconnected, address is the\n\
3957address of the sending socket, if available; otherwise, its value is\n\
3958unspecified.\n\
3959\n\
3960If recvmsg() raises an exception after the system call returns, it\n\
3961will first attempt to close any file descriptors received via the\n\
3962SCM_RIGHTS mechanism.");
3963
3964
3965static PyObject *
3966makeval_recvmsg_into(ssize_t received, void *data)
3967{
3968 return PyLong_FromSsize_t(received);
3969}
3970
3971/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3972
3973static PyObject *
3974sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3975{
3976 Py_ssize_t ancbufsize = 0;
3977 int flags = 0;
3978 struct iovec *iovs = NULL;
3979 Py_ssize_t i, nitems, nbufs = 0;
3980 Py_buffer *bufs = NULL;
3981 PyObject *buffers_arg, *fast, *retval = NULL;
3982
3983 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3984 &buffers_arg, &ancbufsize, &flags))
3985 return NULL;
3986
3987 if ((fast = PySequence_Fast(buffers_arg,
3988 "recvmsg_into() argument 1 must be an "
3989 "iterable")) == NULL)
3990 return NULL;
3991 nitems = PySequence_Fast_GET_SIZE(fast);
3992 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003993 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994 goto finally;
3995 }
3996
3997 /* Fill in an iovec for each item, and save the Py_buffer
3998 structs to release afterwards. */
3999 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4000 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4001 PyErr_NoMemory();
4002 goto finally;
4003 }
4004 for (; nbufs < nitems; nbufs++) {
4005 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4006 "w*;recvmsg_into() argument 1 must be an iterable "
4007 "of single-segment read-write buffers",
4008 &bufs[nbufs]))
4009 goto finally;
4010 iovs[nbufs].iov_base = bufs[nbufs].buf;
4011 iovs[nbufs].iov_len = bufs[nbufs].len;
4012 }
4013
4014 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4015 &makeval_recvmsg_into, NULL);
4016finally:
4017 for (i = 0; i < nbufs; i++)
4018 PyBuffer_Release(&bufs[i]);
4019 PyMem_Free(bufs);
4020 PyMem_Free(iovs);
4021 Py_DECREF(fast);
4022 return retval;
4023}
4024
4025PyDoc_STRVAR(recvmsg_into_doc,
4026"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4027\n\
4028Receive normal data and ancillary data from the socket, scattering the\n\
4029non-ancillary data into a series of buffers. The buffers argument\n\
4030must be an iterable of objects that export writable buffers\n\
4031(e.g. bytearray objects); these will be filled with successive chunks\n\
4032of the non-ancillary data until it has all been written or there are\n\
4033no more buffers. The ancbufsize argument sets the size in bytes of\n\
4034the internal buffer used to receive the ancillary data; it defaults to\n\
40350, meaning that no ancillary data will be received. Appropriate\n\
4036buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4037or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4038truncated or discarded. The flags argument defaults to 0 and has the\n\
4039same meaning as for recv().\n\
4040\n\
4041The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4042The nbytes item is the total number of bytes of non-ancillary data\n\
4043written into the buffers. The ancdata item is a list of zero or more\n\
4044tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4045data (control messages) received: cmsg_level and cmsg_type are\n\
4046integers specifying the protocol level and protocol-specific type\n\
4047respectively, and cmsg_data is a bytes object holding the associated\n\
4048data. The msg_flags item is the bitwise OR of various flags\n\
4049indicating conditions on the received message; see your system\n\
4050documentation for details. If the receiving socket is unconnected,\n\
4051address is the address of the sending socket, if available; otherwise,\n\
4052its value is unspecified.\n\
4053\n\
4054If recvmsg_into() raises an exception after the system call returns,\n\
4055it will first attempt to close any file descriptors received via the\n\
4056SCM_RIGHTS mechanism.");
4057#endif /* CMSG_LEN */
4058
4059
Victor Stinner31bf2d52015-04-01 21:57:09 +02004060struct sock_send {
4061 char *buf;
4062 Py_ssize_t len;
4063 int flags;
4064 Py_ssize_t result;
4065};
4066
4067static int
4068sock_send_impl(PySocketSockObject *s, void *data)
4069{
4070 struct sock_send *ctx = data;
4071
4072#ifdef MS_WINDOWS
4073 if (ctx->len > INT_MAX)
4074 ctx->len = INT_MAX;
4075 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4076#else
4077 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4078#endif
4079 return (ctx->result >= 0);
4080}
4081
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004082/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004083
Guido van Rossum73624e91994-10-10 17:59:00 +00004084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004085sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004086{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004087 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004089 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4092 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 if (!IS_SELECTABLE(s)) {
4095 PyBuffer_Release(&pbuf);
4096 return select_error();
4097 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004098 ctx.buf = pbuf.buf;
4099 ctx.len = pbuf.len;
4100 ctx.flags = flags;
4101 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004102 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 return NULL;
4104 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004105 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004106
4107 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004108}
4109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004110PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004111"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004112\n\
4113Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004114argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004115sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004116
4117
4118/* s.sendall(data [,flags]) method */
4119
4120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004121sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004124 Py_ssize_t len, n;
4125 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004127 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004128 int has_timeout = (s->sock_timeout > 0);
4129 _PyTime_t interval = s->sock_timeout;
4130 _PyTime_t deadline = 0;
4131 int deadline_initialized = 0;
4132 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4135 return NULL;
4136 buf = pbuf.buf;
4137 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 if (!IS_SELECTABLE(s)) {
4140 PyBuffer_Release(&pbuf);
4141 return select_error();
4142 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004145 if (has_timeout) {
4146 if (deadline_initialized) {
4147 /* recompute the timeout */
4148 interval = deadline - _PyTime_GetMonotonicClock();
4149 }
4150 else {
4151 deadline_initialized = 1;
4152 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4153 }
4154
4155 if (interval <= 0) {
4156 PyErr_SetString(socket_timeout, "timed out");
4157 goto done;
4158 }
4159 }
4160
Victor Stinner02f32ab2015-04-01 22:53:26 +02004161 ctx.buf = buf;
4162 ctx.len = len;
4163 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004164 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4165 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004166 n = ctx.result;
4167 assert(n >= 0);
4168
4169 buf += n;
4170 len -= n;
4171
4172 /* We must run our signal handlers before looping again.
4173 send() can return a successful partial write when it is
4174 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004175 if (PyErr_CheckSignals())
4176 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004177 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004179
Victor Stinner8912d142015-04-06 23:16:34 +02004180 Py_INCREF(Py_None);
4181 res = Py_None;
4182
4183done:
4184 PyBuffer_Release(&pbuf);
4185 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004186}
4187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004188PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004189"sendall(data[, flags])\n\
4190\n\
4191Send a data string to the socket. For the optional flags\n\
4192argument, see the Unix manual. This calls send() repeatedly\n\
4193until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004194to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004195
Guido van Rossum30a685f1991-06-27 15:51:29 +00004196
Victor Stinner31bf2d52015-04-01 21:57:09 +02004197struct sock_sendto {
4198 char *buf;
4199 Py_ssize_t len;
4200 int flags;
4201 int addrlen;
4202 sock_addr_t *addrbuf;
4203 Py_ssize_t result;
4204};
4205
4206static int
4207sock_sendto_impl(PySocketSockObject *s, void *data)
4208{
4209 struct sock_sendto *ctx = data;
4210
4211#ifdef MS_WINDOWS
4212 if (ctx->len > INT_MAX)
4213 ctx->len = INT_MAX;
4214 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4215 SAS2SA(ctx->addrbuf), ctx->addrlen);
4216#else
4217 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4218 SAS2SA(ctx->addrbuf), ctx->addrlen);
4219#endif
4220 return (ctx->result >= 0);
4221}
4222
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004223/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004224
Guido van Rossum73624e91994-10-10 17:59:00 +00004225static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004226sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 Py_buffer pbuf;
4229 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004230 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004232 int addrlen, flags;
4233 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004236 arglen = PyTuple_Size(args);
4237 switch (arglen) {
4238 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004239 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4240 return NULL;
4241 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004242 break;
4243 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004244 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4245 &pbuf, &flags, &addro)) {
4246 return NULL;
4247 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004248 break;
4249 default:
4250 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004251 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004252 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004253 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004256 if (!IS_SELECTABLE(s)) {
4257 PyBuffer_Release(&pbuf);
4258 return select_error();
4259 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004260
Oren Milman735171e2018-09-11 19:51:29 +03004261 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 PyBuffer_Release(&pbuf);
4263 return NULL;
4264 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004265
Steve Dowerb82e17e2019-05-23 08:45:22 -07004266 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4267 return NULL;
4268 }
4269
Victor Stinner31bf2d52015-04-01 21:57:09 +02004270 ctx.buf = pbuf.buf;
4271 ctx.len = pbuf.len;
4272 ctx.flags = flags;
4273 ctx.addrlen = addrlen;
4274 ctx.addrbuf = &addrbuf;
4275 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004276 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 return NULL;
4278 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004279 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004280
4281 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004282}
4283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004284PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004285"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004286\n\
4287Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004288For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004289
Guido van Rossum30a685f1991-06-27 15:51:29 +00004290
Victor Stinner35bee932015-04-02 12:28:07 +02004291/* The sendmsg() and recvmsg[_into]() methods require a working
4292 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4293#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004294struct sock_sendmsg {
4295 struct msghdr *msg;
4296 int flags;
4297 ssize_t result;
4298};
4299
4300static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004301sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4302 struct msghdr *msg,
4303 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4304 Py_ssize_t ndataparts, ndatabufs = 0;
4305 int result = -1;
4306 struct iovec *iovs = NULL;
4307 PyObject *data_fast = NULL;
4308 Py_buffer *databufs = NULL;
4309
4310 /* Fill in an iovec for each message part, and save the Py_buffer
4311 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004312 data_fast = PySequence_Fast(data_arg,
4313 "sendmsg() argument 1 must be an "
4314 "iterable");
4315 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004316 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004317 }
4318
Christian Heimesdffa3942016-09-05 23:54:41 +02004319 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4320 if (ndataparts > INT_MAX) {
4321 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4322 goto finally;
4323 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004324
Christian Heimesdffa3942016-09-05 23:54:41 +02004325 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004326 if (ndataparts > 0) {
4327 iovs = PyMem_New(struct iovec, ndataparts);
4328 if (iovs == NULL) {
4329 PyErr_NoMemory();
4330 goto finally;
4331 }
4332 msg->msg_iov = iovs;
4333
4334 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004335 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004336 PyErr_NoMemory();
4337 goto finally;
4338 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004339 }
4340 for (; ndatabufs < ndataparts; ndatabufs++) {
4341 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4342 "y*;sendmsg() argument 1 must be an iterable of "
4343 "bytes-like objects",
4344 &databufs[ndatabufs]))
4345 goto finally;
4346 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4347 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4348 }
4349 result = 0;
4350 finally:
4351 *databufsout = databufs;
4352 *ndatabufsout = ndatabufs;
4353 Py_XDECREF(data_fast);
4354 return result;
4355}
4356
4357static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004358sock_sendmsg_impl(PySocketSockObject *s, void *data)
4359{
4360 struct sock_sendmsg *ctx = data;
4361
4362 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4363 return (ctx->result >= 0);
4364}
4365
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004366/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4367
4368static PyObject *
4369sock_sendmsg(PySocketSockObject *s, PyObject *args)
4370{
Christian Heimesdffa3942016-09-05 23:54:41 +02004371 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004372 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004373 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004374 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004375 struct cmsginfo {
4376 int level;
4377 int type;
4378 Py_buffer data;
4379 } *cmsgs = NULL;
4380 void *controlbuf = NULL;
4381 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004382 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004383 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004385 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004386
4387 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004388 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004389 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004390 }
4391
4392 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004393
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004394 /* Parse destination address. */
4395 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004396 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4397 "sendmsg"))
4398 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004399 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004400 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004401 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4402 return NULL;
4403 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004404 msg.msg_name = &addrbuf;
4405 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004406 } else {
4407 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4408 return NULL;
4409 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004410 }
4411
4412 /* Fill in an iovec for each message part, and save the Py_buffer
4413 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004414 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004415 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004416 }
4417
4418 if (cmsg_arg == NULL)
4419 ncmsgs = 0;
4420 else {
4421 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4422 "sendmsg() argument 2 must be an "
4423 "iterable")) == NULL)
4424 goto finally;
4425 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4426 }
4427
4428#ifndef CMSG_SPACE
4429 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004430 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004431 "sending multiple control messages is not supported "
4432 "on this system");
4433 goto finally;
4434 }
4435#endif
4436 /* Save level, type and Py_buffer for each control message,
4437 and calculate total size. */
4438 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4439 PyErr_NoMemory();
4440 goto finally;
4441 }
4442 controllen = controllen_last = 0;
4443 while (ncmsgbufs < ncmsgs) {
4444 size_t bufsize, space;
4445
4446 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4447 "(iiy*):[sendmsg() ancillary data items]",
4448 &cmsgs[ncmsgbufs].level,
4449 &cmsgs[ncmsgbufs].type,
4450 &cmsgs[ncmsgbufs].data))
4451 goto finally;
4452 bufsize = cmsgs[ncmsgbufs++].data.len;
4453
4454#ifdef CMSG_SPACE
4455 if (!get_CMSG_SPACE(bufsize, &space)) {
4456#else
4457 if (!get_CMSG_LEN(bufsize, &space)) {
4458#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004459 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004460 goto finally;
4461 }
4462 controllen += space;
4463 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004464 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004465 goto finally;
4466 }
4467 controllen_last = controllen;
4468 }
4469
4470 /* Construct ancillary data block from control message info. */
4471 if (ncmsgbufs > 0) {
4472 struct cmsghdr *cmsgh = NULL;
4473
Victor Stinner52d61e42016-09-12 11:41:58 +02004474 controlbuf = PyMem_Malloc(controllen);
4475 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004476 PyErr_NoMemory();
4477 goto finally;
4478 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004479 msg.msg_control = controlbuf;
4480
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004481 msg.msg_controllen = controllen;
4482
4483 /* Need to zero out the buffer as a workaround for glibc's
4484 CMSG_NXTHDR() implementation. After getting the pointer to
4485 the next header, it checks its (uninitialized) cmsg_len
4486 member to see if the "message" fits in the buffer, and
4487 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004488 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004489 memset(controlbuf, 0, controllen);
4490
4491 for (i = 0; i < ncmsgbufs; i++) {
4492 size_t msg_len, data_len = cmsgs[i].data.len;
4493 int enough_space = 0;
4494
4495 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4496 if (cmsgh == NULL) {
4497 PyErr_Format(PyExc_RuntimeError,
4498 "unexpected NULL result from %s()",
4499 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4500 goto finally;
4501 }
4502 if (!get_CMSG_LEN(data_len, &msg_len)) {
4503 PyErr_SetString(PyExc_RuntimeError,
4504 "item size out of range for CMSG_LEN()");
4505 goto finally;
4506 }
4507 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4508 size_t space;
4509
4510 cmsgh->cmsg_len = msg_len;
4511 if (get_cmsg_data_space(&msg, cmsgh, &space))
4512 enough_space = (space >= data_len);
4513 }
4514 if (!enough_space) {
4515 PyErr_SetString(PyExc_RuntimeError,
4516 "ancillary data does not fit in calculated "
4517 "space");
4518 goto finally;
4519 }
4520 cmsgh->cmsg_level = cmsgs[i].level;
4521 cmsgh->cmsg_type = cmsgs[i].type;
4522 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4523 }
4524 }
4525
4526 /* Make the system call. */
4527 if (!IS_SELECTABLE(s)) {
4528 select_error();
4529 goto finally;
4530 }
4531
Victor Stinner31bf2d52015-04-01 21:57:09 +02004532 ctx.msg = &msg;
4533 ctx.flags = flags;
4534 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004535 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004536
4537 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004538
4539finally:
4540 PyMem_Free(controlbuf);
4541 for (i = 0; i < ncmsgbufs; i++)
4542 PyBuffer_Release(&cmsgs[i].data);
4543 PyMem_Free(cmsgs);
4544 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004545 PyMem_Free(msg.msg_iov);
4546 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004547 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004548 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004549 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004550 return retval;
4551}
4552
4553PyDoc_STRVAR(sendmsg_doc,
4554"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4555\n\
4556Send normal and ancillary data to the socket, gathering the\n\
4557non-ancillary data from a series of buffers and concatenating it into\n\
4558a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004559data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004560The ancdata argument specifies the ancillary data (control messages)\n\
4561as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4562cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4563protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004564is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004565argument defaults to 0 and has the same meaning as for send(). If\n\
4566address is supplied and not None, it sets a destination address for\n\
4567the message. The return value is the number of bytes of non-ancillary\n\
4568data sent.");
4569#endif /* CMSG_LEN */
4570
Christian Heimesdffa3942016-09-05 23:54:41 +02004571#ifdef HAVE_SOCKADDR_ALG
4572static PyObject*
4573sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4574{
4575 PyObject *retval = NULL;
4576
4577 Py_ssize_t i, ndatabufs = 0;
4578 Py_buffer *databufs = NULL;
4579 PyObject *data_arg = NULL;
4580
4581 Py_buffer iv = {NULL, NULL};
4582
4583 PyObject *opobj = NULL;
4584 int op = -1;
4585
4586 PyObject *assoclenobj = NULL;
4587 int assoclen = -1;
4588
4589 unsigned int *uiptr;
4590 int flags = 0;
4591
4592 struct msghdr msg;
4593 struct cmsghdr *header = NULL;
4594 struct af_alg_iv *alg_iv = NULL;
4595 struct sock_sendmsg ctx;
4596 Py_ssize_t controllen;
4597 void *controlbuf = NULL;
4598 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4599
4600 if (self->sock_family != AF_ALG) {
4601 PyErr_SetString(PyExc_OSError,
4602 "algset is only supported for AF_ALG");
4603 return NULL;
4604 }
4605
4606 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4607 "|O$O!y*O!i:sendmsg_afalg", keywords,
4608 &data_arg,
4609 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004610 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004611 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004612 }
4613
4614 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004615
4616 /* op is a required, keyword-only argument >= 0 */
4617 if (opobj != NULL) {
4618 op = _PyLong_AsInt(opobj);
4619 }
4620 if (op < 0) {
4621 /* override exception from _PyLong_AsInt() */
4622 PyErr_SetString(PyExc_TypeError,
4623 "Invalid or missing argument 'op'");
4624 goto finally;
4625 }
4626 /* assoclen is optional but must be >= 0 */
4627 if (assoclenobj != NULL) {
4628 assoclen = _PyLong_AsInt(assoclenobj);
4629 if (assoclen == -1 && PyErr_Occurred()) {
4630 goto finally;
4631 }
4632 if (assoclen < 0) {
4633 PyErr_SetString(PyExc_TypeError,
4634 "assoclen must be positive");
4635 goto finally;
4636 }
4637 }
4638
4639 controllen = CMSG_SPACE(4);
4640 if (iv.buf != NULL) {
4641 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4642 }
4643 if (assoclen >= 0) {
4644 controllen += CMSG_SPACE(4);
4645 }
4646
4647 controlbuf = PyMem_Malloc(controllen);
4648 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004649 PyErr_NoMemory();
4650 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004651 }
4652 memset(controlbuf, 0, controllen);
4653
Christian Heimesdffa3942016-09-05 23:54:41 +02004654 msg.msg_controllen = controllen;
4655 msg.msg_control = controlbuf;
4656
4657 /* Fill in an iovec for each message part, and save the Py_buffer
4658 structs to release afterwards. */
4659 if (data_arg != NULL) {
4660 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4661 goto finally;
4662 }
4663 }
4664
4665 /* set operation to encrypt or decrypt */
4666 header = CMSG_FIRSTHDR(&msg);
4667 if (header == NULL) {
4668 PyErr_SetString(PyExc_RuntimeError,
4669 "unexpected NULL result from CMSG_FIRSTHDR");
4670 goto finally;
4671 }
4672 header->cmsg_level = SOL_ALG;
4673 header->cmsg_type = ALG_SET_OP;
4674 header->cmsg_len = CMSG_LEN(4);
4675 uiptr = (void*)CMSG_DATA(header);
4676 *uiptr = (unsigned int)op;
4677
4678 /* set initialization vector */
4679 if (iv.buf != NULL) {
4680 header = CMSG_NXTHDR(&msg, header);
4681 if (header == NULL) {
4682 PyErr_SetString(PyExc_RuntimeError,
4683 "unexpected NULL result from CMSG_NXTHDR(iv)");
4684 goto finally;
4685 }
4686 header->cmsg_level = SOL_ALG;
4687 header->cmsg_type = ALG_SET_IV;
4688 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4689 alg_iv = (void*)CMSG_DATA(header);
4690 alg_iv->ivlen = iv.len;
4691 memcpy(alg_iv->iv, iv.buf, iv.len);
4692 }
4693
4694 /* set length of associated data for AEAD */
4695 if (assoclen >= 0) {
4696 header = CMSG_NXTHDR(&msg, header);
4697 if (header == NULL) {
4698 PyErr_SetString(PyExc_RuntimeError,
4699 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4700 goto finally;
4701 }
4702 header->cmsg_level = SOL_ALG;
4703 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4704 header->cmsg_len = CMSG_LEN(4);
4705 uiptr = (void*)CMSG_DATA(header);
4706 *uiptr = (unsigned int)assoclen;
4707 }
4708
4709 ctx.msg = &msg;
4710 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004711 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004712 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004713 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004714
4715 retval = PyLong_FromSsize_t(ctx.result);
4716
4717 finally:
4718 PyMem_Free(controlbuf);
4719 if (iv.buf != NULL) {
4720 PyBuffer_Release(&iv);
4721 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004722 PyMem_Free(msg.msg_iov);
4723 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004724 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004725 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004726 PyMem_Free(databufs);
4727 return retval;
4728}
4729
4730PyDoc_STRVAR(sendmsg_afalg_doc,
4731"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4732\n\
4733Set operation mode, IV and length of associated data for an AF_ALG\n\
4734operation socket.");
4735#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004736
Guido van Rossum30a685f1991-06-27 15:51:29 +00004737/* s.shutdown(how) method */
4738
Guido van Rossum73624e91994-10-10 17:59:00 +00004739static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004740sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 int how;
4743 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004744
Serhiy Storchaka78980432013-01-15 01:12:17 +02004745 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 if (how == -1 && PyErr_Occurred())
4747 return NULL;
4748 Py_BEGIN_ALLOW_THREADS
4749 res = shutdown(s->sock_fd, how);
4750 Py_END_ALLOW_THREADS
4751 if (res < 0)
4752 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004753 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004754}
4755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004756PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004757"shutdown(flag)\n\
4758\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004759Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4760of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004761
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004762#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004763static PyObject*
4764sock_ioctl(PySocketSockObject *s, PyObject *arg)
4765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 unsigned long cmd = SIO_RCVALL;
4767 PyObject *argO;
4768 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4771 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 switch (cmd) {
4774 case SIO_RCVALL: {
4775 unsigned int option = RCVALL_ON;
4776 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4777 return NULL;
4778 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4779 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4780 return set_error();
4781 }
4782 return PyLong_FromUnsignedLong(recv); }
4783 case SIO_KEEPALIVE_VALS: {
4784 struct tcp_keepalive ka;
4785 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4786 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4787 return NULL;
4788 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4789 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4790 return set_error();
4791 }
4792 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004793#if defined(SIO_LOOPBACK_FAST_PATH)
4794 case SIO_LOOPBACK_FAST_PATH: {
4795 unsigned int option;
4796 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4797 return NULL;
4798 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4799 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4800 return set_error();
4801 }
4802 return PyLong_FromUnsignedLong(recv); }
4803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004805 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 return NULL;
4807 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004808}
4809PyDoc_STRVAR(sock_ioctl_doc,
4810"ioctl(cmd, option) -> long\n\
4811\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004812Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4813SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004814SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4815SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004816#endif
4817
4818#if defined(MS_WINDOWS)
4819static PyObject*
4820sock_share(PySocketSockObject *s, PyObject *arg)
4821{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004822 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004823 DWORD processId;
4824 int result;
4825
4826 if (!PyArg_ParseTuple(arg, "I", &processId))
4827 return NULL;
4828
4829 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004830 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004831 Py_END_ALLOW_THREADS
4832 if (result == SOCKET_ERROR)
4833 return set_error();
4834 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4835}
4836PyDoc_STRVAR(sock_share_doc,
4837"share(process_id) -> bytes\n\
4838\n\
4839Share the socket with another process. The target process id\n\
4840must be provided and the resulting bytes object passed to the target\n\
4841process. There the shared socket can be instantiated by calling\n\
4842socket.fromshare().");
4843
Christian Heimesfaf2f632008-01-06 16:59:19 +00004844
4845#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004846
4847/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004848
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004849static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4851 accept_doc},
4852 {"bind", (PyCFunction)sock_bind, METH_O,
4853 bind_doc},
4854 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004855 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 {"connect", (PyCFunction)sock_connect, METH_O,
4857 connect_doc},
4858 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4859 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004860 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4861 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4863 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004864#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 {"getpeername", (PyCFunction)sock_getpeername,
4866 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 {"getsockname", (PyCFunction)sock_getsockname,
4869 METH_NOARGS, getsockname_doc},
4870 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4871 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004872#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4874 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004875#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004876#if defined(MS_WINDOWS)
4877 {"share", (PyCFunction)sock_share, METH_VARARGS,
4878 sock_share_doc},
4879#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004880 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 listen_doc},
4882 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4883 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004884 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 recv_into_doc},
4886 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4887 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004888 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 recvfrom_into_doc},
4890 {"send", (PyCFunction)sock_send, METH_VARARGS,
4891 send_doc},
4892 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4893 sendall_doc},
4894 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4895 sendto_doc},
4896 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4897 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004898 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4899 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4901 settimeout_doc},
4902 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4903 gettimeout_doc},
4904 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4905 setsockopt_doc},
4906 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4907 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004908#ifdef CMSG_LEN
4909 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4910 recvmsg_doc},
4911 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4912 recvmsg_into_doc,},
4913 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4914 sendmsg_doc},
4915#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004916#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004917 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004918 sendmsg_afalg_doc},
4919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004921};
4922
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004923/* SockObject members */
4924static PyMemberDef sock_memberlist[] = {
4925 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4926 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4927 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004928 {0},
4929};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004930
Victor Stinner71694d52015-03-28 01:18:54 +01004931static PyGetSetDef sock_getsetlist[] = {
4932 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4933 {NULL} /* sentinel */
4934};
4935
Guido van Rossum73624e91994-10-10 17:59:00 +00004936/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004937 First close the file description. */
4938
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004939static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004940sock_finalize(PySocketSockObject *s)
4941{
4942 SOCKET_T fd;
4943 PyObject *error_type, *error_value, *error_traceback;
4944
4945 /* Save the current exception, if any. */
4946 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4947
Victor Stinnerd3afb622016-07-22 17:47:09 +02004948 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004949 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4950 /* Spurious errors can appear at shutdown */
4951 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4952 PyErr_WriteUnraisable((PyObject *)s);
4953 }
4954 }
4955
4956 /* Only close the socket *after* logging the ResourceWarning warning
4957 to allow the logger to call socket methods like
4958 socket.getsockname(). If the socket is closed before, socket
4959 methods fails with the EBADF error. */
4960 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004961 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004962
4963 /* We do not want to retry upon EINTR: see sock_close() */
4964 Py_BEGIN_ALLOW_THREADS
4965 (void) SOCKETCLOSE(fd);
4966 Py_END_ALLOW_THREADS
4967 }
4968
4969 /* Restore the saved exception. */
4970 PyErr_Restore(error_type, error_value, error_traceback);
4971}
4972
4973static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004974sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004975{
Victor Stinner19a8e842016-03-21 16:36:48 +01004976 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4977 return;
4978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004980}
4981
Guido van Rossum30a685f1991-06-27 15:51:29 +00004982
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004983static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004984sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004985{
Victor Stinnere254e532014-07-26 14:36:55 +02004986 long sock_fd;
4987 /* On Windows, this test is needed because SOCKET_T is unsigned */
4988 if (s->sock_fd == INVALID_SOCKET) {
4989 sock_fd = -1;
4990 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004991#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004992 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 /* this can occur on Win64, and actually there is a special
4994 ugly printf formatter for decimal pointer length integer
4995 printing, only bother if necessary*/
4996 PyErr_SetString(PyExc_OverflowError,
4997 "no printf formatter to display "
4998 "the socket descriptor in decimal");
4999 return NULL;
5000 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005001#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005002 else
5003 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 return PyUnicode_FromFormat(
5005 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005006 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 s->sock_type,
5008 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005009}
5010
5011
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005012/* Create a new, uninitialized socket object. */
5013
5014static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005015sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 new = type->tp_alloc(type, 0);
5020 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005021 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005022 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 ((PySocketSockObject *)new)->errorhandler = &set_error;
5024 }
5025 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005026}
5027
5028
5029/* Initialize a new socket object. */
5030
Victor Stinnerdaf45552013-08-28 00:53:59 +02005031#ifdef SOCK_CLOEXEC
5032/* socket() and socketpair() fail with EINVAL on Linux kernel older
5033 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5034static int sock_cloexec_works = -1;
5035#endif
5036
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005037/*ARGSUSED*/
5038static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005039sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 PySocketSockObject *s = (PySocketSockObject *)self;
5042 PyObject *fdobj = NULL;
5043 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005044 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005045 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005046#ifndef MS_WINDOWS
5047#ifdef SOCK_CLOEXEC
5048 int *atomic_flag_works = &sock_cloexec_works;
5049#else
5050 int *atomic_flag_works = NULL;
5051#endif
5052#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5055 "|iiiO:socket", keywords,
5056 &family, &type, &proto, &fdobj))
5057 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005058
Steve Dowerb82e17e2019-05-23 08:45:22 -07005059#ifdef MS_WINDOWS
5060 /* In this case, we don't use the family, type and proto args */
5061 if (fdobj != NULL && fdobj != Py_None)
5062#endif
5063 {
5064 if (PySys_Audit("socket.__new__", "Oiii",
5065 s, family, type, proto) < 0) {
5066 return -1;
5067 }
5068 }
5069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005071#ifdef MS_WINDOWS
5072 /* recreate a socket that was duplicated */
5073 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005074 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005075 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5076 PyErr_Format(PyExc_ValueError,
5077 "socket descriptor string has wrong size, "
5078 "should be %zu bytes.", sizeof(info));
5079 return -1;
5080 }
5081 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005082
5083 if (PySys_Audit("socket()", "iii", info.iAddressFamily,
5084 info.iSocketType, info.iProtocol) < 0) {
5085 return -1;
5086 }
5087
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005088 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005089 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005090 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5091 Py_END_ALLOW_THREADS
5092 if (fd == INVALID_SOCKET) {
5093 set_error();
5094 return -1;
5095 }
5096 family = info.iAddressFamily;
5097 type = info.iSocketType;
5098 proto = info.iProtocol;
5099 }
5100 else
5101#endif
5102 {
Dima Tisneke9912702018-12-17 22:07:55 +09005103
5104 if (PyFloat_Check(fdobj)) {
5105 PyErr_SetString(PyExc_TypeError,
5106 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005107 return -1;
5108 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005109
Dima Tisneke9912702018-12-17 22:07:55 +09005110 fd = PyLong_AsSocket_t(fdobj);
5111 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5112 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005113#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005114 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005115#else
Dima Tisneke9912702018-12-17 22:07:55 +09005116 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005117#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005118 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5119 return -1;
5120 }
5121
5122 /* validate that passed file descriptor is valid and a socket. */
5123 sock_addr_t addrbuf;
5124 socklen_t addrlen = sizeof(sock_addr_t);
5125
5126 memset(&addrbuf, 0, addrlen);
5127 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5128 if (family == -1) {
5129 family = SAS2SA(&addrbuf)->sa_family;
5130 }
5131 } else {
5132#ifdef MS_WINDOWS
5133 /* getsockname() on an unbound socket is an error on Windows.
5134 Invalid descriptor and not a socket is same error code.
5135 Error out if family must be resolved, or bad descriptor. */
5136 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5137#else
5138 /* getsockname() is not supported for SOL_ALG on Linux. */
5139 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5140#endif
5141 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005142 return -1;
5143 }
5144 }
5145#ifdef SO_TYPE
5146 if (type == -1) {
5147 int tmp;
5148 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005149 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5150 (void *)&tmp, &slen) == 0)
5151 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005152 type = tmp;
5153 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005154 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005155 return -1;
5156 }
5157 }
5158#else
5159 type = SOCK_STREAM;
5160#endif
5161#ifdef SO_PROTOCOL
5162 if (proto == -1) {
5163 int tmp;
5164 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005165 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5166 (void *)&tmp, &slen) == 0)
5167 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005168 proto = tmp;
5169 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005170 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005171 return -1;
5172 }
5173 }
5174#else
5175 proto = 0;
5176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 }
5178 }
5179 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005180 /* No fd, default to AF_INET and SOCK_STREAM */
5181 if (family == -1) {
5182 family = AF_INET;
5183 }
5184 if (type == -1) {
5185 type = SOCK_STREAM;
5186 }
5187 if (proto == -1) {
5188 proto = 0;
5189 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005190#ifdef MS_WINDOWS
5191 /* Windows implementation */
5192#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5193#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5194#endif
5195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005197 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005198 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005199 NULL, 0,
5200 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5201 if (fd == INVALID_SOCKET) {
5202 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5203 support_wsa_no_inherit = 0;
5204 fd = socket(family, type, proto);
5205 }
5206 }
5207 else {
5208 fd = socket(family, type, proto);
5209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 if (fd == INVALID_SOCKET) {
5213 set_error();
5214 return -1;
5215 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005216
5217 if (!support_wsa_no_inherit) {
5218 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5219 closesocket(fd);
5220 PyErr_SetFromWindowsErr(0);
5221 return -1;
5222 }
5223 }
5224#else
5225 /* UNIX */
5226 Py_BEGIN_ALLOW_THREADS
5227#ifdef SOCK_CLOEXEC
5228 if (sock_cloexec_works != 0) {
5229 fd = socket(family, type | SOCK_CLOEXEC, proto);
5230 if (sock_cloexec_works == -1) {
5231 if (fd >= 0) {
5232 sock_cloexec_works = 1;
5233 }
5234 else if (errno == EINVAL) {
5235 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5236 sock_cloexec_works = 0;
5237 fd = socket(family, type, proto);
5238 }
5239 }
5240 }
5241 else
5242#endif
5243 {
5244 fd = socket(family, type, proto);
5245 }
5246 Py_END_ALLOW_THREADS
5247
5248 if (fd == INVALID_SOCKET) {
5249 set_error();
5250 return -1;
5251 }
5252
5253 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5254 SOCKETCLOSE(fd);
5255 return -1;
5256 }
5257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005259 if (init_sockobject(s, fd, family, type, proto) == -1) {
5260 SOCKETCLOSE(fd);
5261 return -1;
5262 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005265
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005266}
5267
5268
Guido van Rossumb6775db1994-08-01 11:34:53 +00005269/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005270
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005271static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5273 "_socket.socket", /* tp_name */
5274 sizeof(PySocketSockObject), /* tp_basicsize */
5275 0, /* tp_itemsize */
5276 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005277 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 0, /* tp_getattr */
5279 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005280 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 (reprfunc)sock_repr, /* tp_repr */
5282 0, /* tp_as_number */
5283 0, /* tp_as_sequence */
5284 0, /* tp_as_mapping */
5285 0, /* tp_hash */
5286 0, /* tp_call */
5287 0, /* tp_str */
5288 PyObject_GenericGetAttr, /* tp_getattro */
5289 0, /* tp_setattro */
5290 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005291 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 sock_doc, /* tp_doc */
5293 0, /* tp_traverse */
5294 0, /* tp_clear */
5295 0, /* tp_richcompare */
5296 0, /* tp_weaklistoffset */
5297 0, /* tp_iter */
5298 0, /* tp_iternext */
5299 sock_methods, /* tp_methods */
5300 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005301 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 0, /* tp_base */
5303 0, /* tp_dict */
5304 0, /* tp_descr_get */
5305 0, /* tp_descr_set */
5306 0, /* tp_dictoffset */
5307 sock_initobj, /* tp_init */
5308 PyType_GenericAlloc, /* tp_alloc */
5309 sock_new, /* tp_new */
5310 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005311 0, /* tp_is_gc */
5312 0, /* tp_bases */
5313 0, /* tp_mro */
5314 0, /* tp_cache */
5315 0, /* tp_subclasses */
5316 0, /* tp_weaklist */
5317 0, /* tp_del */
5318 0, /* tp_version_tag */
5319 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005320};
5321
Guido van Rossum30a685f1991-06-27 15:51:29 +00005322
Guido van Rossum81194471991-07-27 21:42:02 +00005323/* Python interface to gethostname(). */
5324
5325/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005326static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005327socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005328{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005329 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5330 return NULL;
5331 }
5332
Martin v. Löwis72f48422010-10-29 18:20:08 +00005333#ifdef MS_WINDOWS
5334 /* Don't use winsock's gethostname, as this returns the ANSI
5335 version of the hostname, whereas we need a Unicode string.
5336 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005337 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005338 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005339 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005340 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005341
5342 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005343 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005344
5345 if (GetLastError() != ERROR_MORE_DATA)
5346 return PyErr_SetFromWindowsErr(0);
5347
5348 if (size == 0)
5349 return PyUnicode_New(0, 0);
5350
5351 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5352 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005353 name = PyMem_New(wchar_t, size);
5354 if (!name) {
5355 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005356 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005357 }
Victor Stinner74168972011-11-17 01:11:36 +01005358 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5359 name,
5360 &size))
5361 {
5362 PyMem_Free(name);
5363 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005364 }
Victor Stinner74168972011-11-17 01:11:36 +01005365
5366 result = PyUnicode_FromWideChar(name, size);
5367 PyMem_Free(name);
5368 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005369#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 char buf[1024];
5371 int res;
5372 Py_BEGIN_ALLOW_THREADS
5373 res = gethostname(buf, (int) sizeof buf - 1);
5374 Py_END_ALLOW_THREADS
5375 if (res < 0)
5376 return set_error();
5377 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005378 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005379#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005380}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005382PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005383"gethostname() -> string\n\
5384\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005385Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005386
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005387#ifdef HAVE_SETHOSTNAME
5388PyDoc_STRVAR(sethostname_doc,
5389"sethostname(name)\n\n\
5390Sets the hostname to name.");
5391
5392static PyObject *
5393socket_sethostname(PyObject *self, PyObject *args)
5394{
5395 PyObject *hnobj;
5396 Py_buffer buf;
5397 int res, flag = 0;
5398
Christian Heimesd2774c72013-06-19 02:06:29 +02005399#ifdef _AIX
5400/* issue #18259, not declared in any useful header file */
5401extern int sethostname(const char *, size_t);
5402#endif
5403
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005404 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5405 PyErr_Clear();
5406 if (!PyArg_ParseTuple(args, "O&:sethostname",
5407 PyUnicode_FSConverter, &hnobj))
5408 return NULL;
5409 flag = 1;
5410 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005411
5412 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5413 return NULL;
5414 }
5415
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005416 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5417 if (!res) {
5418 res = sethostname(buf.buf, buf.len);
5419 PyBuffer_Release(&buf);
5420 }
5421 if (flag)
5422 Py_DECREF(hnobj);
5423 if (res)
5424 return set_error();
5425 Py_RETURN_NONE;
5426}
5427#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005428
Guido van Rossum30a685f1991-06-27 15:51:29 +00005429/* Python interface to gethostbyname(name). */
5430
5431/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005432static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005433socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005436 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005437 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005438
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005439 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005441 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5442 goto finally;
5443 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005444 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005445 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005446 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005447finally:
5448 PyMem_Free(name);
5449 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005450}
5451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005452PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005453"gethostbyname(host) -> address\n\
5454\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005455Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005456
5457
Victor Stinner72400302016-01-28 15:41:01 +01005458static PyObject*
5459sock_decode_hostname(const char *name)
5460{
5461#ifdef MS_WINDOWS
5462 /* Issue #26227: gethostbyaddr() returns a string encoded
5463 * to the ANSI code page */
5464 return PyUnicode_DecodeFSDefault(name);
5465#else
5466 /* Decode from UTF-8 */
5467 return PyUnicode_FromString(name);
5468#endif
5469}
5470
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005471/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5472
5473static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005474gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 char **pch;
5477 PyObject *rtn_tuple = (PyObject *)NULL;
5478 PyObject *name_list = (PyObject *)NULL;
5479 PyObject *addr_list = (PyObject *)NULL;
5480 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005481 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 if (h == NULL) {
5484 /* Let's get real error message to return */
5485 set_herror(h_errno);
5486 return NULL;
5487 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 if (h->h_addrtype != af) {
5490 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005491 errno = EAFNOSUPPORT;
5492 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005493 return NULL;
5494 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 case AF_INET:
5499 if (alen < sizeof(struct sockaddr_in))
5500 return NULL;
5501 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005502
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005503#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 case AF_INET6:
5505 if (alen < sizeof(struct sockaddr_in6))
5506 return NULL;
5507 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005508#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 if ((name_list = PyList_New(0)) == NULL)
5513 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 if ((addr_list = PyList_New(0)) == NULL)
5516 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 /* SF #1511317: h_aliases can be NULL */
5519 if (h->h_aliases) {
5520 for (pch = h->h_aliases; *pch != NULL; pch++) {
5521 int status;
5522 tmp = PyUnicode_FromString(*pch);
5523 if (tmp == NULL)
5524 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 status = PyList_Append(name_list, tmp);
5527 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 if (status)
5530 goto err;
5531 }
5532 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5535 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 case AF_INET:
5540 {
5541 struct sockaddr_in sin;
5542 memset(&sin, 0, sizeof(sin));
5543 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005544#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005548 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 if (pch == h->h_addr_list && alen >= sizeof(sin))
5551 memcpy((char *) addr, &sin, sizeof(sin));
5552 break;
5553 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005554
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005555#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 case AF_INET6:
5557 {
5558 struct sockaddr_in6 sin6;
5559 memset(&sin6, 0, sizeof(sin6));
5560 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005561#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005565 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5568 memcpy((char *) addr, &sin6, sizeof(sin6));
5569 break;
5570 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005571#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005574 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 "unsupported address family");
5576 return NULL;
5577 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 if (tmp == NULL)
5580 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 status = PyList_Append(addr_list, tmp);
5583 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 if (status)
5586 goto err;
5587 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005588
Victor Stinner72400302016-01-28 15:41:01 +01005589 name = sock_decode_hostname(h->h_name);
5590 if (name == NULL)
5591 goto err;
5592 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005593
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005594 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 Py_XDECREF(name_list);
5596 Py_XDECREF(addr_list);
5597 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005598}
5599
5600
5601/* Python interface to gethostbyname_ex(name). */
5602
5603/*ARGSUSED*/
5604static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005605socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 char *name;
5608 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005609 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005611 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005612#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005614#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005616#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 char buf[16384];
5618 int buf_len = (sizeof buf) - 1;
5619 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005620#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005621#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005623#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005624#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005625
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005626 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005628 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5629 goto finally;
5630 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005631 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005632 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005634#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005635#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005636 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005638#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005640#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 memset((void *) &data, '\0', sizeof(data));
5642 result = gethostbyname_r(name, &hp_allocated, &data);
5643 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005644#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005645#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005646#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005648#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005649 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005651#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 Py_END_ALLOW_THREADS
5653 /* Some C libraries would require addr.__ss_family instead of
5654 addr.ss_family.
5655 Therefore, we cast the sockaddr_storage into sockaddr to
5656 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005657 sa = SAS2SA(&addr);
5658 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005660#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005662#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005663finally:
5664 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005666}
5667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005668PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005669"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5670\n\
5671Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005672for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005673
5674
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005675/* Python interface to gethostbyaddr(IP). */
5676
5677/*ARGSUSED*/
5678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005679socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005680{
Charles-François Natali8b759652011-12-23 16:44:51 +01005681 sock_addr_t addr;
5682 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 char *ip_num;
5684 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005685 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005686#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005688#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 /* glibcs up to 2.10 assume that the buf argument to
5692 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5693 does not ensure. The attribute below instructs the compiler
5694 to maintain this alignment. */
5695 char buf[16384] Py_ALIGNED(8);
5696 int buf_len = (sizeof buf) - 1;
5697 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005698#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005699#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005701#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005702#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005703 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 int al;
5705 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005706
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005707 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005709 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5710 goto finally;
5711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 af = AF_UNSPEC;
5713 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005714 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 af = sa->sa_family;
5716 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005717 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005718 switch (af) {
5719 case AF_INET:
5720 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5721 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5722 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005723#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 case AF_INET6:
5725 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5726 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5727 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005730 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005731 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 }
5733 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005734#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005735#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005736 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 &hp_allocated, buf, buf_len,
5738 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005739#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 h = gethostbyaddr_r(ap, al, af,
5741 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005742#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 memset((void *) &data, '\0', sizeof(data));
5744 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5745 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005746#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005747#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005748#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005750#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005751 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005753#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005755 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
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 Rossum3baaa131999-03-22 21:44:51 +00005758#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005759finally:
5760 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005762}
5763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005764PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005765"gethostbyaddr(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 Rossum82a5c661998-07-07 20:45:43 +00005769
Guido van Rossum30a685f1991-06-27 15:51:29 +00005770
5771/* Python interface to getservbyname(name).
5772 This only returns the port number, since the other info is already
5773 known or not useful (like the list of aliases). */
5774
5775/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005776static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005777socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005778{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005779 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 struct servent *sp;
5781 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5782 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005783
5784 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5785 return NULL;
5786 }
5787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 Py_BEGIN_ALLOW_THREADS
5789 sp = getservbyname(name, proto);
5790 Py_END_ALLOW_THREADS
5791 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005792 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 return NULL;
5794 }
5795 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005796}
5797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005798PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005799"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005800\n\
5801Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005802The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5803otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005804
Guido van Rossum30a685f1991-06-27 15:51:29 +00005805
Barry Warsaw11b91a02004-06-28 00:50:43 +00005806/* Python interface to getservbyport(port).
5807 This only returns the service name, since the other info is already
5808 known or not useful (like the list of aliases). */
5809
5810/*ARGSUSED*/
5811static PyObject *
5812socket_getservbyport(PyObject *self, PyObject *args)
5813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005815 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005816 struct servent *sp;
5817 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5818 return NULL;
5819 if (port < 0 || port > 0xffff) {
5820 PyErr_SetString(
5821 PyExc_OverflowError,
5822 "getservbyport: port must be 0-65535.");
5823 return NULL;
5824 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005825
5826 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5827 return NULL;
5828 }
5829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 Py_BEGIN_ALLOW_THREADS
5831 sp = getservbyport(htons((short)port), proto);
5832 Py_END_ALLOW_THREADS
5833 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005834 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 return NULL;
5836 }
5837 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005838}
5839
5840PyDoc_STRVAR(getservbyport_doc,
5841"getservbyport(port[, protocolname]) -> string\n\
5842\n\
5843Return the service name from a port number and protocol name.\n\
5844The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5845otherwise any protocol will match.");
5846
Guido van Rossum3901d851996-12-19 16:35:04 +00005847/* Python interface to getprotobyname(name).
5848 This only returns the protocol number, since the other info is
5849 already known or not useful (like the list of aliases). */
5850
5851/*ARGSUSED*/
5852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005853socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005854{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005855 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 struct protoent *sp;
5857 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5858 return NULL;
5859 Py_BEGIN_ALLOW_THREADS
5860 sp = getprotobyname(name);
5861 Py_END_ALLOW_THREADS
5862 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005863 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 return NULL;
5865 }
5866 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005867}
5868
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005869PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005870"getprotobyname(name) -> integer\n\
5871\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005872Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005873
Christian Heimesd0e31b92018-01-27 09:54:13 +01005874static PyObject *
5875socket_close(PyObject *self, PyObject *fdobj)
5876{
5877 SOCKET_T fd;
5878 int res;
5879
5880 fd = PyLong_AsSocket_t(fdobj);
5881 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5882 return NULL;
5883 Py_BEGIN_ALLOW_THREADS
5884 res = SOCKETCLOSE(fd);
5885 Py_END_ALLOW_THREADS
5886 /* bpo-30319: The peer can already have closed the connection.
5887 Python ignores ECONNRESET on close(). */
5888 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5889 return set_error();
5890 }
5891 Py_RETURN_NONE;
5892}
5893
5894PyDoc_STRVAR(close_doc,
5895"close(integer) -> None\n\
5896\n\
5897Close an integer socket file descriptor. This is like os.close(), but for\n\
5898sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005899
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005900#ifndef NO_DUP
5901/* dup() function for socket fds */
5902
5903static PyObject *
5904socket_dup(PyObject *self, PyObject *fdobj)
5905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 SOCKET_T fd, newfd;
5907 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005908#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005909 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005910#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 fd = PyLong_AsSocket_t(fdobj);
5913 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5914 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005915
Victor Stinnerdaf45552013-08-28 00:53:59 +02005916#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005917 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005918 return set_error();
5919
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005920 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005921 FROM_PROTOCOL_INFO,
5922 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 if (newfd == INVALID_SOCKET)
5924 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005925
Victor Stinnerdaf45552013-08-28 00:53:59 +02005926 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5927 closesocket(newfd);
5928 PyErr_SetFromWindowsErr(0);
5929 return NULL;
5930 }
5931#else
5932 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5933 newfd = _Py_dup(fd);
5934 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005935 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005936#endif
5937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 newfdobj = PyLong_FromSocket_t(newfd);
5939 if (newfdobj == NULL)
5940 SOCKETCLOSE(newfd);
5941 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005942}
5943
5944PyDoc_STRVAR(dup_doc,
5945"dup(integer) -> integer\n\
5946\n\
5947Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5948sockets; on some platforms os.dup() won't work for socket file descriptors.");
5949#endif
5950
5951
Dave Cole331708b2004-08-09 04:51:41 +00005952#ifdef HAVE_SOCKETPAIR
5953/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005954 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005955 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005956
5957/*ARGSUSED*/
5958static PyObject *
5959socket_socketpair(PyObject *self, PyObject *args)
5960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 PySocketSockObject *s0 = NULL, *s1 = NULL;
5962 SOCKET_T sv[2];
5963 int family, type = SOCK_STREAM, proto = 0;
5964 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005965#ifdef SOCK_CLOEXEC
5966 int *atomic_flag_works = &sock_cloexec_works;
5967#else
5968 int *atomic_flag_works = NULL;
5969#endif
5970 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005971
5972#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005974#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5978 &family, &type, &proto))
5979 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005982 Py_BEGIN_ALLOW_THREADS
5983#ifdef SOCK_CLOEXEC
5984 if (sock_cloexec_works != 0) {
5985 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5986 if (sock_cloexec_works == -1) {
5987 if (ret >= 0) {
5988 sock_cloexec_works = 1;
5989 }
5990 else if (errno == EINVAL) {
5991 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5992 sock_cloexec_works = 0;
5993 ret = socketpair(family, type, proto, sv);
5994 }
5995 }
5996 }
5997 else
5998#endif
5999 {
6000 ret = socketpair(family, type, proto, sv);
6001 }
6002 Py_END_ALLOW_THREADS
6003
6004 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006006
6007 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6008 goto finally;
6009 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6010 goto finally;
6011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 s0 = new_sockobject(sv[0], family, type, proto);
6013 if (s0 == NULL)
6014 goto finally;
6015 s1 = new_sockobject(sv[1], family, type, proto);
6016 if (s1 == NULL)
6017 goto finally;
6018 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006019
6020finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 if (res == NULL) {
6022 if (s0 == NULL)
6023 SOCKETCLOSE(sv[0]);
6024 if (s1 == NULL)
6025 SOCKETCLOSE(sv[1]);
6026 }
6027 Py_XDECREF(s0);
6028 Py_XDECREF(s1);
6029 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006030}
6031
6032PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006033"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006034\n\
6035Create a pair of socket objects from the sockets returned by the platform\n\
6036socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006037The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006038AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006039
6040#endif /* HAVE_SOCKETPAIR */
6041
6042
Guido van Rossum006bf911996-06-12 04:04:55 +00006043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006044socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006045{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006046 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006047
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006048 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 return NULL;
6050 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006051 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006053 "ntohs: can't convert negative Python int to C "
6054 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006055 return NULL;
6056 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006057 if (x > 0xffff) {
6058 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6059 "ntohs: Python int too large to convert to C "
6060 "16-bit unsigned integer (The silent truncation "
6061 "is deprecated)",
6062 1)) {
6063 return NULL;
6064 }
6065 }
6066 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006067}
6068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006069PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006070"ntohs(integer) -> integer\n\
6071\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006072Convert a 16-bit unsigned integer from network to host byte order.\n\
6073Note that in case the received integer does not fit in 16-bit unsigned\n\
6074integer, but does fit in a positive C int, it is silently truncated to\n\
607516-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006076However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006077exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006078
6079
Guido van Rossum006bf911996-06-12 04:04:55 +00006080static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006081socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 if (PyLong_Check(arg)) {
6086 x = PyLong_AsUnsignedLong(arg);
6087 if (x == (unsigned long) -1 && PyErr_Occurred())
6088 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006089#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 {
6091 unsigned long y;
6092 /* only want the trailing 32 bits */
6093 y = x & 0xFFFFFFFFUL;
6094 if (y ^ x)
6095 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006096 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 x = y;
6098 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 }
6101 else
6102 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006103 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006106}
6107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006108PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006109"ntohl(integer) -> integer\n\
6110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006111Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006112
6113
Guido van Rossum006bf911996-06-12 04:04:55 +00006114static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006115socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006116{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006117 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006118
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006119 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 return NULL;
6121 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006122 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006124 "htons: can't convert negative Python int to C "
6125 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126 return NULL;
6127 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006128 if (x > 0xffff) {
6129 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6130 "htons: Python int too large to convert to C "
6131 "16-bit unsigned integer (The silent truncation "
6132 "is deprecated)",
6133 1)) {
6134 return NULL;
6135 }
6136 }
6137 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006138}
6139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006140PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006141"htons(integer) -> integer\n\
6142\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006143Convert a 16-bit unsigned integer from host to network byte order.\n\
6144Note that in case the received integer does not fit in 16-bit unsigned\n\
6145integer, but does fit in a positive C int, it is silently truncated to\n\
614616-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006147However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006148exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006149
6150
Guido van Rossum006bf911996-06-12 04:04:55 +00006151static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006152socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 if (PyLong_Check(arg)) {
6157 x = PyLong_AsUnsignedLong(arg);
6158 if (x == (unsigned long) -1 && PyErr_Occurred())
6159 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006160#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 {
6162 unsigned long y;
6163 /* only want the trailing 32 bits */
6164 y = x & 0xFFFFFFFFUL;
6165 if (y ^ x)
6166 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006167 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 x = y;
6169 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 }
6172 else
6173 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006174 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 Py_TYPE(arg)->tp_name);
6176 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006177}
6178
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006179PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006180"htonl(integer) -> integer\n\
6181\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006182Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006183
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006184/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006186PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006187"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006188\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006189Convert 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 +00006190binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006191
6192static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006193socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006194{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006195#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006197#endif
6198
6199#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006200#if (SIZEOF_INT != 4)
6201#error "Not sure if in_addr_t exists and int is not 32-bits."
6202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 /* Have to use inet_addr() instead */
6204 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006205#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006206 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6209 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006210
Tim Peters1df9fdd2003-02-13 03:13:40 +00006211
6212#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006213
6214#ifdef USE_INET_ATON_WEAKLINK
6215 if (inet_aton != NULL) {
6216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 if (inet_aton(ip_addr, &buf))
6218 return PyBytes_FromStringAndSize((char *)(&buf),
6219 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006220
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006221 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222 "illegal IP address string passed to inet_aton");
6223 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006224
Thomas Wouters477c8d52006-05-27 19:21:47 +00006225#ifdef USE_INET_ATON_WEAKLINK
6226 } else {
6227#endif
6228
6229#endif
6230
6231#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 /* special-case this address as inet_addr might return INADDR_NONE
6234 * for this */
6235 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006236 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006238
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006239 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006243 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 "illegal IP address string passed to inet_aton");
6245 return NULL;
6246 }
6247 }
6248 return PyBytes_FromStringAndSize((char *) &packed_addr,
6249 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006250
6251#ifdef USE_INET_ATON_WEAKLINK
6252 }
6253#endif
6254
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006255#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006256}
6257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006258PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006259"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006260\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006261Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006262
6263static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006264socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006265{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006266 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006268
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006269 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 return NULL;
6271 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006272
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006273 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006274 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006276 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 return NULL;
6278 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006279
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006280 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6281 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006282
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006283 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006285}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006286
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006287#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006288
6289PyDoc_STRVAR(inet_pton_doc,
6290"inet_pton(af, ip) -> packed IP address string\n\
6291\n\
6292Convert an IP address from string format to a packed string suitable\n\
6293for use with low-level network functions.");
6294
6295static PyObject *
6296socket_inet_pton(PyObject *self, PyObject *args)
6297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006299 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006301#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006302 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6307 return NULL;
6308 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006309
Martin v. Löwis04697e82004-06-02 12:35:29 +00006310#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006312 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 "can't use AF_INET6, IPv6 is disabled");
6314 return NULL;
6315 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006316#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 retval = inet_pton(af, ip, packed);
6319 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006320 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 return NULL;
6322 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006323 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324 "illegal IP address string passed to inet_pton");
6325 return NULL;
6326 } else if (af == AF_INET) {
6327 return PyBytes_FromStringAndSize(packed,
6328 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006329#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 } else if (af == AF_INET6) {
6331 return PyBytes_FromStringAndSize(packed,
6332 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006335 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 return NULL;
6337 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006338}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006339
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006340PyDoc_STRVAR(inet_ntop_doc,
6341"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6342\n\
6343Convert a packed IP address of the given family to string format.");
6344
6345static PyObject *
6346socket_inet_ntop(PyObject *self, PyObject *args)
6347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006349 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006351#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006352 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006353#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006354 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006355#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006356
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006357 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 return NULL;
6359 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006362 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyErr_SetString(PyExc_ValueError,
6364 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006365 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 return NULL;
6367 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006368#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006369 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006370 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 PyErr_SetString(PyExc_ValueError,
6372 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006373 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 return NULL;
6375 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 } else {
6378 PyErr_Format(PyExc_ValueError,
6379 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006380 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 return NULL;
6382 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006383
Коренберг Марк7766b962018-02-13 00:47:42 +05006384 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006385 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6386 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006388 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 return NULL;
6390 } else {
6391 return PyUnicode_FromString(retval);
6392 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006393}
6394
6395#endif /* HAVE_INET_PTON */
6396
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006397/* Python interface to getaddrinfo(host, port). */
6398
6399/*ARGSUSED*/
6400static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006401socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006402{
Victor Stinner77af1722011-05-26 14:05:59 +02006403 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006404 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 struct addrinfo hints, *res;
6406 struct addrinfo *res0 = NULL;
6407 PyObject *hobj = NULL;
6408 PyObject *pobj = (PyObject *)NULL;
6409 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006410 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411 int family, socktype, protocol, flags;
6412 int error;
6413 PyObject *all = (PyObject *)NULL;
6414 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006415
Georg Brandl6083a4b2013-10-14 06:51:46 +02006416 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006418 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006419 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 &protocol, &flags)) {
6421 return NULL;
6422 }
6423 if (hobj == Py_None) {
6424 hptr = NULL;
6425 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006426 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 if (!idna)
6428 return NULL;
6429 assert(PyBytes_Check(idna));
6430 hptr = PyBytes_AS_STRING(idna);
6431 } else if (PyBytes_Check(hobj)) {
6432 hptr = PyBytes_AsString(hobj);
6433 } else {
6434 PyErr_SetString(PyExc_TypeError,
6435 "getaddrinfo() argument 1 must be string or None");
6436 return NULL;
6437 }
6438 if (PyLong_CheckExact(pobj)) {
6439 long value = PyLong_AsLong(pobj);
6440 if (value == -1 && PyErr_Occurred())
6441 goto err;
6442 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6443 pptr = pbuf;
6444 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006445 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006446 if (pptr == NULL)
6447 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006449 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450 } else if (pobj == Py_None) {
6451 pptr = (char *)NULL;
6452 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006453 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 goto err;
6455 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006456#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006457 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006458 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006459 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6460 * This workaround avoids a segfault in libsystem.
6461 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006462 pptr = "00";
6463 }
6464#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006465
6466 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6467 hobj, pobj, family, socktype, protocol) < 0) {
6468 return NULL;
6469 }
6470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 memset(&hints, 0, sizeof(hints));
6472 hints.ai_family = family;
6473 hints.ai_socktype = socktype;
6474 hints.ai_protocol = protocol;
6475 hints.ai_flags = flags;
6476 Py_BEGIN_ALLOW_THREADS
6477 ACQUIRE_GETADDRINFO_LOCK
6478 error = getaddrinfo(hptr, pptr, &hints, &res0);
6479 Py_END_ALLOW_THREADS
6480 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6481 if (error) {
6482 set_gaierror(error);
6483 goto err;
6484 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006485
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006486 all = PyList_New(0);
6487 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 goto err;
6489 for (res = res0; res; res = res->ai_next) {
6490 PyObject *single;
6491 PyObject *addr =
6492 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6493 if (addr == NULL)
6494 goto err;
6495 single = Py_BuildValue("iiisO", res->ai_family,
6496 res->ai_socktype, res->ai_protocol,
6497 res->ai_canonname ? res->ai_canonname : "",
6498 addr);
6499 Py_DECREF(addr);
6500 if (single == NULL)
6501 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006502
Zackery Spytz4c596d52018-11-14 15:39:01 -07006503 if (PyList_Append(all, single)) {
6504 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006506 }
6507 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 }
6509 Py_XDECREF(idna);
6510 if (res0)
6511 freeaddrinfo(res0);
6512 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006513 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 Py_XDECREF(all);
6515 Py_XDECREF(idna);
6516 if (res0)
6517 freeaddrinfo(res0);
6518 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006519}
6520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006521PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006522"getaddrinfo(host, port [, family, type, proto, flags])\n\
6523 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006524\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006525Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006526
6527/* Python interface to getnameinfo(sa, flags). */
6528
6529/*ARGSUSED*/
6530static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006531socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533 PyObject *sa = (PyObject *)NULL;
6534 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006535 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006536 int port;
6537 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6539 struct addrinfo hints, *res = NULL;
6540 int error;
6541 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006542 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 flags = flowinfo = scope_id = 0;
6545 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6546 return NULL;
6547 if (!PyTuple_Check(sa)) {
6548 PyErr_SetString(PyExc_TypeError,
6549 "getnameinfo() argument 1 must be a tuple");
6550 return NULL;
6551 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006552 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006554 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006556 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006557 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006558 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006559 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006560 return NULL;
6561 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006562
6563 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6564 return NULL;
6565 }
6566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6568 memset(&hints, 0, sizeof(hints));
6569 hints.ai_family = AF_UNSPEC;
6570 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006571 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 Py_BEGIN_ALLOW_THREADS
6573 ACQUIRE_GETADDRINFO_LOCK
6574 error = getaddrinfo(hostp, pbuf, &hints, &res);
6575 Py_END_ALLOW_THREADS
6576 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6577 if (error) {
6578 set_gaierror(error);
6579 goto fail;
6580 }
6581 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006582 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 "sockaddr resolved to multiple addresses");
6584 goto fail;
6585 }
6586 switch (res->ai_family) {
6587 case AF_INET:
6588 {
6589 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006590 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 "IPv4 sockaddr must be 2 tuple");
6592 goto fail;
6593 }
6594 break;
6595 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006596#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 case AF_INET6:
6598 {
6599 struct sockaddr_in6 *sin6;
6600 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006601 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 sin6->sin6_scope_id = scope_id;
6603 break;
6604 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006607 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6609 if (error) {
6610 set_gaierror(error);
6611 goto fail;
6612 }
Victor Stinner72400302016-01-28 15:41:01 +01006613
6614 name = sock_decode_hostname(hbuf);
6615 if (name == NULL)
6616 goto fail;
6617 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006618
6619fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 if (res)
6621 freeaddrinfo(res);
6622 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006623}
6624
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006625PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006626"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006627\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006628Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006629
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006630
6631/* Python API to getting and setting the default timeout value. */
6632
6633static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306634socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006635{
Victor Stinner71694d52015-03-28 01:18:54 +01006636 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006637 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 }
Victor Stinner71694d52015-03-28 01:18:54 +01006639 else {
6640 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6641 return PyFloat_FromDouble(seconds);
6642 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006643}
6644
6645PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006646"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006647\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006648Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006649A value of None indicates that new socket objects have no timeout.\n\
6650When the socket module is first imported, the default is None.");
6651
6652static PyObject *
6653socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6654{
Victor Stinner71694d52015-03-28 01:18:54 +01006655 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006656
Victor Stinner71694d52015-03-28 01:18:54 +01006657 if (socket_parse_timeout(&timeout, arg) < 0)
6658 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006661
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006662 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006663}
6664
6665PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006666"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006667\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006668Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006669A value of None indicates that new socket objects have no timeout.\n\
6670When the socket module is first imported, the default is None.");
6671
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006672#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006673/* Python API for getting interface indices and names */
6674
6675static PyObject *
6676socket_if_nameindex(PyObject *self, PyObject *arg)
6677{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006678 PyObject *list = PyList_New(0);
6679 if (list == NULL) {
6680 return NULL;
6681 }
6682#ifdef MS_WINDOWS
6683 PMIB_IF_TABLE2 tbl;
6684 int ret;
6685 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6686 Py_DECREF(list);
6687 // ret is used instead of GetLastError()
6688 return PyErr_SetFromWindowsErr(ret);
6689 }
6690 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6691 MIB_IF_ROW2 r = tbl->Table[i];
6692 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6693 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6694 Py_ARRAY_LENGTH(buf)))) {
6695 Py_DECREF(list);
6696 FreeMibTable(tbl);
6697 // ret is used instead of GetLastError()
6698 return PyErr_SetFromWindowsErr(ret);
6699 }
6700 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6701 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6702 Py_XDECREF(tuple);
6703 Py_DECREF(list);
6704 FreeMibTable(tbl);
6705 return NULL;
6706 }
6707 Py_DECREF(tuple);
6708 }
6709 FreeMibTable(tbl);
6710 return list;
6711#else
Charles-François Natali60713592011-05-20 16:55:06 +02006712 int i;
6713 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006714
Charles-François Natali60713592011-05-20 16:55:06 +02006715 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006716 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006717 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006718 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006719 return NULL;
6720 }
6721
Gregory P. Smithb474e672018-12-30 17:05:36 -08006722#ifdef _Py_MEMORY_SANITIZER
6723 __msan_unpoison(ni, sizeof(ni));
6724 __msan_unpoison(&ni[0], sizeof(ni[0]));
6725#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006726 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006727#ifdef _Py_MEMORY_SANITIZER
6728 /* This one isn't the end sentinel, the next one must exist. */
6729 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6730 /* Otherwise Py_BuildValue internals are flagged by MSan when
6731 they access the not-msan-tracked if_name string data. */
6732 {
6733 char *to_sanitize = ni[i].if_name;
6734 do {
6735 __msan_unpoison(to_sanitize, 1);
6736 } while (*to_sanitize++ != '\0');
6737 }
6738#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006739 PyObject *ni_tuple = Py_BuildValue("IO&",
6740 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006741
6742 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6743 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006744 Py_DECREF(list);
6745 if_freenameindex(ni);
6746 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006747 }
6748 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006749 }
6750
6751 if_freenameindex(ni);
6752 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006753#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006754}
6755
6756PyDoc_STRVAR(if_nameindex_doc,
6757"if_nameindex()\n\
6758\n\
6759Returns a list of network interface information (index, name) tuples.");
6760
Charles-François Natali60713592011-05-20 16:55:06 +02006761static PyObject *
6762socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006763{
Charles-François Natali60713592011-05-20 16:55:06 +02006764 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006765#ifdef MS_WINDOWS
6766 NET_IFINDEX index;
6767#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006768 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006769#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006770 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6771 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006772 return NULL;
6773
Charles-François Natali60713592011-05-20 16:55:06 +02006774 index = if_nametoindex(PyBytes_AS_STRING(oname));
6775 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006776 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006777 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006778 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006779 return NULL;
6780 }
6781
6782 return PyLong_FromUnsignedLong(index);
6783}
6784
6785PyDoc_STRVAR(if_nametoindex_doc,
6786"if_nametoindex(if_name)\n\
6787\n\
6788Returns the interface index corresponding to the interface name if_name.");
6789
Charles-François Natali60713592011-05-20 16:55:06 +02006790static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006791socket_if_indextoname(PyObject *self, PyObject *arg)
6792{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006793#ifdef MS_WINDOWS
6794 NET_IFINDEX index;
6795#else
Charles-François Natali60713592011-05-20 16:55:06 +02006796 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006797#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006798 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006799
Charles-François Natali60713592011-05-20 16:55:06 +02006800 index = PyLong_AsUnsignedLong(arg);
6801 if (index == (unsigned long) -1)
6802 return NULL;
6803
6804 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006805 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006806 return NULL;
6807 }
6808
Charles-François Natali60713592011-05-20 16:55:06 +02006809 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006810}
6811
6812PyDoc_STRVAR(if_indextoname_doc,
6813"if_indextoname(if_index)\n\
6814\n\
6815Returns the interface name corresponding to the interface index if_index.");
6816
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006817#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006818
6819
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006820#ifdef CMSG_LEN
6821/* Python interface to CMSG_LEN(length). */
6822
6823static PyObject *
6824socket_CMSG_LEN(PyObject *self, PyObject *args)
6825{
6826 Py_ssize_t length;
6827 size_t result;
6828
6829 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6830 return NULL;
6831 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6832 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6833 return NULL;
6834 }
6835 return PyLong_FromSize_t(result);
6836}
6837
6838PyDoc_STRVAR(CMSG_LEN_doc,
6839"CMSG_LEN(length) -> control message length\n\
6840\n\
6841Return the total length, without trailing padding, of an ancillary\n\
6842data item with associated data of the given length. This value can\n\
6843often be used as the buffer size for recvmsg() to receive a single\n\
6844item of ancillary data, but RFC 3542 requires portable applications to\n\
6845use CMSG_SPACE() and thus include space for padding, even when the\n\
6846item will be the last in the buffer. Raises OverflowError if length\n\
6847is outside the permissible range of values.");
6848
6849
6850#ifdef CMSG_SPACE
6851/* Python interface to CMSG_SPACE(length). */
6852
6853static PyObject *
6854socket_CMSG_SPACE(PyObject *self, PyObject *args)
6855{
6856 Py_ssize_t length;
6857 size_t result;
6858
6859 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6860 return NULL;
6861 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6862 PyErr_SetString(PyExc_OverflowError,
6863 "CMSG_SPACE() argument out of range");
6864 return NULL;
6865 }
6866 return PyLong_FromSize_t(result);
6867}
6868
6869PyDoc_STRVAR(CMSG_SPACE_doc,
6870"CMSG_SPACE(length) -> buffer size\n\
6871\n\
6872Return the buffer size needed for recvmsg() to receive an ancillary\n\
6873data item with associated data of the given length, along with any\n\
6874trailing padding. The buffer space needed to receive multiple items\n\
6875is the sum of the CMSG_SPACE() values for their associated data\n\
6876lengths. Raises OverflowError if length is outside the permissible\n\
6877range of values.");
6878#endif /* CMSG_SPACE */
6879#endif /* CMSG_LEN */
6880
6881
Guido van Rossum30a685f1991-06-27 15:51:29 +00006882/* List of functions exported by this module. */
6883
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006884static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 {"gethostbyname", socket_gethostbyname,
6886 METH_VARARGS, gethostbyname_doc},
6887 {"gethostbyname_ex", socket_gethostbyname_ex,
6888 METH_VARARGS, ghbn_ex_doc},
6889 {"gethostbyaddr", socket_gethostbyaddr,
6890 METH_VARARGS, gethostbyaddr_doc},
6891 {"gethostname", socket_gethostname,
6892 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006893#ifdef HAVE_SETHOSTNAME
6894 {"sethostname", socket_sethostname,
6895 METH_VARARGS, sethostname_doc},
6896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897 {"getservbyname", socket_getservbyname,
6898 METH_VARARGS, getservbyname_doc},
6899 {"getservbyport", socket_getservbyport,
6900 METH_VARARGS, getservbyport_doc},
6901 {"getprotobyname", socket_getprotobyname,
6902 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006903 {"close", socket_close,
6904 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006905#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906 {"dup", socket_dup,
6907 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006908#endif
Dave Cole331708b2004-08-09 04:51:41 +00006909#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910 {"socketpair", socket_socketpair,
6911 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913 {"ntohs", socket_ntohs,
6914 METH_VARARGS, ntohs_doc},
6915 {"ntohl", socket_ntohl,
6916 METH_O, ntohl_doc},
6917 {"htons", socket_htons,
6918 METH_VARARGS, htons_doc},
6919 {"htonl", socket_htonl,
6920 METH_O, htonl_doc},
6921 {"inet_aton", socket_inet_aton,
6922 METH_VARARGS, inet_aton_doc},
6923 {"inet_ntoa", socket_inet_ntoa,
6924 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006925#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926 {"inet_pton", socket_inet_pton,
6927 METH_VARARGS, inet_pton_doc},
6928 {"inet_ntop", socket_inet_ntop,
6929 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006930#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006931 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006932 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 {"getnameinfo", socket_getnameinfo,
6934 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306935 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 METH_NOARGS, getdefaulttimeout_doc},
6937 {"setdefaulttimeout", socket_setdefaulttimeout,
6938 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006939#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006940 {"if_nameindex", socket_if_nameindex,
6941 METH_NOARGS, if_nameindex_doc},
6942 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006943 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006944 {"if_indextoname", socket_if_indextoname,
6945 METH_O, if_indextoname_doc},
6946#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006947#ifdef CMSG_LEN
6948 {"CMSG_LEN", socket_CMSG_LEN,
6949 METH_VARARGS, CMSG_LEN_doc},
6950#ifdef CMSG_SPACE
6951 {"CMSG_SPACE", socket_CMSG_SPACE,
6952 METH_VARARGS, CMSG_SPACE_doc},
6953#endif
6954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006956};
6957
Guido van Rossum30a685f1991-06-27 15:51:29 +00006958
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006959#ifdef MS_WINDOWS
6960#define OS_INIT_DEFINED
6961
6962/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006963
6964static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006965os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006968}
6969
6970static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006971os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 WSADATA WSAData;
6974 int ret;
6975 ret = WSAStartup(0x0101, &WSAData);
6976 switch (ret) {
6977 case 0: /* No error */
6978 Py_AtExit(os_cleanup);
6979 return 1; /* Success */
6980 case WSASYSNOTREADY:
6981 PyErr_SetString(PyExc_ImportError,
6982 "WSAStartup failed: network not ready");
6983 break;
6984 case WSAVERNOTSUPPORTED:
6985 case WSAEINVAL:
6986 PyErr_SetString(
6987 PyExc_ImportError,
6988 "WSAStartup failed: requested version not supported");
6989 break;
6990 default:
6991 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6992 break;
6993 }
6994 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006995}
6996
Guido van Rossum8d665e61996-06-26 18:22:49 +00006997#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006998
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006999
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007000
7001#ifndef OS_INIT_DEFINED
7002static int
7003os_init(void)
7004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007006}
7007#endif
7008
7009
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007010/* C API table - always add new things to the end for binary
7011 compatibility. */
7012static
7013PySocketModule_APIObject PySocketModuleAPI =
7014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007016 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007018};
7019
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007020
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007021/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007022
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007023 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007024 "socket.py" which implements some additional functionality.
7025 The import of "_socket" may fail with an ImportError exception if
7026 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007027 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007028 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007029*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007031PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007032"Implementation module for socket operations.\n\
7033\n\
7034See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007035
Martin v. Löwis1a214512008-06-11 05:26:20 +00007036static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037 PyModuleDef_HEAD_INIT,
7038 PySocket_MODULE_NAME,
7039 socket_doc,
7040 -1,
7041 socket_methods,
7042 NULL,
7043 NULL,
7044 NULL,
7045 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007046};
7047
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007048PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007049PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 if (!os_init())
7054 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007055
Victor Stinnerdaf45552013-08-28 00:53:59 +02007056#ifdef MS_WINDOWS
7057 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007058 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007059 }
7060#endif
7061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062 Py_TYPE(&sock_type) = &PyType_Type;
7063 m = PyModule_Create(&socketmodule);
7064 if (m == NULL)
7065 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007066
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007067 Py_INCREF(PyExc_OSError);
7068 PySocketModuleAPI.error = PyExc_OSError;
7069 Py_INCREF(PyExc_OSError);
7070 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007071 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007072 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007073 if (socket_herror == NULL)
7074 return NULL;
7075 Py_INCREF(socket_herror);
7076 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007077 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078 NULL);
7079 if (socket_gaierror == NULL)
7080 return NULL;
7081 Py_INCREF(socket_gaierror);
7082 PyModule_AddObject(m, "gaierror", socket_gaierror);
7083 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007084 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 if (socket_timeout == NULL)
7086 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007087 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 Py_INCREF(socket_timeout);
7089 PyModule_AddObject(m, "timeout", socket_timeout);
7090 Py_INCREF((PyObject *)&sock_type);
7091 if (PyModule_AddObject(m, "SocketType",
7092 (PyObject *)&sock_type) != 0)
7093 return NULL;
7094 Py_INCREF((PyObject *)&sock_type);
7095 if (PyModule_AddObject(m, "socket",
7096 (PyObject *)&sock_type) != 0)
7097 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007098
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007099#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104 Py_INCREF(has_ipv6);
7105 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 /* Export C API */
7108 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7109 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7110 ) != 0)
7111 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007116#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007118#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007120#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007121#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007124#endif
7125#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007127#endif
7128#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007131#endif
7132#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007135#endif
7136#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007139#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007140#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007143#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007144#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007147#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007148#ifdef HAVE_SOCKADDR_ALG
7149 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7150#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007151#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007154#endif
7155#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007157#endif
7158#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007159 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007161#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007162#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007165#endif
7166#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007167 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007169#endif
7170#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007173#endif
7174#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007177#endif
7178#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007179 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, AF_NETLINK);
7181 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007182#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007184#endif
7185#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007187#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7189 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007190#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007192#endif
7193#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007195#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007196#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007198#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007199#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007201#endif
7202#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007204#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007206#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007208#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007209#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007211#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007212#ifdef NETLINK_CRYPTO
7213 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7214#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007215#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007216
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007217#ifdef AF_QIPCRTR
7218 /* Qualcomm IPCROUTER */
7219 PyModule_AddIntMacro(m, AF_QIPCRTR);
7220#endif
7221
caaveryeffc12f2017-09-06 18:18:10 -04007222#ifdef AF_VSOCK
7223 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7224 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7225 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7226 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7227 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7228 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7229 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7230 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7231 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7232#endif
7233
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007234#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007237#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007238#ifdef AF_LINK
7239 PyModule_AddIntMacro(m, AF_LINK);
7240#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007241#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007244#endif
7245#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007248#endif
7249#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007252#endif
7253#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007256#endif
7257#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007260#endif
7261#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007264#endif
7265#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007268#endif
7269#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007272#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007273
Hye-Shik Chang81268602004-02-02 06:05:24 +00007274#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7276 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7277 PyModule_AddIntMacro(m, BTPROTO_HCI);
7278 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007279#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007280 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007281#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007282#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007283#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007284 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007285#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7287 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007288#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7291 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007292#endif
7293
Charles-François Natali47413c12011-10-06 19:47:44 +02007294#ifdef AF_CAN
7295 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007297#endif
7298#ifdef PF_CAN
7299 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007301#endif
7302
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007303/* Reliable Datagram Sockets */
7304#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007306#endif
7307#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007309#endif
7310
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007311/* Kernel event messages */
7312#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007313 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007314#endif
7315#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007317#endif
7318
Antoine Pitroub156a462010-10-27 20:13:57 +00007319#ifdef AF_PACKET
7320 PyModule_AddIntMacro(m, AF_PACKET);
7321#endif
7322#ifdef PF_PACKET
7323 PyModule_AddIntMacro(m, PF_PACKET);
7324#endif
7325#ifdef PACKET_HOST
7326 PyModule_AddIntMacro(m, PACKET_HOST);
7327#endif
7328#ifdef PACKET_BROADCAST
7329 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7330#endif
7331#ifdef PACKET_MULTICAST
7332 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7333#endif
7334#ifdef PACKET_OTHERHOST
7335 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7336#endif
7337#ifdef PACKET_OUTGOING
7338 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7339#endif
7340#ifdef PACKET_LOOPBACK
7341 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7342#endif
7343#ifdef PACKET_FASTROUTE
7344 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007345#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007346
Christian Heimes043d6f62008-01-07 17:19:16 +00007347#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7352 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7353 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007354
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7356 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7357 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, SOL_TIPC);
7361 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7362 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7363 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7364 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007365
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7367 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7368 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7369 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7373 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007374#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007375 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007377#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7379 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7380 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7381 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7382 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7383 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007384#endif
7385
Christian Heimesdffa3942016-09-05 23:54:41 +02007386#ifdef HAVE_SOCKADDR_ALG
7387 /* Socket options */
7388 PyModule_AddIntMacro(m, ALG_SET_KEY);
7389 PyModule_AddIntMacro(m, ALG_SET_IV);
7390 PyModule_AddIntMacro(m, ALG_SET_OP);
7391 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7392 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7393 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7394
7395 /* Operations */
7396 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7397 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7398 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7399 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7400#endif
7401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, SOCK_STREAM);
7404 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007405/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007406#ifdef SOCK_RAW
7407 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007409#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007411#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007413#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007414#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007416#endif
7417#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007419#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007421#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007424#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007427#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007429#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007430#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007432#endif
7433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007434#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007435 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007437#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007438 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007446#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007451#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007452#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007453#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007455#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007457#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007463#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007483#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007484#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007486#endif
7487#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007489#endif
7490#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007492#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007493#ifdef SO_PASSSEC
7494 PyModule_AddIntMacro(m, SO_PASSSEC);
7495#endif
7496#ifdef SO_PEERSEC
7497 PyModule_AddIntMacro(m, SO_PEERSEC);
7498#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007499#ifdef SO_BINDTODEVICE
7500 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7501#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007502#ifdef SO_PRIORITY
7503 PyModule_AddIntMacro(m, SO_PRIORITY);
7504#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007505#ifdef SO_MARK
7506 PyModule_AddIntMacro(m, SO_MARK);
7507#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007508#ifdef SO_DOMAIN
7509 PyModule_AddIntMacro(m, SO_DOMAIN);
7510#endif
7511#ifdef SO_PROTOCOL
7512 PyModule_AddIntMacro(m, SO_PROTOCOL);
7513#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515 /* Maximum number of connections for "listen" */
7516#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007518#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
7521
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007522 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007523#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007525#endif
7526#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007528#endif
7529#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007531#endif
7532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007533 /* Flags for send, recv */
7534#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007537#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007543#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007546#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007564#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007566#endif
7567#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007569#endif
7570#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007572#endif
7573#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007575#endif
7576#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007578#endif
7579#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007581#endif
7582#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007584#endif
7585#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007587#endif
7588#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007590#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007591#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007593#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007595 /* Protocol level and numbers, usable for [gs]etsockopt */
7596#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007599#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007601#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007610#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007613#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007621#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007624#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007626#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007627 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007628#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007629#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007631#endif
7632#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7634 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007635#endif
7636#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7638 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7639 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007640
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7642 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7643 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007644#ifdef CAN_ISOTP
7645 PyModule_AddIntMacro(m, CAN_ISOTP);
7646#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007647#endif
7648#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7650 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7651 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7652 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007653#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007654#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7655 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7656#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007657#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007658 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007659 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7660 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7661 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7662 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7663 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7664 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7665 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7666 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7667 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7668 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7669 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7670 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7671#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007672#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007674#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007675#ifdef HAVE_SOCKADDR_ALG
7676 PyModule_AddIntMacro(m, SOL_ALG);
7677#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007678#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007680#endif
7681#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007683#endif
7684#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007686#endif
7687#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007689#endif
7690#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007691 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007692#endif
7693#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007697 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007699 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007701#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007702 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007704#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007715#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007716 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007718#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007719 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007721#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007725 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007726#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007732#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007737#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007738 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007739#endif
Gabe Appleton2ac3bab2019-06-24 02:58:56 -07007740#ifdef IPPROTO_UDPLITE
7741 PyModule_AddIntMacro(m, IPPROTO_UDPLITE);
7742 #ifndef UDPLITE_SEND_CSCOV
7743 #define UDPLITE_SEND_CSCOV 10
7744 #endif
7745 PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV);
7746 #ifndef UDPLITE_RECV_CSCOV
7747 #define UDPLITE_RECV_CSCOV 11
7748 #endif
7749 PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV);
7750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007751#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007752 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007754#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007755 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007757#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007758 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007760#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007761 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007763#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007769#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007770 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007772#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007775#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007778#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007781#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007784#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007787#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007790#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007793#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007796#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007799#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007802#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007805#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007806 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007807#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007808#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007809 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007811#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007812 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007813#endif
7814/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007815#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007816 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007817#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007818 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007820#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007822#endif
7823
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007824#ifdef MS_WINDOWS
7825 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7826 PyModule_AddIntMacro(m, IPPROTO_ST);
7827 PyModule_AddIntMacro(m, IPPROTO_CBT);
7828 PyModule_AddIntMacro(m, IPPROTO_IGP);
7829 PyModule_AddIntMacro(m, IPPROTO_RDP);
7830 PyModule_AddIntMacro(m, IPPROTO_PGM);
7831 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7832 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7833#endif
7834
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007835#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007837#endif
7838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007839 /* Some port configuration */
7840#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007842#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007843 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007845#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007846 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007847#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007848 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007849#endif
7850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007851 /* Some reserved IP v.4 addresses */
7852#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007854#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007855 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007857#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007858 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007859#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007860 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007862#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007863 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007864#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007865 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007867#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007869#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007870 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007872#ifdef INADDR_ALLHOSTS_GROUP
7873 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7874 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007875#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007876 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007878#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007880#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007883#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007884 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007885#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007886 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007887#endif
7888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007889 /* IPv4 [gs]etsockopt options */
7890#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007893#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007894 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007896#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007897 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007899#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007900 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007902#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007903 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007905#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007906 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007908#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007909 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007912 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007914#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007915 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007918 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007920#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007921 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007923#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007924 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007926#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007927 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007929#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007930 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007932#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007933 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007935#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007936 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007937#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007938#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007939 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007940#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007942 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7943#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007944 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007947 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007950 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007952#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007953 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007956 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007958#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007961 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007962#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007963 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007965 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007966#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007968#endif
7969#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007970 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007971#endif
7972#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007974#endif
7975#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007976 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007977#endif
7978#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007980#endif
7981#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007982 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007983#endif
7984#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007985 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007986#endif
7987#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007988 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007989#endif
7990#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007991 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007992#endif
7993#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007994 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007995#endif
7996#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007997 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007998#endif
7999#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008000 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008001#endif
8002#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008003 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008004#endif
8005#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008006 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008007#endif
8008#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008009 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008010#endif
8011#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008012 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008013#endif
8014#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008015 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008016#endif
8017#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008018 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008019#endif
8020#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008021 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008022#endif
8023#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008024 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008025#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008027 /* TCP options */
8028#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008029 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008031#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008032 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008034#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008035 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008037#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008038 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008040#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008043#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008044 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008046#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008047 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008049#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008050 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008052#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008053 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008055#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008056 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008058#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008059 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008061#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008062 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008063#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008064#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008065 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008066#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008067#ifdef TCP_CONGESTION
8068 PyModule_AddIntMacro(m, TCP_CONGESTION);
8069#endif
8070#ifdef TCP_USER_TIMEOUT
8071 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8072#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008073#ifdef TCP_NOTSENT_LOWAT
8074 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8075#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008077 /* IPX options */
8078#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008079 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008080#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008081
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008082/* Reliable Datagram Sockets */
8083#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008084 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008085#endif
8086#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008087 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008088#endif
8089#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008090 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008091#endif
8092#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008093 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008094#endif
8095#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008096 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008097#endif
8098#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008099 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008100#endif
8101#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008102 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008103#endif
8104#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008105 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008106#endif
8107#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008108 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008109#endif
8110#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008111 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008112#endif
8113#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008114 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008115#endif
8116#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008117 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008118#endif
8119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008120 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008121#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008123#endif
8124#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008126#endif
8127#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008129#endif
8130#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008132#endif
8133#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008135#endif
8136#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008138#endif
8139#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008141#endif
8142#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008143 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008144#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008145#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008146 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008147#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008148#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008149 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008150#endif
8151#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008152 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008153#endif
8154#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008155 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008156#endif
8157#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008158 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008159#endif
8160#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008161 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008162#endif
8163#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008165#endif
8166#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008168#endif
8169#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008170 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008171#endif
8172#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008173 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008174#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008175#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008176 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008177#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008178#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008180#endif
8181#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008182 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008183#endif
8184#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008185 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008186#endif
8187#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008188 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008189#endif
8190#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008191 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008192#endif
8193#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008194 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008195#endif
8196#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008197 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008198#endif
8199#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008200 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008201#endif
8202#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008203 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008204#endif
8205#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008206 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008207#endif
8208#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008209 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008210#endif
8211#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008212 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008213#endif
8214#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008215 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008216#endif
8217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008218 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008219#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008221#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008222 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008223#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008224 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008225#endif
8226#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008227 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008228#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008229 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008230#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008231 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008232#endif
8233#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008234 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008235#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008236 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008237#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008238 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008239#endif
8240
Christian Heimesfaf2f632008-01-06 16:59:19 +00008241#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008242 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008243 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8244#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008245 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008246#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008247 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008248 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8249#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008250 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008251#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008252 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008253 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008254 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008255 PyObject *tmp;
8256 tmp = PyLong_FromUnsignedLong(codes[i]);
8257 if (tmp == NULL)
8258 return NULL;
8259 PyModule_AddObject(m, names[i], tmp);
8260 }
8261 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008262 PyModule_AddIntMacro(m, RCVALL_OFF);
8263 PyModule_AddIntMacro(m, RCVALL_ON);
8264 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008265#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008266 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008267#endif
8268#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008269 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008270#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008271#endif /* _MSTCPIP_ */
8272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008273 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008274#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008275 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008276#endif
animalize19e7d482018-02-27 02:10:36 +08008277
8278#ifdef MS_WINDOWS
8279 /* remove some flags on older version Windows during run-time */
8280 remove_unusable_flags(m);
8281#endif
8282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008283 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008284}