blob: 74cdc0f2f6caed5aec4e942521ecd8a90dd1fc32 [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>
Steve Dower65e4cb12014-11-22 12:54:57 -0800348
animalize19e7d482018-02-27 02:10:36 +0800349/* remove some flags on older version Windows during run-time.
350 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
351typedef struct {
352 DWORD build_number; /* available starting with this Win10 BuildNumber */
353 const char flag_name[20];
354} FlagRuntimeInfo;
355
356/* IMPORTANT: make sure the list ordered by descending build_number */
357static FlagRuntimeInfo win_runtime_flags[] = {
358 /* available starting with Windows 10 1709 */
359 {16299, "TCP_KEEPIDLE"},
360 {16299, "TCP_KEEPINTVL"},
361 /* available starting with Windows 10 1703 */
362 {15063, "TCP_KEEPCNT"},
363 /* available starting with Windows 10 1607 */
364 {14393, "TCP_FASTOPEN"}
365};
366
367static void
368remove_unusable_flags(PyObject *m)
369{
370 PyObject *dict;
371 OSVERSIONINFOEX info;
372 DWORDLONG dwlConditionMask;
373
374 dict = PyModule_GetDict(m);
375 if (dict == NULL) {
376 return;
377 }
378
379 /* set to Windows 10, except BuildNumber. */
380 memset(&info, 0, sizeof(info));
381 info.dwOSVersionInfoSize = sizeof(info);
382 info.dwMajorVersion = 10;
383 info.dwMinorVersion = 0;
384
385 /* set Condition Mask */
386 dwlConditionMask = 0;
387 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
388 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
389 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
390
391 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
392 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100393 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800394 Compatibility Mode will not cheat VerifyVersionInfo(...) */
395 if (VerifyVersionInfo(
396 &info,
397 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
398 dwlConditionMask)) {
399 break;
400 }
401 else {
402 if (PyDict_GetItemString(
403 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200404 win_runtime_flags[i].flag_name) != NULL)
405 {
406 if (PyDict_DelItemString(
407 dict,
408 win_runtime_flags[i].flag_name))
409 {
410 PyErr_Clear();
411 }
animalize19e7d482018-02-27 02:10:36 +0800412 }
413 }
414 }
415}
416
Jeremy Hylton22308652001-02-02 03:23:09 +0000417#endif
418
Skip Montanaro7befb992004-02-10 16:50:21 +0000419#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000420
Neal Norwitz39d22e52002-11-02 19:55:21 +0000421#ifndef O_NONBLOCK
422# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000423#endif
424
Trent Micka708d6e2004-09-07 17:48:26 +0000425/* include Python's addrinfo.h unless it causes trouble */
426#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
427 /* Do not include addinfo.h on some newer IRIX versions.
428 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
429 * for example, but not by 6.5.10.
430 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000431#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000432 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
433 * EAI_* constants are defined in (the already included) ws2tcpip.h.
434 */
435#else
436# include "addrinfo.h"
437#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000438
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000439#ifdef __APPLE__
440/* On OS X, getaddrinfo returns no error indication of lookup
441 failure, so we must use the emulation instead of the libinfo
442 implementation. Unfortunately, performing an autoconf test
443 for this bug would require DNS access for the machine performing
444 the configuration, which is not acceptable. Therefore, we
445 determine the bug just by checking for __APPLE__. If this bug
446 gets ever fixed, perhaps checking for sys/version.h would be
447 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000448#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600449/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000450 Find to check for Jaguar is that it has getnameinfo(), which
451 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000452#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000453#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000454
455#ifdef HAVE_INET_ATON
456#define USE_INET_ATON_WEAKLINK
457#endif
458
Jack Jansen84262fb2002-07-02 14:40:42 +0000459#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000460
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000461/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000462#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000463/* avoid clashes with the C library definition of the symbol. */
464#define getaddrinfo fake_getaddrinfo
465#define gai_strerror fake_gai_strerror
466#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000467#include "getaddrinfo.c"
468#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000469#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000470#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000471#include "getnameinfo.c"
472#endif
473
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000474#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000475#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000476#endif
477
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000478#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000479#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000480#define EAFNOSUPPORT WSAEAFNOSUPPORT
481#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000482#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000483
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000484#ifndef SOCKETCLOSE
485#define SOCKETCLOSE close
486#endif
487
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000488#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000489#define USE_BLUETOOTH 1
490#if defined(__FreeBSD__)
491#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
492#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000493#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000494#define SOL_HCI SOL_HCI_RAW
495#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000496#define sockaddr_l2 sockaddr_l2cap
497#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000498#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000499#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
500#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000501#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000502#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000503#define sockaddr_l2 sockaddr_bt
504#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000505#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000507#define SOL_HCI BTPROTO_HCI
508#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000509#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
510#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000511#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000512#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000513#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000514#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
515#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000516#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000517#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
518#endif
519#endif
520
Charles-François Natali8b759652011-12-23 16:44:51 +0100521/* Convert "sock_addr_t *" to "struct sockaddr *". */
522#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523
Martin v. Löwise9416172003-05-03 10:12:45 +0000524/*
525 * Constants for getnameinfo()
526 */
527#if !defined(NI_MAXHOST)
528#define NI_MAXHOST 1025
529#endif
530#if !defined(NI_MAXSERV)
531#define NI_MAXSERV 32
532#endif
533
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000534#ifndef INVALID_SOCKET /* MS defines this */
535#define INVALID_SOCKET (-1)
536#endif
537
Charles-François Natali0cc86852013-09-13 19:53:08 +0200538#ifndef INADDR_NONE
539#define INADDR_NONE (-1)
540#endif
541
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000542/* XXX There's a problem here: *static* functions are not supposed to have
543 a Py prefix (or use CapitalizedWords). Later... */
544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545/* Global variable holding the exception type for errors detected
546 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000547static PyObject *socket_herror;
548static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000549static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000550
Tim Peters643a7fc2002-02-17 04:13:21 +0000551/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000552 The sock_type variable contains pointers to various functions,
553 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000554 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000555static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000556
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000557#if defined(HAVE_POLL_H)
558#include <poll.h>
559#elif defined(HAVE_SYS_POLL_H)
560#include <sys/poll.h>
561#endif
562
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000563/* Largest value to try to store in a socklen_t (used when handling
564 ancillary data). POSIX requires socklen_t to hold at least
565 (2**31)-1 and recommends against storing larger values, but
566 socklen_t was originally int in the BSD interface, so to be on the
567 safe side we use the smaller of (2**31)-1 and INT_MAX. */
568#if INT_MAX > 0x7fffffff
569#define SOCKLEN_T_LIMIT 0x7fffffff
570#else
571#define SOCKLEN_T_LIMIT INT_MAX
572#endif
573
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200574#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000575/* Instead of select(), we'll use poll() since poll() works on any fd. */
576#define IS_SELECTABLE(s) 1
577/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000578#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200579/* If there's no timeout left, we don't have to call select, so it's a safe,
580 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100581#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000582#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000583
584static PyObject*
585select_error(void)
586{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200587 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000589}
590
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000591#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000592#ifndef WSAEAGAIN
593#define WSAEAGAIN WSAEWOULDBLOCK
594#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000595#define CHECK_ERRNO(expected) \
596 (WSAGetLastError() == WSA ## expected)
597#else
598#define CHECK_ERRNO(expected) \
599 (errno == expected)
600#endif
601
Victor Stinnerdaf45552013-08-28 00:53:59 +0200602#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200603# define GET_SOCK_ERROR WSAGetLastError()
604# define SET_SOCK_ERROR(err) WSASetLastError(err)
605# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
606# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
607#else
608# define GET_SOCK_ERROR errno
609# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
610# define SOCK_TIMEOUT_ERR EWOULDBLOCK
611# define SOCK_INPROGRESS_ERR EINPROGRESS
612#endif
613
Erik Janssens874809e2018-09-05 08:29:42 +0200614#ifdef _MSC_VER
615# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
616#else
617# define SUPPRESS_DEPRECATED_CALL
618#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200619
620#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200621/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
622static int support_wsa_no_inherit = -1;
623#endif
624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625/* Convenience function to raise an error according to errno
626 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627
Guido van Rossum73624e91994-10-10 17:59:00 +0000628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000629set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000631#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 int err_no = WSAGetLastError();
633 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
634 recognizes the error codes used by both GetLastError() and
635 WSAGetLastError */
636 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200637 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000638#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000639
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200640 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641}
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000645set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648
649#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 if (v != NULL) {
655 PyErr_SetObject(socket_herror, v);
656 Py_DECREF(v);
657 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000660}
661
662
663static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000664set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667
Martin v. Löwis272cb402002-03-01 08:31:07 +0000668#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 /* EAI_SYSTEM is not available on Windows XP. */
670 if (error == EAI_SYSTEM)
671 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000672#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000674#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (v != NULL) {
680 PyErr_SetObject(socket_gaierror, v);
681 Py_DECREF(v);
682 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685}
686
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000687/* Function to perform the setting of socket blocking mode
688 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000689static int
690internal_setblocking(PySocketSockObject *s, int block)
691{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400692 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200693#ifdef MS_WINDOWS
694 u_long arg;
695#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100696#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100697 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100698 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000699#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100703#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200705 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400706 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100707#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200709 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400710 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100712 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 else
Victor Stinner9a954832013-12-04 00:41:24 +0100714 new_delay_flag = delay_flag | O_NONBLOCK;
715 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200716 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400717 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100718#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000719#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200720 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200721 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400722 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000723#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400724
725 result = 0;
726
727 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000729
Yury Selivanovfa22b292016-10-18 16:03:52 -0400730 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200731#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400732 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200733#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400734 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200735#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400736 }
737
738 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739}
740
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000741static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200742internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
743 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100746#ifdef HAVE_POLL
747 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200748 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100749#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200750 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200751 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100752#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000753
Victor Stinnerb7df3142015-03-27 22:59:32 +0100754 /* must be called with the GIL held */
755 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100756
Victor Stinner416f2e62015-03-31 13:56:29 +0200757 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200761 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 /* Prefer poll, if available, since you can poll() any fd
765 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000766#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100767 pollfd.fd = s->sock_fd;
768 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 if (connect) {
770 /* On Windows, the socket becomes writable on connection success,
771 but a connection failure is notified as an error. On POSIX, the
772 socket becomes writable on connection success or on connection
773 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200774 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000776
Victor Stinner71694d52015-03-28 01:18:54 +0100777 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200778 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200779 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000780
Victor Stinner71694d52015-03-28 01:18:54 +0100781 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200782 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100783 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000784#else
Victor Stinnerced11742015-04-09 10:27:25 +0200785 if (interval >= 0) {
786 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
787 tvp = &tv;
788 }
789 else
790 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000791
Victor Stinner71694d52015-03-28 01:18:54 +0100792 FD_ZERO(&fds);
793 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200794 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 if (connect) {
796 /* On Windows, the socket becomes writable on connection success,
797 but a connection failure is notified as an error. On POSIX, the
798 socket becomes writable on connection success or on connection
799 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200800 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 }
Victor Stinner71694d52015-03-28 01:18:54 +0100802
803 /* See if the socket is ready */
804 Py_BEGIN_ALLOW_THREADS;
805 if (writing)
806 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200807 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100808 else
809 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200810 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100811 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000812#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 if (n < 0)
815 return -1;
816 if (n == 0)
817 return 1;
818 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000819}
820
Victor Stinner31bf2d52015-04-01 21:57:09 +0200821/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000822
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 On error, raise an exception and return -1 if err is set, or fill err and
824 return -1 otherwise. If a signal was received and the signal handler raised
825 an exception, return -1, and set err to -1 if err is set.
826
827 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100828
Victor Stinner31bf2d52015-04-01 21:57:09 +0200829 If the socket has a timeout, wait until the socket is ready before calling
830 the function: wait until the socket is writable if writing is nonzero, wait
831 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100832
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834 the function, except if the signal handler raised an exception (PEP 475).
835
836 When the function is retried, recompute the timeout using a monotonic clock.
837
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 sock_call_ex() must be called with the GIL held. The socket function is
839 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200841sock_call_ex(PySocketSockObject *s,
842 int writing,
843 int (*sock_func) (PySocketSockObject *s, void *data),
844 void *data,
845 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200846 int *err,
847 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200848{
Victor Stinner8912d142015-04-06 23:16:34 +0200849 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850 _PyTime_t deadline = 0;
851 int deadline_initialized = 0;
852 int res;
853
854 /* sock_call() must be called with the GIL held. */
855 assert(PyGILState_Check());
856
857 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 /* For connect(), poll even for blocking socket. The connection
861 runs asynchronously. */
862 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200863 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200864 _PyTime_t interval;
865
Victor Stinner81c41db2015-04-02 11:50:57 +0200866 if (deadline_initialized) {
867 /* recompute the timeout */
868 interval = deadline - _PyTime_GetMonotonicClock();
869 }
870 else {
871 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200872 deadline = _PyTime_GetMonotonicClock() + timeout;
873 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200874 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200875
Victor Stinner10550cd2015-04-03 13:22:27 +0200876 if (interval >= 0)
877 res = internal_select(s, writing, interval, connect);
878 else
879 res = 1;
880 }
881 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200882 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200883 }
884
Victor Stinner31bf2d52015-04-01 21:57:09 +0200885 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 if (err)
887 *err = GET_SOCK_ERROR;
888
Victor Stinner31bf2d52015-04-01 21:57:09 +0200889 if (CHECK_ERRNO(EINTR)) {
890 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200891 if (PyErr_CheckSignals()) {
892 if (err)
893 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200894 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200895 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200896
897 /* retry select() */
898 continue;
899 }
900
901 /* select() failed */
902 s->errorhandler();
903 return -1;
904 }
905
906 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200907 if (err)
908 *err = SOCK_TIMEOUT_ERR;
909 else
910 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200911 return -1;
912 }
913
914 /* the socket is ready */
915 }
916
Victor Stinner81c41db2015-04-02 11:50:57 +0200917 /* inner loop to retry sock_func() when sock_func() is interrupted
918 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200919 while (1) {
920 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200921 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200922 Py_END_ALLOW_THREADS
923
924 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200925 /* sock_func() succeeded */
926 if (err)
927 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200928 return 0;
929 }
930
Victor Stinner81c41db2015-04-02 11:50:57 +0200931 if (err)
932 *err = GET_SOCK_ERROR;
933
Victor Stinner31bf2d52015-04-01 21:57:09 +0200934 if (!CHECK_ERRNO(EINTR))
935 break;
936
Victor Stinner81c41db2015-04-02 11:50:57 +0200937 /* sock_func() was interrupted by a signal */
938 if (PyErr_CheckSignals()) {
939 if (err)
940 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200941 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200942 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200943
Victor Stinner81c41db2015-04-02 11:50:57 +0200944 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200945 }
946
947 if (s->sock_timeout > 0
948 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200949 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200950
951 For example, select() could indicate a socket is ready for
952 reading, but the data then discarded by the OS because of a
953 wrong checksum.
954
955 Loop on select() to recheck for socket readyness. */
956 continue;
957 }
958
Victor Stinner81c41db2015-04-02 11:50:57 +0200959 /* sock_func() failed */
960 if (!err)
961 s->errorhandler();
962 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000963 return -1;
964 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200965}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000966
Victor Stinner81c41db2015-04-02 11:50:57 +0200967static int
968sock_call(PySocketSockObject *s,
969 int writing,
970 int (*func) (PySocketSockObject *s, void *data),
971 void *data)
972{
Victor Stinner8912d142015-04-06 23:16:34 +0200973 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200974}
975
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000976
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000977/* Initialize a new socket object. */
978
Victor Stinner88ed6402015-04-09 10:23:12 +0200979/* Default timeout for new sockets */
980static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000981
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200982static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000983init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 s->sock_fd = fd;
987 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500990
991 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
992 on some OSes as part of socket.type. We want to reset them here,
993 to make socket.type be set to the same value on all platforms.
994 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
995 not portable.
996 */
997#ifdef SOCK_NONBLOCK
998 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
999#endif
1000#ifdef SOCK_CLOEXEC
1001 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1002#endif
1003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001007#ifdef SOCK_NONBLOCK
1008 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001009 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001010 else
1011#endif
1012 {
1013 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001014 if (defaulttimeout >= 0) {
1015 if (internal_setblocking(s, 0) == -1) {
1016 return -1;
1017 }
1018 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001019 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001020 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001021}
1022
1023
Guido van Rossum30a685f1991-06-27 15:51:29 +00001024/* Create a new socket object.
1025 This just creates the object and initializes it.
1026 If the creation fails, return NULL and set an exception (implicit
1027 in NEWOBJ()). */
1028
Guido van Rossum73624e91994-10-10 17:59:00 +00001029static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001030new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 PySocketSockObject *s;
1033 s = (PySocketSockObject *)
1034 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001035 if (s == NULL)
1036 return NULL;
1037 if (init_sockobject(s, fd, family, type, proto) == -1) {
1038 Py_DECREF(s);
1039 return NULL;
1040 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042}
1043
Guido van Rossum30a685f1991-06-27 15:51:29 +00001044
Guido van Rossum48a680c2001-03-02 06:34:14 +00001045/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001046 thread to be in gethostbyname or getaddrinfo */
1047#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001048static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001049#endif
1050
1051
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052/* Convert a string specifying a host name or one of a few symbolic
1053 names to a numeric IP address. This usually calls gethostbyname()
1054 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001055 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001056 an error occurred; then an exception is raised. */
1057
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001059setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 struct addrinfo hints, *res;
1062 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1065 if (name[0] == '\0') {
1066 int siz;
1067 memset(&hints, 0, sizeof(hints));
1068 hints.ai_family = af;
1069 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1070 hints.ai_flags = AI_PASSIVE;
1071 Py_BEGIN_ALLOW_THREADS
1072 ACQUIRE_GETADDRINFO_LOCK
1073 error = getaddrinfo(NULL, "0", &hints, &res);
1074 Py_END_ALLOW_THREADS
1075 /* We assume that those thread-unsafe getaddrinfo() versions
1076 *are* safe regarding their return value, ie. that a
1077 subsequent call to getaddrinfo() does not destroy the
1078 outcome of the first call. */
1079 RELEASE_GETADDRINFO_LOCK
1080 if (error) {
1081 set_gaierror(error);
1082 return -1;
1083 }
1084 switch (res->ai_family) {
1085 case AF_INET:
1086 siz = 4;
1087 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001088#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 case AF_INET6:
1090 siz = 16;
1091 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001092#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 default:
1094 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001095 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 "unsupported address family");
1097 return -1;
1098 }
1099 if (res->ai_next) {
1100 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001101 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 "wildcard resolved to multiple address");
1103 return -1;
1104 }
1105 if (res->ai_addrlen < addr_ret_size)
1106 addr_ret_size = res->ai_addrlen;
1107 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1108 freeaddrinfo(res);
1109 return siz;
1110 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001111 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001112 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001113 if (strcmp(name, "255.255.255.255") == 0 ||
1114 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 struct sockaddr_in *sin;
1116 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001117 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 "address family mismatched");
1119 return -1;
1120 }
1121 sin = (struct sockaddr_in *)addr_ret;
1122 memset((void *) sin, '\0', sizeof(*sin));
1123 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001124#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 sin->sin_addr.s_addr = INADDR_BROADCAST;
1128 return sizeof(sin->sin_addr);
1129 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001130
1131 /* avoid a name resolution in case of numeric address */
1132#ifdef HAVE_INET_PTON
1133 /* check for an IPv4 address */
1134 if (af == AF_UNSPEC || af == AF_INET) {
1135 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1136 memset(sin, 0, sizeof(*sin));
1137 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1138 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001139#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001140 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001141#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001142 return 4;
1143 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001145#ifdef ENABLE_IPV6
1146 /* check for an IPv6 address - if the address contains a scope ID, we
1147 * fallback to getaddrinfo(), which can handle translation from interface
1148 * name to interface index */
1149 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1150 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1151 memset(sin, 0, sizeof(*sin));
1152 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1153 sin->sin6_family = AF_INET6;
1154#ifdef HAVE_SOCKADDR_SA_LEN
1155 sin->sin6_len = sizeof(*sin);
1156#endif
1157 return 16;
1158 }
1159 }
1160#endif /* ENABLE_IPV6 */
1161#else /* HAVE_INET_PTON */
1162 /* check for an IPv4 address */
1163 if (af == AF_INET || af == AF_UNSPEC) {
1164 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1165 memset(sin, 0, sizeof(*sin));
1166 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1167 sin->sin_family = AF_INET;
1168#ifdef HAVE_SOCKADDR_SA_LEN
1169 sin->sin_len = sizeof(*sin);
1170#endif
1171 return 4;
1172 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001173 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001174#endif /* HAVE_INET_PTON */
1175
1176 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 memset(&hints, 0, sizeof(hints));
1178 hints.ai_family = af;
1179 Py_BEGIN_ALLOW_THREADS
1180 ACQUIRE_GETADDRINFO_LOCK
1181 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001182#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 if (error == EAI_NONAME && af == AF_UNSPEC) {
1184 /* On Tru64 V5.1, numeric-to-addr conversion fails
1185 if no address family is given. Assume IPv4 for now.*/
1186 hints.ai_family = AF_INET;
1187 error = getaddrinfo(name, NULL, &hints, &res);
1188 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 Py_END_ALLOW_THREADS
1191 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1192 if (error) {
1193 set_gaierror(error);
1194 return -1;
1195 }
1196 if (res->ai_addrlen < addr_ret_size)
1197 addr_ret_size = res->ai_addrlen;
1198 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1199 freeaddrinfo(res);
1200 switch (addr_ret->sa_family) {
1201 case AF_INET:
1202 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001203#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 case AF_INET6:
1205 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001208 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 return -1;
1210 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001211}
1212
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Коренберг Марк7766b962018-02-13 00:47:42 +05001214/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
Guido van Rossum73624e91994-10-10 17:59:00 +00001216static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001217make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001218{
Коренберг Марк7766b962018-02-13 00:47:42 +05001219 char buf[INET_ADDRSTRLEN];
1220 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1221 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return NULL;
1223 }
1224 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225}
1226
Коренберг Марк7766b962018-02-13 00:47:42 +05001227#ifdef ENABLE_IPV6
1228/* Convert IPv6 sockaddr to a Python str. */
1229
1230static PyObject *
1231make_ipv6_addr(const struct sockaddr_in6 *addr)
1232{
1233 char buf[INET6_ADDRSTRLEN];
1234 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1235 PyErr_SetFromErrno(PyExc_OSError);
1236 return NULL;
1237 }
1238 return PyUnicode_FromString(buf);
1239}
1240#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001241
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001242#ifdef USE_BLUETOOTH
1243/* Convert a string representation of a Bluetooth address into a numeric
1244 address. Returns the length (6), or raises an exception and returns -1 if
1245 an error occurred. */
1246
1247static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001248setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 unsigned int b0, b1, b2, b3, b4, b5;
1251 char ch;
1252 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1255 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1256 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1257 bdaddr->b[0] = b0;
1258 bdaddr->b[1] = b1;
1259 bdaddr->b[2] = b2;
1260 bdaddr->b[3] = b3;
1261 bdaddr->b[4] = b4;
1262 bdaddr->b[5] = b5;
1263 return 6;
1264 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001265 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 return -1;
1267 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001268}
1269
1270/* Create a string representation of the Bluetooth address. This is always a
1271 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1272 value (zero padded if necessary). */
1273
1274static PyObject *
1275makebdaddr(bdaddr_t *bdaddr)
1276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1280 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1281 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1282 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001283}
1284#endif
1285
1286
Guido van Rossum30a685f1991-06-27 15:51:29 +00001287/* Create an object representing the given socket address,
1288 suitable for passing it back to bind(), connect() etc.
1289 The family field of the sockaddr structure is inspected
1290 to determine what kind of address it really is. */
1291
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001293static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001294makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 if (addrlen == 0) {
1297 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001298 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 case AF_INET:
1304 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001305 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1306 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 PyObject *ret = NULL;
1308 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1310 Py_DECREF(addrobj);
1311 }
1312 return ret;
1313 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001315#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 case AF_UNIX:
1317 {
1318 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001319#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001320 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1321 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1322 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 }
1324 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001325#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 {
1327 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001328 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 }
1330 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001331#endif /* AF_UNIX */
1332
Martin v. Löwis11017b12006-01-14 18:12:57 +00001333#if defined(AF_NETLINK)
1334 case AF_NETLINK:
1335 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1337 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001338 }
1339#endif /* AF_NETLINK */
1340
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001341#if defined(AF_QIPCRTR)
1342 case AF_QIPCRTR:
1343 {
1344 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1345 return Py_BuildValue("II", a->sq_node, a->sq_port);
1346 }
1347#endif /* AF_QIPCRTR */
1348
caaveryeffc12f2017-09-06 18:18:10 -04001349#if defined(AF_VSOCK)
1350 case AF_VSOCK:
1351 {
1352 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1353 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1354 }
1355#endif /* AF_VSOCK */
1356
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001357#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 case AF_INET6:
1359 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001360 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1361 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 PyObject *ret = NULL;
1363 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001364 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 addrobj,
1366 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001367 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 a->sin6_scope_id);
1369 Py_DECREF(addrobj);
1370 }
1371 return ret;
1372 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001373#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001374
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001375#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 case AF_BLUETOOTH:
1377 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 case BTPROTO_L2CAP:
1380 {
1381 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1382 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1383 PyObject *ret = NULL;
1384 if (addrobj) {
1385 ret = Py_BuildValue("Oi",
1386 addrobj,
1387 _BT_L2_MEMB(a, psm));
1388 Py_DECREF(addrobj);
1389 }
1390 return ret;
1391 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 case BTPROTO_RFCOMM:
1394 {
1395 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1396 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1397 PyObject *ret = NULL;
1398 if (addrobj) {
1399 ret = Py_BuildValue("Oi",
1400 addrobj,
1401 _BT_RC_MEMB(a, channel));
1402 Py_DECREF(addrobj);
1403 }
1404 return ret;
1405 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 case BTPROTO_HCI:
1408 {
1409 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001410#if defined(__NetBSD__) || defined(__DragonFly__)
1411 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001412#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 PyObject *ret = NULL;
1414 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1415 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001416#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001418
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001419#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 case BTPROTO_SCO:
1421 {
1422 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1423 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1424 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001425#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 default:
1428 PyErr_SetString(PyExc_ValueError,
1429 "Unknown Bluetooth protocol");
1430 return NULL;
1431 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001432#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001433
Antoine Pitroub156a462010-10-27 20:13:57 +00001434#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 case AF_PACKET:
1436 {
1437 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001438 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 struct ifreq ifr;
1440 /* need to look up interface name give index */
1441 if (a->sll_ifindex) {
1442 ifr.ifr_ifindex = a->sll_ifindex;
1443 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1444 ifname = ifr.ifr_name;
1445 }
1446 return Py_BuildValue("shbhy#",
1447 ifname,
1448 ntohs(a->sll_protocol),
1449 a->sll_pkttype,
1450 a->sll_hatype,
1451 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001452 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001454#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001455
Christian Heimes043d6f62008-01-07 17:19:16 +00001456#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 case AF_TIPC:
1458 {
1459 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1460 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1461 return Py_BuildValue("IIIII",
1462 a->addrtype,
1463 a->addr.nameseq.type,
1464 a->addr.nameseq.lower,
1465 a->addr.nameseq.upper,
1466 a->scope);
1467 } else if (a->addrtype == TIPC_ADDR_NAME) {
1468 return Py_BuildValue("IIIII",
1469 a->addrtype,
1470 a->addr.name.name.type,
1471 a->addr.name.name.instance,
1472 a->addr.name.name.instance,
1473 a->scope);
1474 } else if (a->addrtype == TIPC_ADDR_ID) {
1475 return Py_BuildValue("IIIII",
1476 a->addrtype,
1477 a->addr.id.node,
1478 a->addr.id.ref,
1479 0,
1480 a->scope);
1481 } else {
1482 PyErr_SetString(PyExc_ValueError,
1483 "Invalid address type");
1484 return NULL;
1485 }
1486 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001487#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001488
Serhiy Storchakad3187152017-11-09 18:00:38 +02001489#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001490 case AF_CAN:
1491 {
1492 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001493 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001494 struct ifreq ifr;
1495 /* need to look up interface name given index */
1496 if (a->can_ifindex) {
1497 ifr.ifr_ifindex = a->can_ifindex;
1498 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1499 ifname = ifr.ifr_name;
1500 }
1501
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001502 switch (proto) {
1503#ifdef CAN_ISOTP
1504 case CAN_ISOTP:
1505 {
1506 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1507 ifname,
1508 a->can_addr.tp.rx_id,
1509 a->can_addr.tp.tx_id);
1510 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001511#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001512 default:
1513 {
1514 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1515 ifname);
1516 }
1517 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001518 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001519#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001520
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001521#ifdef PF_SYSTEM
1522 case PF_SYSTEM:
1523 switch(proto) {
1524#ifdef SYSPROTO_CONTROL
1525 case SYSPROTO_CONTROL:
1526 {
1527 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1528 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1529 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001530#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001531 default:
1532 PyErr_SetString(PyExc_ValueError,
1533 "Invalid address type");
1534 return 0;
1535 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001536#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001537
Christian Heimesdffa3942016-09-05 23:54:41 +02001538#ifdef HAVE_SOCKADDR_ALG
1539 case AF_ALG:
1540 {
1541 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1542 return Py_BuildValue("s#s#HH",
1543 a->salg_type,
1544 strnlen((const char*)a->salg_type,
1545 sizeof(a->salg_type)),
1546 a->salg_name,
1547 strnlen((const char*)a->salg_name,
1548 sizeof(a->salg_name)),
1549 a->salg_feat,
1550 a->salg_mask);
1551 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001552#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 default:
1557 /* If we don't know the address family, don't raise an
1558 exception -- return it as an (int, bytes) tuple. */
1559 return Py_BuildValue("iy#",
1560 addr->sa_family,
1561 addr->sa_data,
1562 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001565}
1566
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001567/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1568 (in particular, numeric IP addresses). */
1569struct maybe_idna {
1570 PyObject *obj;
1571 char *buf;
1572};
1573
1574static void
1575idna_cleanup(struct maybe_idna *data)
1576{
1577 Py_CLEAR(data->obj);
1578}
1579
1580static int
1581idna_converter(PyObject *obj, struct maybe_idna *data)
1582{
1583 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001584 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001585 if (obj == NULL) {
1586 idna_cleanup(data);
1587 return 1;
1588 }
1589 data->obj = NULL;
1590 len = -1;
1591 if (PyBytes_Check(obj)) {
1592 data->buf = PyBytes_AsString(obj);
1593 len = PyBytes_Size(obj);
1594 }
1595 else if (PyByteArray_Check(obj)) {
1596 data->buf = PyByteArray_AsString(obj);
1597 len = PyByteArray_Size(obj);
1598 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001599 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001600 if (PyUnicode_READY(obj) == -1) {
1601 return 0;
1602 }
1603 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001604 data->buf = PyUnicode_DATA(obj);
1605 len = PyUnicode_GET_LENGTH(obj);
1606 }
1607 else {
1608 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1609 if (!obj2) {
1610 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1611 return 0;
1612 }
1613 assert(PyBytes_Check(obj2));
1614 data->obj = obj2;
1615 data->buf = PyBytes_AS_STRING(obj2);
1616 len = PyBytes_GET_SIZE(obj2);
1617 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001618 }
1619 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001620 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1621 obj->ob_type->tp_name);
1622 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001623 }
1624 if (strlen(data->buf) != len) {
1625 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001626 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001627 return 0;
1628 }
1629 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001630}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001631
1632/* Parse a socket address argument according to the socket object's
1633 address family. Return 1 if the address was in the proper format,
1634 0 of not. The address is returned through addr_ret, its length
1635 through len_ret. */
1636
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001638getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001639 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001643#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 case AF_UNIX:
1645 {
1646 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001647 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001648 int retval = 0;
1649
1650 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1651 allow embedded nulls on Linux. */
1652 if (PyUnicode_Check(args)) {
1653 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1654 return 0;
1655 }
1656 else
1657 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001658 if (!PyArg_Parse(args, "y*", &path)) {
1659 Py_DECREF(args);
1660 return retval;
1661 }
1662 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001665#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001666 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001668 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001669 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001671 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 }
1673 }
1674 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001675#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 {
1677 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001678 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001679 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001681 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001683 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 }
1685 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001686 memcpy(addr->sun_path, path.buf, path.len);
1687 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001688 retval = 1;
1689 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001690 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001691 Py_DECREF(args);
1692 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001694#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695
Martin v. Löwis11017b12006-01-14 18:12:57 +00001696#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 case AF_NETLINK:
1698 {
1699 struct sockaddr_nl* addr;
1700 int pid, groups;
1701 addr = (struct sockaddr_nl *)addr_ret;
1702 if (!PyTuple_Check(args)) {
1703 PyErr_Format(
1704 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001705 "%s(): AF_NETLINK address must be tuple, not %.500s",
1706 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 return 0;
1708 }
Oren Milman735171e2018-09-11 19:51:29 +03001709 if (!PyArg_ParseTuple(args,
1710 "II;AF_NETLINK address must be a pair "
1711 "(pid, groups)",
1712 &pid, &groups))
1713 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 addr->nl_family = AF_NETLINK;
1717 addr->nl_pid = pid;
1718 addr->nl_groups = groups;
1719 *len_ret = sizeof(*addr);
1720 return 1;
1721 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001722#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001723
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001724#if defined(AF_QIPCRTR)
1725 case AF_QIPCRTR:
1726 {
1727 struct sockaddr_qrtr* addr;
1728 unsigned int node, port;
1729 addr = (struct sockaddr_qrtr *)addr_ret;
1730 if (!PyTuple_Check(args)) {
1731 PyErr_Format(
1732 PyExc_TypeError,
1733 "getsockaddrarg: "
1734 "AF_QIPCRTR address must be tuple, not %.500s",
1735 Py_TYPE(args)->tp_name);
1736 return 0;
1737 }
1738 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1739 return 0;
1740 addr->sq_family = AF_QIPCRTR;
1741 addr->sq_node = node;
1742 addr->sq_port = port;
1743 *len_ret = sizeof(*addr);
1744 return 1;
1745 }
1746#endif /* AF_QIPCRTR */
1747
caaveryeffc12f2017-09-06 18:18:10 -04001748#if defined(AF_VSOCK)
1749 case AF_VSOCK:
1750 {
1751 struct sockaddr_vm* addr;
1752 int port, cid;
1753 addr = (struct sockaddr_vm *)addr_ret;
1754 memset(addr, 0, sizeof(struct sockaddr_vm));
1755 if (!PyTuple_Check(args)) {
1756 PyErr_Format(
1757 PyExc_TypeError,
1758 "getsockaddrarg: "
1759 "AF_VSOCK address must be tuple, not %.500s",
1760 Py_TYPE(args)->tp_name);
1761 return 0;
1762 }
1763 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1764 return 0;
1765 addr->svm_family = s->sock_family;
1766 addr->svm_port = port;
1767 addr->svm_cid = cid;
1768 *len_ret = sizeof(*addr);
1769 return 1;
1770 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001771#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001772
1773
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001774#ifdef AF_RDS
1775 case AF_RDS:
1776 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001777#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 case AF_INET:
1780 {
1781 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001782 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 int port, result;
1784 if (!PyTuple_Check(args)) {
1785 PyErr_Format(
1786 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001787 "%s(): AF_INET address must be tuple, not %.500s",
1788 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 return 0;
1790 }
Oren Milman735171e2018-09-11 19:51:29 +03001791 if (!PyArg_ParseTuple(args,
1792 "O&i;AF_INET address must be a pair "
1793 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001794 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001795 {
1796 assert(PyErr_Occurred());
1797 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1798 PyErr_Format(PyExc_OverflowError,
1799 "%s(): port must be 0-65535.", caller);
1800 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001802 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001804 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001806 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (result < 0)
1808 return 0;
1809 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001810 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001812 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 return 0;
1814 }
1815 addr->sin_family = AF_INET;
1816 addr->sin_port = htons((short)port);
1817 *len_ret = sizeof *addr;
1818 return 1;
1819 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001820
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001821#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 case AF_INET6:
1823 {
1824 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001825 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001826 int port, result;
1827 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 flowinfo = scope_id = 0;
1829 if (!PyTuple_Check(args)) {
1830 PyErr_Format(
1831 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001832 "%s(): AF_INET6 address must be tuple, not %.500s",
1833 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 return 0;
1835 }
Oren Milman735171e2018-09-11 19:51:29 +03001836 if (!PyArg_ParseTuple(args,
1837 "O&i|II;AF_INET6 address must be a tuple "
1838 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001839 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001840 &scope_id))
1841 {
1842 assert(PyErr_Occurred());
1843 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1844 PyErr_Format(PyExc_OverflowError,
1845 "%s(): port must be 0-65535.", caller);
1846 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 return 0;
1848 }
1849 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001850 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001852 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (result < 0)
1854 return 0;
1855 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001856 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001858 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 return 0;
1860 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001861 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001862 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001863 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001864 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001865 return 0;
1866 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 addr->sin6_family = s->sock_family;
1868 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001869 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 addr->sin6_scope_id = scope_id;
1871 *len_ret = sizeof *addr;
1872 return 1;
1873 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001874#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001875
Hye-Shik Chang81268602004-02-02 06:05:24 +00001876#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 case AF_BLUETOOTH:
1878 {
1879 switch (s->sock_proto) {
1880 case BTPROTO_L2CAP:
1881 {
1882 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001883 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 addr = (struct sockaddr_l2 *)addr_ret;
1886 memset(addr, 0, sizeof(struct sockaddr_l2));
1887 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1888 if (!PyArg_ParseTuple(args, "si", &straddr,
1889 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001890 PyErr_Format(PyExc_OSError,
1891 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 return 0;
1893 }
1894 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1895 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 *len_ret = sizeof *addr;
1898 return 1;
1899 }
1900 case BTPROTO_RFCOMM:
1901 {
1902 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001903 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 addr = (struct sockaddr_rc *)addr_ret;
1906 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1907 if (!PyArg_ParseTuple(args, "si", &straddr,
1908 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001909 PyErr_Format(PyExc_OSError,
1910 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 return 0;
1912 }
1913 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1914 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 *len_ret = sizeof *addr;
1917 return 1;
1918 }
1919 case BTPROTO_HCI:
1920 {
1921 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001922#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001923 const char *straddr;
1924 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1925 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001926 PyErr_Format(PyExc_OSError, "%s: "
1927 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001928 return 0;
1929 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001930 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001931 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1932 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001933#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1935 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001936 PyErr_Format(PyExc_OSError,
1937 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 return 0;
1939 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001940#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 *len_ret = sizeof *addr;
1942 return 1;
1943 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001944#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 case BTPROTO_SCO:
1946 {
1947 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001948 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 addr = (struct sockaddr_sco *)addr_ret;
1951 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1952 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001953 PyErr_Format(PyExc_OSError,
1954 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 return 0;
1956 }
1957 straddr = PyBytes_AS_STRING(args);
1958 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1959 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 *len_ret = sizeof *addr;
1962 return 1;
1963 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001964#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 default:
Oren Milman735171e2018-09-11 19:51:29 +03001966 PyErr_Format(PyExc_OSError,
1967 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 return 0;
1969 }
1970 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001971#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001972
Antoine Pitroub156a462010-10-27 20:13:57 +00001973#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 case AF_PACKET:
1975 {
1976 struct sockaddr_ll* addr;
1977 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001978 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 int protoNumber;
1980 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001981 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001982 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 if (!PyTuple_Check(args)) {
1985 PyErr_Format(
1986 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001987 "%s(): AF_PACKET address must be tuple, not %.500s",
1988 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 return 0;
1990 }
Oren Milman735171e2018-09-11 19:51:29 +03001991 /* XXX: improve the default error message according to the
1992 documentation of AF_PACKET, which would be added as part
1993 of bpo-25041. */
1994 if (!PyArg_ParseTuple(args,
1995 "si|iiy*;AF_PACKET address must be a tuple of "
1996 "two to five elements",
1997 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001998 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03001999 {
2000 assert(PyErr_Occurred());
2001 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2002 PyErr_Format(PyExc_OverflowError,
2003 "%s(): address argument out of range", caller);
2004 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002006 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2008 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2009 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2010 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002011 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 return 0;
2013 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002014 if (haddr.buf && haddr.len > 8) {
2015 PyErr_SetString(PyExc_ValueError,
2016 "Hardware address must be 8 bytes or less");
2017 PyBuffer_Release(&haddr);
2018 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 }
2020 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002021 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002023 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002024 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 return 0;
2026 }
2027 addr = (struct sockaddr_ll*)addr_ret;
2028 addr->sll_family = AF_PACKET;
2029 addr->sll_protocol = htons((short)protoNumber);
2030 addr->sll_ifindex = ifr.ifr_ifindex;
2031 addr->sll_pkttype = pkttype;
2032 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002033 if (haddr.buf) {
2034 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2035 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002037 else
2038 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002040 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 return 1;
2042 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002043#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002044
Christian Heimes043d6f62008-01-07 17:19:16 +00002045#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 case AF_TIPC:
2047 {
2048 unsigned int atype, v1, v2, v3;
2049 unsigned int scope = TIPC_CLUSTER_SCOPE;
2050 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 if (!PyTuple_Check(args)) {
2053 PyErr_Format(
2054 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002055 "%s(): AF_TIPC address must be tuple, not %.500s",
2056 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 return 0;
2058 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002061 "IIII|I;AF_TIPC address must be a tuple "
2062 "(addr_type, v1, v2, v3[, scope])",
2063 &atype, &v1, &v2, &v3, &scope))
2064 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002066 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 addr = (struct sockaddr_tipc *) addr_ret;
2069 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 addr->family = AF_TIPC;
2072 addr->scope = scope;
2073 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (atype == TIPC_ADDR_NAMESEQ) {
2076 addr->addr.nameseq.type = v1;
2077 addr->addr.nameseq.lower = v2;
2078 addr->addr.nameseq.upper = v3;
2079 } else if (atype == TIPC_ADDR_NAME) {
2080 addr->addr.name.name.type = v1;
2081 addr->addr.name.name.instance = v2;
2082 } else if (atype == TIPC_ADDR_ID) {
2083 addr->addr.id.node = v1;
2084 addr->addr.id.ref = v2;
2085 } else {
2086 /* Shouldn't happen */
2087 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2088 return 0;
2089 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 return 1;
2094 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002095#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002096
Serhiy Storchakad3187152017-11-09 18:00:38 +02002097#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002098 case AF_CAN:
2099 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002100#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002101 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002102 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002103#endif
2104#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002105 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002106#endif
2107#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002108 {
2109 struct sockaddr_can *addr;
2110 PyObject *interfaceName;
2111 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002112 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002113 addr = (struct sockaddr_can *)addr_ret;
2114
Oren Milman735171e2018-09-11 19:51:29 +03002115 if (!PyTuple_Check(args)) {
2116 PyErr_Format(PyExc_TypeError,
2117 "%s(): AF_CAN address must be tuple, not %.500s",
2118 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002119 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002120 }
2121 if (!PyArg_ParseTuple(args,
2122 "O&;AF_CAN address must be a tuple "
2123 "(interface, )",
2124 PyUnicode_FSConverter, &interfaceName))
2125 {
2126 return 0;
2127 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002128
2129 len = PyBytes_GET_SIZE(interfaceName);
2130
2131 if (len == 0) {
2132 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002133 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002134 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2135 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002136 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2137 s->errorhandler();
2138 Py_DECREF(interfaceName);
2139 return 0;
2140 }
2141 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002142 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002143 "AF_CAN interface name too long");
2144 Py_DECREF(interfaceName);
2145 return 0;
2146 }
2147
2148 addr->can_family = AF_CAN;
2149 addr->can_ifindex = ifr.ifr_ifindex;
2150
2151 *len_ret = sizeof(*addr);
2152 Py_DECREF(interfaceName);
2153 return 1;
2154 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002155#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002156
2157#ifdef CAN_ISOTP
2158 case CAN_ISOTP:
2159 {
2160 struct sockaddr_can *addr;
2161 PyObject *interfaceName;
2162 struct ifreq ifr;
2163 Py_ssize_t len;
2164 unsigned long int rx_id, tx_id;
2165
2166 addr = (struct sockaddr_can *)addr_ret;
2167
2168 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2169 &interfaceName,
2170 &rx_id,
2171 &tx_id))
2172 return 0;
2173
2174 len = PyBytes_GET_SIZE(interfaceName);
2175
2176 if (len == 0) {
2177 ifr.ifr_ifindex = 0;
2178 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2179 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2180 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2181 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2182 s->errorhandler();
2183 Py_DECREF(interfaceName);
2184 return 0;
2185 }
2186 } else {
2187 PyErr_SetString(PyExc_OSError,
2188 "AF_CAN interface name too long");
2189 Py_DECREF(interfaceName);
2190 return 0;
2191 }
2192
2193 addr->can_family = AF_CAN;
2194 addr->can_ifindex = ifr.ifr_ifindex;
2195 addr->can_addr.tp.rx_id = rx_id;
2196 addr->can_addr.tp.tx_id = tx_id;
2197
2198 *len_ret = sizeof(*addr);
2199 Py_DECREF(interfaceName);
2200 return 1;
2201 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002202#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002203 default:
Oren Milman735171e2018-09-11 19:51:29 +03002204 PyErr_Format(PyExc_OSError,
2205 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002206 return 0;
2207 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002208#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002209
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002210#ifdef PF_SYSTEM
2211 case PF_SYSTEM:
2212 switch (s->sock_proto) {
2213#ifdef SYSPROTO_CONTROL
2214 case SYSPROTO_CONTROL:
2215 {
2216 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002217
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002218 addr = (struct sockaddr_ctl *)addr_ret;
2219 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002220 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002221
2222 if (PyUnicode_Check(args)) {
2223 struct ctl_info info;
2224 PyObject *ctl_name;
2225
2226 if (!PyArg_Parse(args, "O&",
2227 PyUnicode_FSConverter, &ctl_name)) {
2228 return 0;
2229 }
2230
Victor Stinnerf50e1872015-03-20 11:32:24 +01002231 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002232 PyErr_SetString(PyExc_ValueError,
2233 "provided string is too long");
2234 Py_DECREF(ctl_name);
2235 return 0;
2236 }
2237 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2238 sizeof(info.ctl_name));
2239 Py_DECREF(ctl_name);
2240
2241 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2242 PyErr_SetString(PyExc_OSError,
2243 "cannot find kernel control with provided name");
2244 return 0;
2245 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002246
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002247 addr->sc_id = info.ctl_id;
2248 addr->sc_unit = 0;
2249 } else if (!PyArg_ParseTuple(args, "II",
2250 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002251 PyErr_Format(PyExc_TypeError,
2252 "%s(): PF_SYSTEM address must be a str or "
2253 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002254 return 0;
2255 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002256
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002257 *len_ret = sizeof(*addr);
2258 return 1;
2259 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002260#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002261 default:
Oren Milman735171e2018-09-11 19:51:29 +03002262 PyErr_Format(PyExc_OSError,
2263 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002264 return 0;
2265 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002266#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002267#ifdef HAVE_SOCKADDR_ALG
2268 case AF_ALG:
2269 {
2270 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002271 const char *type;
2272 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002273 sa = (struct sockaddr_alg *)addr_ret;
2274
2275 memset(sa, 0, sizeof(*sa));
2276 sa->salg_family = AF_ALG;
2277
Oren Milman735171e2018-09-11 19:51:29 +03002278 if (!PyTuple_Check(args)) {
2279 PyErr_Format(PyExc_TypeError,
2280 "%s(): AF_ALG address must be tuple, not %.500s",
2281 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002282 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002283 }
2284 if (!PyArg_ParseTuple(args,
2285 "ss|HH;AF_ALG address must be a tuple "
2286 "(type, name[, feat[, mask]])",
2287 &type, &name, &sa->salg_feat, &sa->salg_mask))
2288 {
2289 return 0;
2290 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002291 /* sockaddr_alg has fixed-sized char arrays for type, and name
2292 * both must be NULL terminated.
2293 */
2294 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002295 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2296 return 0;
2297 }
2298 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002299 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002300 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2301 return 0;
2302 }
2303 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2304
2305 *len_ret = sizeof(*sa);
2306 return 1;
2307 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002308#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 default:
Oren Milman735171e2018-09-11 19:51:29 +03002313 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002317}
2318
Guido van Rossum30a685f1991-06-27 15:51:29 +00002319
Guido van Rossum48a680c2001-03-02 06:34:14 +00002320/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002321 Return 1 if the family is known, 0 otherwise. The length is returned
2322 through len_ret. */
2323
2324static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002325getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002328
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002329#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 case AF_UNIX:
2331 {
2332 *len_ret = sizeof (struct sockaddr_un);
2333 return 1;
2334 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002335#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002336
Martin v. Löwis11017b12006-01-14 18:12:57 +00002337#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002338 case AF_NETLINK:
2339 {
2340 *len_ret = sizeof (struct sockaddr_nl);
2341 return 1;
2342 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002343#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002344
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002345#if defined(AF_QIPCRTR)
2346 case AF_QIPCRTR:
2347 {
2348 *len_ret = sizeof (struct sockaddr_qrtr);
2349 return 1;
2350 }
2351#endif /* AF_QIPCRTR */
2352
caaveryeffc12f2017-09-06 18:18:10 -04002353#if defined(AF_VSOCK)
2354 case AF_VSOCK:
2355 {
2356 *len_ret = sizeof (struct sockaddr_vm);
2357 return 1;
2358 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002359#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002360
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002361#ifdef AF_RDS
2362 case AF_RDS:
2363 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002364#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 case AF_INET:
2367 {
2368 *len_ret = sizeof (struct sockaddr_in);
2369 return 1;
2370 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002371
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002372#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 case AF_INET6:
2374 {
2375 *len_ret = sizeof (struct sockaddr_in6);
2376 return 1;
2377 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002378#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002379
Hye-Shik Chang81268602004-02-02 06:05:24 +00002380#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 case AF_BLUETOOTH:
2382 {
2383 switch(s->sock_proto)
2384 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 case BTPROTO_L2CAP:
2387 *len_ret = sizeof (struct sockaddr_l2);
2388 return 1;
2389 case BTPROTO_RFCOMM:
2390 *len_ret = sizeof (struct sockaddr_rc);
2391 return 1;
2392 case BTPROTO_HCI:
2393 *len_ret = sizeof (struct sockaddr_hci);
2394 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002395#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 case BTPROTO_SCO:
2397 *len_ret = sizeof (struct sockaddr_sco);
2398 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002399#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002401 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 "unknown BT protocol");
2403 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 }
2406 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002407#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002408
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002409#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 case AF_PACKET:
2411 {
2412 *len_ret = sizeof (struct sockaddr_ll);
2413 return 1;
2414 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002415#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002416
Christian Heimes043d6f62008-01-07 17:19:16 +00002417#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 case AF_TIPC:
2419 {
2420 *len_ret = sizeof (struct sockaddr_tipc);
2421 return 1;
2422 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002423#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002424
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002425#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002426 case AF_CAN:
2427 {
2428 *len_ret = sizeof (struct sockaddr_can);
2429 return 1;
2430 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002431#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002432
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002433#ifdef PF_SYSTEM
2434 case PF_SYSTEM:
2435 switch(s->sock_proto) {
2436#ifdef SYSPROTO_CONTROL
2437 case SYSPROTO_CONTROL:
2438 *len_ret = sizeof (struct sockaddr_ctl);
2439 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002440#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002441 default:
2442 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2443 "unknown PF_SYSTEM protocol");
2444 return 0;
2445 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002446#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002447#ifdef HAVE_SOCKADDR_ALG
2448 case AF_ALG:
2449 {
2450 *len_ret = sizeof (struct sockaddr_alg);
2451 return 1;
2452 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002453#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002458 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002462}
2463
2464
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002465/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2466 Currently, these methods are only compiled if the RFC 2292/3542
2467 CMSG_LEN() macro is available. Older systems seem to have used
2468 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2469 it may be possible to define CMSG_LEN() that way if it's not
2470 provided. Some architectures might need extra padding after the
2471 cmsghdr, however, and CMSG_LEN() would have to take account of
2472 this. */
2473#ifdef CMSG_LEN
2474/* If length is in range, set *result to CMSG_LEN(length) and return
2475 true; otherwise, return false. */
2476static int
2477get_CMSG_LEN(size_t length, size_t *result)
2478{
2479 size_t tmp;
2480
2481 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2482 return 0;
2483 tmp = CMSG_LEN(length);
2484 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2485 return 0;
2486 *result = tmp;
2487 return 1;
2488}
2489
2490#ifdef CMSG_SPACE
2491/* If length is in range, set *result to CMSG_SPACE(length) and return
2492 true; otherwise, return false. */
2493static int
2494get_CMSG_SPACE(size_t length, size_t *result)
2495{
2496 size_t tmp;
2497
2498 /* Use CMSG_SPACE(1) here in order to take account of the padding
2499 necessary before *and* after the data. */
2500 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2501 return 0;
2502 tmp = CMSG_SPACE(length);
2503 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2504 return 0;
2505 *result = tmp;
2506 return 1;
2507}
2508#endif
2509
2510/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2511 pointer in msg->msg_control with at least "space" bytes after it,
2512 and its cmsg_len member inside the buffer. */
2513static int
2514cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2515{
2516 size_t cmsg_offset;
2517 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2518 sizeof(cmsgh->cmsg_len));
2519
Charles-François Natali466517d2011-08-28 18:23:43 +02002520 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002521 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002522 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002523 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2524 annoying under OS X as it's unsigned there and so it triggers a
2525 tautological comparison warning under Clang when compared against 0.
2526 Since the check is valid on other platforms, silence the warning under
2527 Clang. */
2528 #ifdef __clang__
2529 #pragma clang diagnostic push
2530 #pragma clang diagnostic ignored "-Wtautological-compare"
2531 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002532 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002533 #pragma GCC diagnostic push
2534 #pragma GCC diagnostic ignored "-Wtype-limits"
2535 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002536 if (msg->msg_controllen < 0)
2537 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002538 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002539 #pragma GCC diagnostic pop
2540 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002541 #ifdef __clang__
2542 #pragma clang diagnostic pop
2543 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002544 if (space < cmsg_len_end)
2545 space = cmsg_len_end;
2546 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2547 return (cmsg_offset <= (size_t)-1 - space &&
2548 cmsg_offset + space <= msg->msg_controllen);
2549}
2550
2551/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2552 *space to number of bytes following it in the buffer and return
2553 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2554 msg->msg_controllen are valid. */
2555static int
2556get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2557{
2558 size_t data_offset;
2559 char *data_ptr;
2560
2561 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2562 return 0;
2563 data_offset = data_ptr - (char *)msg->msg_control;
2564 if (data_offset > msg->msg_controllen)
2565 return 0;
2566 *space = msg->msg_controllen - data_offset;
2567 return 1;
2568}
2569
2570/* If cmsgh is invalid or not contained in the buffer pointed to by
2571 msg->msg_control, return -1. If cmsgh is valid and its associated
2572 data is entirely contained in the buffer, set *data_len to the
2573 length of the associated data and return 0. If only part of the
2574 associated data is contained in the buffer but cmsgh is otherwise
2575 valid, set *data_len to the length contained in the buffer and
2576 return 1. */
2577static int
2578get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2579{
2580 size_t space, cmsg_data_len;
2581
2582 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2583 cmsgh->cmsg_len < CMSG_LEN(0))
2584 return -1;
2585 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2586 if (!get_cmsg_data_space(msg, cmsgh, &space))
2587 return -1;
2588 if (space >= cmsg_data_len) {
2589 *data_len = cmsg_data_len;
2590 return 0;
2591 }
2592 *data_len = space;
2593 return 1;
2594}
2595#endif /* CMSG_LEN */
2596
2597
Victor Stinner31bf2d52015-04-01 21:57:09 +02002598struct sock_accept {
2599 socklen_t *addrlen;
2600 sock_addr_t *addrbuf;
2601 SOCKET_T result;
2602};
2603
2604#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2605/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2606static int accept4_works = -1;
2607#endif
2608
2609static int
2610sock_accept_impl(PySocketSockObject *s, void *data)
2611{
2612 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002613 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2614 socklen_t *paddrlen = ctx->addrlen;
2615#ifdef HAVE_SOCKADDR_ALG
2616 /* AF_ALG does not support accept() with addr and raises
2617 * ECONNABORTED instead. */
2618 if (s->sock_family == AF_ALG) {
2619 addr = NULL;
2620 paddrlen = NULL;
2621 *ctx->addrlen = 0;
2622 }
2623#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002624
2625#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2626 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002627 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002628 SOCK_CLOEXEC);
2629 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2630 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2631 accept4_works = (errno != ENOSYS);
2632 }
2633 }
2634 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002635 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002636#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002637 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002638#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002639
2640#ifdef MS_WINDOWS
2641 return (ctx->result != INVALID_SOCKET);
2642#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002643 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002644#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002645}
2646
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002647/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002648
Guido van Rossum73624e91994-10-10 17:59:00 +00002649static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302650sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002653 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 socklen_t addrlen;
2655 PyObject *sock = NULL;
2656 PyObject *addr = NULL;
2657 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002658 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 if (!getsockaddrlen(s, &addrlen))
2661 return NULL;
2662 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (!IS_SELECTABLE(s))
2665 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002666
Victor Stinner31bf2d52015-04-01 21:57:09 +02002667 ctx.addrlen = &addrlen;
2668 ctx.addrbuf = &addrbuf;
2669 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002671 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002672
Victor Stinnerdaf45552013-08-28 00:53:59 +02002673#ifdef MS_WINDOWS
2674 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2675 PyErr_SetFromWindowsErr(0);
2676 SOCKETCLOSE(newfd);
2677 goto finally;
2678 }
2679#else
2680
2681#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2682 if (!accept4_works)
2683#endif
2684 {
2685 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2686 SOCKETCLOSE(newfd);
2687 goto finally;
2688 }
2689 }
2690#endif
2691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 sock = PyLong_FromSocket_t(newfd);
2693 if (sock == NULL) {
2694 SOCKETCLOSE(newfd);
2695 goto finally;
2696 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2699 addrlen, s->sock_proto);
2700 if (addr == NULL)
2701 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002704
Guido van Rossum67f7a382002-06-06 21:08:16 +00002705finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 Py_XDECREF(sock);
2707 Py_XDECREF(addr);
2708 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002709}
2710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002712"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002713\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002714Wait for an incoming connection. Return a new socket file descriptor\n\
2715representing the connection, and the address of the client.\n\
2716For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002717
Guido van Rossum11ba0942002-06-13 15:07:44 +00002718/* s.setblocking(flag) method. Argument:
2719 False -- non-blocking mode; same as settimeout(0)
2720 True -- blocking mode; same as settimeout(None)
2721*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002722
Guido van Rossum73624e91994-10-10 17:59:00 +00002723static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002724sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002725{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002726 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 block = PyLong_AsLong(arg);
2729 if (block == -1 && PyErr_Occurred())
2730 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Victor Stinner9001d802015-04-06 23:06:01 +02002732 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002733 if (internal_setblocking(s, block) == -1) {
2734 return NULL;
2735 }
2736 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002737}
Guido van Rossume4485b01994-09-07 14:32:49 +00002738
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002739PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002740"setblocking(flag)\n\
2741\n\
2742Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002743setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002744setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002745
Yury Selivanovf11b4602018-01-28 17:27:38 -05002746/* s.getblocking() method.
2747 Returns True if socket is in blocking mode,
2748 False if it is in non-blocking mode.
2749*/
2750static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302751sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002752{
2753 if (s->sock_timeout) {
2754 Py_RETURN_TRUE;
2755 }
2756 else {
2757 Py_RETURN_FALSE;
2758 }
2759}
2760
2761PyDoc_STRVAR(getblocking_doc,
2762"getblocking()\n\
2763\n\
2764Returns True if socket is in blocking mode, or False if it\n\
2765is in non-blocking mode.");
2766
Victor Stinner71694d52015-03-28 01:18:54 +01002767static int
2768socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2769{
2770#ifdef MS_WINDOWS
2771 struct timeval tv;
2772#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002773#ifndef HAVE_POLL
2774 _PyTime_t ms;
2775#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002776 int overflow = 0;
2777
2778 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002779 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002780 return 0;
2781 }
2782
Victor Stinner869e1772015-03-30 03:49:14 +02002783 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002784 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002785 return -1;
2786
2787 if (*timeout < 0) {
2788 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2789 return -1;
2790 }
2791
2792#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002793 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002794#endif
2795#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002796 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002797 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002798#endif
2799 if (overflow) {
2800 PyErr_SetString(PyExc_OverflowError,
2801 "timeout doesn't fit into C timeval");
2802 return -1;
2803 }
2804
2805 return 0;
2806}
2807
Guido van Rossum11ba0942002-06-13 15:07:44 +00002808/* s.settimeout(timeout) method. Argument:
2809 None -- no timeout, blocking mode; same as setblocking(True)
2810 0.0 -- non-blocking mode; same as setblocking(False)
2811 > 0 -- timeout mode; operations time out after timeout seconds
2812 < 0 -- illegal; raises an exception
2813*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002814static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002815sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002816{
Victor Stinner71694d52015-03-28 01:18:54 +01002817 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002818
Victor Stinner71694d52015-03-28 01:18:54 +01002819 if (socket_parse_timeout(&timeout, arg) < 0)
2820 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002823
2824 int block = timeout < 0;
2825 /* Blocking mode for a Python socket object means that operations
2826 like :meth:`recv` or :meth:`sendall` will block the execution of
2827 the current thread until they are complete or aborted with a
2828 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2829 the underlying FD is in a blocking mode. When timeout is a positive
2830 number, the FD is in a non-blocking mode, and socket ops are
2831 implemented with a `select()` call.
2832
2833 When timeout is 0.0, the FD is in a non-blocking mode.
2834
2835 This table summarizes all states in which the socket object and
2836 its underlying FD can be:
2837
2838 ==================== ===================== ==============
2839 `gettimeout()` `getblocking()` FD
2840 ==================== ===================== ==============
2841 ``None`` ``True`` blocking
2842 ``0.0`` ``False`` non-blocking
2843 ``> 0`` ``True`` non-blocking
2844 */
2845
2846 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002847 return NULL;
2848 }
2849 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002850}
2851
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002852PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002853"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002854\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002855Set a timeout on socket operations. 'timeout' can be a float,\n\
2856giving in seconds, or None. Setting a timeout of None disables\n\
2857the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002860/* s.gettimeout() method.
2861 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002862static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302863sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002864{
Victor Stinner71694d52015-03-28 01:18:54 +01002865 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002866 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 }
Victor Stinner71694d52015-03-28 01:18:54 +01002868 else {
2869 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2870 return PyFloat_FromDouble(seconds);
2871 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872}
2873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002874PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002875"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002876\n\
oldkaa0735f2018-02-02 16:52:55 +08002877Returns the timeout in seconds (float) associated with socket\n\
2878operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002879operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002880
Guido van Rossumaee08791992-09-08 09:05:33 +00002881/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002882 With an integer third argument, sets an integer optval with optlen=4.
2883 With None as third argument and an integer fourth argument, set
2884 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002885 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002886 use optional built-in module 'struct' to encode the string.
2887*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002888
Guido van Rossum73624e91994-10-10 17:59:00 +00002889static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002890sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 int level;
2893 int optname;
2894 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002895 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002897 unsigned int optlen;
2898 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002899
caaveryeffc12f2017-09-06 18:18:10 -04002900#ifdef AF_VSOCK
2901 if (s->sock_family == AF_VSOCK) {
2902 uint64_t vflag; // Must be set width of 64 bits
2903 /* setsockopt(level, opt, flag) */
2904 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2905 &level, &optname, &vflag)) {
2906 // level should always be set to AF_VSOCK
2907 res = setsockopt(s->sock_fd, level, optname,
2908 (void*)&vflag, sizeof vflag);
2909 goto done;
2910 }
2911 return NULL;
2912 }
2913#endif
2914
Christian Heimesdffa3942016-09-05 23:54:41 +02002915 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 if (PyArg_ParseTuple(args, "iii:setsockopt",
2917 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002918 res = setsockopt(s->sock_fd, level, optname,
2919 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002920 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002922
2923 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002924 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002925 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2926 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2927 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002928 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002929 NULL, (socklen_t)optlen);
2930 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002932
2933 PyErr_Clear();
2934 /* setsockopt(level, opt, buffer) */
2935 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2936 &level, &optname, &optval))
2937 return NULL;
2938
2939#ifdef MS_WINDOWS
2940 if (optval.len > INT_MAX) {
2941 PyBuffer_Release(&optval);
2942 PyErr_Format(PyExc_OverflowError,
2943 "socket option is larger than %i bytes",
2944 INT_MAX);
2945 return NULL;
2946 }
2947 res = setsockopt(s->sock_fd, level, optname,
2948 optval.buf, (int)optval.len);
2949#else
2950 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2951#endif
2952 PyBuffer_Release(&optval);
2953
2954done:
Victor Stinnercc739322016-03-23 21:35:29 +01002955 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002957 }
2958
2959 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002960}
2961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002963"setsockopt(level, option, value: int)\n\
2964setsockopt(level, option, value: buffer)\n\
2965setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002966\n\
2967Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002968The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002969None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002971
Guido van Rossumaee08791992-09-08 09:05:33 +00002972/* s.getsockopt() method.
2973 With two arguments, retrieves an integer option.
2974 With a third integer argument, retrieves a string buffer of that size;
2975 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002976
Guido van Rossum73624e91994-10-10 17:59:00 +00002977static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002978sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 int level;
2981 int optname;
2982 int res;
2983 PyObject *buf;
2984 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002985 int flag = 0;
2986 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2989 &level, &optname, &buflen))
2990 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002993#ifdef AF_VSOCK
2994 if (s->sock_family == AF_VSOCK) {
2995 uint64_t vflag = 0; // Must be set width of 64 bits
2996 flagsize = sizeof vflag;
2997 res = getsockopt(s->sock_fd, level, optname,
2998 (void *)&vflag, &flagsize);
2999 if (res < 0)
3000 return s->errorhandler();
3001 return PyLong_FromUnsignedLong(vflag);
3002 }
3003#endif
3004 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 res = getsockopt(s->sock_fd, level, optname,
3006 (void *)&flag, &flagsize);
3007 if (res < 0)
3008 return s->errorhandler();
3009 return PyLong_FromLong(flag);
3010 }
caaveryeffc12f2017-09-06 18:18:10 -04003011#ifdef AF_VSOCK
3012 if (s->sock_family == AF_VSOCK) {
3013 PyErr_SetString(PyExc_OSError,
3014 "getsockopt string buffer not allowed");
3015 return NULL;
3016 }
3017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003019 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 "getsockopt buflen out of range");
3021 return NULL;
3022 }
3023 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3024 if (buf == NULL)
3025 return NULL;
3026 res = getsockopt(s->sock_fd, level, optname,
3027 (void *)PyBytes_AS_STRING(buf), &buflen);
3028 if (res < 0) {
3029 Py_DECREF(buf);
3030 return s->errorhandler();
3031 }
3032 _PyBytes_Resize(&buf, buflen);
3033 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003034}
3035
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003036PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003037"getsockopt(level, option[, buffersize]) -> value\n\
3038\n\
3039Get a socket option. See the Unix manual for level and option.\n\
3040If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003041string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003042
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003043
Fred Drake728819a2000-07-01 03:40:12 +00003044/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003045
Guido van Rossum73624e91994-10-10 17:59:00 +00003046static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003047sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 sock_addr_t addrbuf;
3050 int addrlen;
3051 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003052
Oren Milman735171e2018-09-11 19:51:29 +03003053 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003055 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003056
3057 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3058 return NULL;
3059 }
3060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 Py_BEGIN_ALLOW_THREADS
3062 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3063 Py_END_ALLOW_THREADS
3064 if (res < 0)
3065 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003066 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003067}
3068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003069PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003070"bind(address)\n\
3071\n\
3072Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003073pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003074sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003075
Guido van Rossum30a685f1991-06-27 15:51:29 +00003076
3077/* s.close() method.
3078 Set the file descriptor to -1 so operations tried subsequently
3079 will surely fail. */
3080
Guido van Rossum73624e91994-10-10 17:59:00 +00003081static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303082sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003085 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003086
Victor Stinner19a8e842016-03-21 16:36:48 +01003087 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003088 if (fd != INVALID_SOCKET) {
3089 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003090
3091 /* We do not want to retry upon EINTR: see
3092 http://lwn.net/Articles/576478/ and
3093 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3094 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003096 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003098 /* bpo-30319: The peer can already have closed the connection.
3099 Python ignores ECONNRESET on close(). */
3100 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003101 return s->errorhandler();
3102 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003104 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003105}
3106
Christian Heimesd0e31b92018-01-27 09:54:13 +01003107PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108"close()\n\
3109\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003110Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003111
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003112static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303113sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003114{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003115 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003116 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003117 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003118}
3119
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003120PyDoc_STRVAR(detach_doc,
3121"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003122\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003123Close the socket object without closing the underlying file descriptor.\n\
3124The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003125can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003126
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003127static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003128sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003129{
Victor Stinner81c41db2015-04-02 11:50:57 +02003130 int err;
3131 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003132
Victor Stinner81c41db2015-04-02 11:50:57 +02003133 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3134 /* getsockopt() failed */
3135 return 0;
3136 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003137
Victor Stinner81c41db2015-04-02 11:50:57 +02003138 if (err == EISCONN)
3139 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003140 if (err != 0) {
3141 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3142 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003143 return 0;
3144 }
3145 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003146}
3147
3148static int
3149internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3150 int raise)
3151{
3152 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003153
3154 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003156 Py_END_ALLOW_THREADS
3157
Victor Stinner70a46f62015-03-31 22:03:59 +02003158 if (!res) {
3159 /* connect() succeeded, the socket is connected */
3160 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003162
Victor Stinner81c41db2015-04-02 11:50:57 +02003163 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003164
Victor Stinner81c41db2015-04-02 11:50:57 +02003165 /* save error, PyErr_CheckSignals() can replace it */
3166 err = GET_SOCK_ERROR;
3167 if (CHECK_ERRNO(EINTR)) {
3168 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003169 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003170
3171 /* Issue #23618: when connect() fails with EINTR, the connection is
3172 running asynchronously.
3173
3174 If the socket is blocking or has a timeout, wait until the
3175 connection completes, fails or timed out using select(), and then
3176 get the connection status using getsockopt(SO_ERROR).
3177
3178 If the socket is non-blocking, raise InterruptedError. The caller is
3179 responsible to wait until the connection completes, fails or timed
3180 out (it's the case in asyncio for example). */
3181 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3182 }
3183 else {
3184 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3185 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003186 }
3187
Victor Stinner81c41db2015-04-02 11:50:57 +02003188 if (!wait_connect) {
3189 if (raise) {
3190 /* restore error, maybe replaced by PyErr_CheckSignals() */
3191 SET_SOCK_ERROR(err);
3192 s->errorhandler();
3193 return -1;
3194 }
3195 else
3196 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003197 }
3198
Victor Stinner81c41db2015-04-02 11:50:57 +02003199 if (raise) {
3200 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003201 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3202 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003203 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003204 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003205 else {
3206 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003207 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3208 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003209 return err;
3210 }
3211 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003212}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003213
Fred Drake728819a2000-07-01 03:40:12 +00003214/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003215
Guido van Rossum73624e91994-10-10 17:59:00 +00003216static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003217sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 sock_addr_t addrbuf;
3220 int addrlen;
3221 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003222
Oren Milman735171e2018-09-11 19:51:29 +03003223 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003226
Steve Dowerb82e17e2019-05-23 08:45:22 -07003227 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3228 return NULL;
3229 }
3230
Victor Stinner81c41db2015-04-02 11:50:57 +02003231 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003232 if (res < 0)
3233 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003234
Victor Stinneree699e92015-03-31 21:28:42 +02003235 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003236}
3237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003238PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003239"connect(address)\n\
3240\n\
3241Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003242is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003243
Guido van Rossum30a685f1991-06-27 15:51:29 +00003244
Fred Drake728819a2000-07-01 03:40:12 +00003245/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003246
3247static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003248sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 sock_addr_t addrbuf;
3251 int addrlen;
3252 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003253
Oren Milman735171e2018-09-11 19:51:29 +03003254 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003256 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003257
Steve Dowerb82e17e2019-05-23 08:45:22 -07003258 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3259 return NULL;
3260 }
3261
Victor Stinner81c41db2015-04-02 11:50:57 +02003262 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003263 if (res < 0)
3264 return NULL;
3265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003267}
3268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003270"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003271\n\
3272This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003273instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003274
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003275
Guido van Rossumed233a51992-06-23 09:07:03 +00003276/* s.fileno() method */
3277
Guido van Rossum73624e91994-10-10 17:59:00 +00003278static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303279sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003282}
3283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003284PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003285"fileno() -> integer\n\
3286\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003287Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003288
Guido van Rossumed233a51992-06-23 09:07:03 +00003289
Guido van Rossumc89705d1992-11-26 08:54:07 +00003290/* s.getsockname() method */
3291
Guido van Rossum73624e91994-10-10 17:59:00 +00003292static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303293sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 sock_addr_t addrbuf;
3296 int res;
3297 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 if (!getsockaddrlen(s, &addrlen))
3300 return NULL;
3301 memset(&addrbuf, 0, addrlen);
3302 Py_BEGIN_ALLOW_THREADS
3303 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3304 Py_END_ALLOW_THREADS
3305 if (res < 0)
3306 return s->errorhandler();
3307 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3308 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003309}
3310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003311PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003312"getsockname() -> address info\n\
3313\n\
3314Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003315info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003316
Guido van Rossumc89705d1992-11-26 08:54:07 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003319/* s.getpeername() method */
3320
Guido van Rossum73624e91994-10-10 17:59:00 +00003321static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303322sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 sock_addr_t addrbuf;
3325 int res;
3326 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (!getsockaddrlen(s, &addrlen))
3329 return NULL;
3330 memset(&addrbuf, 0, addrlen);
3331 Py_BEGIN_ALLOW_THREADS
3332 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3333 Py_END_ALLOW_THREADS
3334 if (res < 0)
3335 return s->errorhandler();
3336 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3337 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003338}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003340PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003341"getpeername() -> address info\n\
3342\n\
3343Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003344info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003345
Guido van Rossumb6775db1994-08-01 11:34:53 +00003346#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003347
3348
Guido van Rossum30a685f1991-06-27 15:51:29 +00003349/* s.listen(n) method */
3350
Guido van Rossum73624e91994-10-10 17:59:00 +00003351static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003352sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003353{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003354 /* We try to choose a default backlog high enough to avoid connection drops
3355 * for common workloads, yet not too high to limit resource usage. */
3356 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003358
Charles-François Natali644b8f52014-05-22 19:45:39 +01003359 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003363 /* To avoid problems on systems that don't allow a negative backlog
3364 * (which doesn't make sense anyway) we force a minimum value of 0. */
3365 if (backlog < 0)
3366 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 res = listen(s->sock_fd, backlog);
3368 Py_END_ALLOW_THREADS
3369 if (res < 0)
3370 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003371 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003372}
3373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003374PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003375"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003376\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003377Enable a server to accept connections. If backlog is specified, it must be\n\
3378at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003379unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003380connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003381
Victor Stinner31bf2d52015-04-01 21:57:09 +02003382struct sock_recv {
3383 char *cbuf;
3384 Py_ssize_t len;
3385 int flags;
3386 Py_ssize_t result;
3387};
3388
3389static int
3390sock_recv_impl(PySocketSockObject *s, void *data)
3391{
3392 struct sock_recv *ctx = data;
3393
3394#ifdef MS_WINDOWS
3395 if (ctx->len > INT_MAX)
3396 ctx->len = INT_MAX;
3397 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3398#else
3399 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3400#endif
3401 return (ctx->result >= 0);
3402}
3403
Guido van Rossum82a5c661998-07-07 20:45:43 +00003404
Thomas Wouters477c8d52006-05-27 19:21:47 +00003405/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003406 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003407 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003408 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003409 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003410 * also possible that we return a number of bytes smaller than the request
3411 * bytes.
3412 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003413
Antoine Pitrou19467d22010-08-17 19:33:30 +00003414static Py_ssize_t
3415sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003416{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003417 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 if (!IS_SELECTABLE(s)) {
3420 select_error();
3421 return -1;
3422 }
3423 if (len == 0) {
3424 /* If 0 bytes were requested, do nothing. */
3425 return 0;
3426 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003427
Victor Stinner31bf2d52015-04-01 21:57:09 +02003428 ctx.cbuf = cbuf;
3429 ctx.len = len;
3430 ctx.flags = flags;
3431 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003433
3434 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003435}
3436
Guido van Rossum48a680c2001-03-02 06:34:14 +00003437
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003438/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003439
Guido van Rossum73624e91994-10-10 17:59:00 +00003440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003441sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003442{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003443 Py_ssize_t recvlen, outlen;
3444 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003446
Antoine Pitrou19467d22010-08-17 19:33:30 +00003447 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 if (recvlen < 0) {
3451 PyErr_SetString(PyExc_ValueError,
3452 "negative buffersize in recv");
3453 return NULL;
3454 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 /* Allocate a new string. */
3457 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3458 if (buf == NULL)
3459 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 /* Call the guts */
3462 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3463 if (outlen < 0) {
3464 /* An error occurred, release the string and return an
3465 error. */
3466 Py_DECREF(buf);
3467 return NULL;
3468 }
3469 if (outlen != recvlen) {
3470 /* We did not read as many bytes as we anticipated, resize the
3471 string if possible and be successful. */
3472 _PyBytes_Resize(&buf, outlen);
3473 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003476}
3477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003478PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003479"recv(buffersize[, flags]) -> data\n\
3480\n\
3481Receive up to buffersize bytes from the socket. For the optional flags\n\
3482argument, see the Unix manual. When no data is available, block until\n\
3483at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003484the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003485
Guido van Rossum30a685f1991-06-27 15:51:29 +00003486
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003487/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003488
Thomas Wouters477c8d52006-05-27 19:21:47 +00003489static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003490sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003493
Antoine Pitrou19467d22010-08-17 19:33:30 +00003494 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 Py_buffer pbuf;
3496 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003497 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003500 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 &pbuf, &recvlen, &flags))
3502 return NULL;
3503 buf = pbuf.buf;
3504 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 if (recvlen < 0) {
3507 PyBuffer_Release(&pbuf);
3508 PyErr_SetString(PyExc_ValueError,
3509 "negative buffersize in recv_into");
3510 return NULL;
3511 }
3512 if (recvlen == 0) {
3513 /* If nbytes was not specified, use the buffer's length */
3514 recvlen = buflen;
3515 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003517 /* Check if the buffer is large enough */
3518 if (buflen < recvlen) {
3519 PyBuffer_Release(&pbuf);
3520 PyErr_SetString(PyExc_ValueError,
3521 "buffer too small for requested bytes");
3522 return NULL;
3523 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 /* Call the guts */
3526 readlen = sock_recv_guts(s, buf, recvlen, flags);
3527 if (readlen < 0) {
3528 /* Return an error. */
3529 PyBuffer_Release(&pbuf);
3530 return NULL;
3531 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 PyBuffer_Release(&pbuf);
3534 /* Return the number of bytes read. Note that we do not do anything
3535 special here in the case that readlen < recvlen. */
3536 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003537}
3538
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003539PyDoc_STRVAR(recv_into_doc,
3540"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003541\n\
oldkaa0735f2018-02-02 16:52:55 +08003542A version of recv() that stores its data into a buffer rather than creating\n\
3543a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003544is not specified (or 0), receive up to the size available in the given buffer.\n\
3545\n\
3546See recv() for documentation about the flags.");
3547
Victor Stinner31bf2d52015-04-01 21:57:09 +02003548struct sock_recvfrom {
3549 char* cbuf;
3550 Py_ssize_t len;
3551 int flags;
3552 socklen_t *addrlen;
3553 sock_addr_t *addrbuf;
3554 Py_ssize_t result;
3555};
3556
3557static int
3558sock_recvfrom_impl(PySocketSockObject *s, void *data)
3559{
3560 struct sock_recvfrom *ctx = data;
3561
3562 memset(ctx->addrbuf, 0, *ctx->addrlen);
3563
3564#ifdef MS_WINDOWS
3565 if (ctx->len > INT_MAX)
3566 ctx->len = INT_MAX;
3567 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3568 SAS2SA(ctx->addrbuf), ctx->addrlen);
3569#else
3570 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3571 SAS2SA(ctx->addrbuf), ctx->addrlen);
3572#endif
3573 return (ctx->result >= 0);
3574}
3575
Thomas Wouters477c8d52006-05-27 19:21:47 +00003576
3577/*
Christian Heimes99170a52007-12-19 02:07:34 +00003578 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3579 * into a char buffer. If you have any inc/def ref to do to the objects that
3580 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003581 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003582 * that it is also possible that we return a number of bytes smaller than the
3583 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003584 *
3585 * 'addr' is a return value for the address object. Note that you must decref
3586 * it yourself.
3587 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003588static Py_ssize_t
3589sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003594 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 if (!getsockaddrlen(s, &addrlen))
3599 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 if (!IS_SELECTABLE(s)) {
3602 select_error();
3603 return -1;
3604 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003605
Victor Stinner31bf2d52015-04-01 21:57:09 +02003606 ctx.cbuf = cbuf;
3607 ctx.len = len;
3608 ctx.flags = flags;
3609 ctx.addrbuf = &addrbuf;
3610 ctx.addrlen = &addrlen;
3611 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003612 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003613
Victor Stinner31bf2d52015-04-01 21:57:09 +02003614 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3615 s->sock_proto);
3616 if (*addr == NULL)
3617 return -1;
3618
3619 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003620}
3621
3622/* s.recvfrom(nbytes [,flags]) method */
3623
3624static PyObject *
3625sock_recvfrom(PySocketSockObject *s, PyObject *args)
3626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003627 PyObject *buf = NULL;
3628 PyObject *addr = NULL;
3629 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003630 int flags = 0;
3631 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003632
Antoine Pitrou19467d22010-08-17 19:33:30 +00003633 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 if (recvlen < 0) {
3637 PyErr_SetString(PyExc_ValueError,
3638 "negative buffersize in recvfrom");
3639 return NULL;
3640 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003642 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3643 if (buf == NULL)
3644 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3647 recvlen, flags, &addr);
3648 if (outlen < 0) {
3649 goto finally;
3650 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 if (outlen != recvlen) {
3653 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003654 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003656 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 goto finally;
3658 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003661
3662finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 Py_XDECREF(buf);
3664 Py_XDECREF(addr);
3665 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003666}
3667
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003668PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003669"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3670\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003671Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003672
Thomas Wouters477c8d52006-05-27 19:21:47 +00003673
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003674/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003675
3676static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003677sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003680
Antoine Pitrou19467d22010-08-17 19:33:30 +00003681 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 Py_buffer pbuf;
3683 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003684 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003687
Antoine Pitrou19467d22010-08-17 19:33:30 +00003688 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 kwlist, &pbuf,
3690 &recvlen, &flags))
3691 return NULL;
3692 buf = pbuf.buf;
3693 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 if (recvlen < 0) {
3696 PyBuffer_Release(&pbuf);
3697 PyErr_SetString(PyExc_ValueError,
3698 "negative buffersize in recvfrom_into");
3699 return NULL;
3700 }
3701 if (recvlen == 0) {
3702 /* If nbytes was not specified, use the buffer's length */
3703 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003704 } else if (recvlen > buflen) {
3705 PyBuffer_Release(&pbuf);
3706 PyErr_SetString(PyExc_ValueError,
3707 "nbytes is greater than the length of the buffer");
3708 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003711 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3712 if (readlen < 0) {
3713 PyBuffer_Release(&pbuf);
3714 /* Return an error */
3715 Py_XDECREF(addr);
3716 return NULL;
3717 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 PyBuffer_Release(&pbuf);
3720 /* Return the number of bytes read and the address. Note that we do
3721 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003722 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003723}
3724
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003725PyDoc_STRVAR(recvfrom_into_doc,
3726"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003727\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003728Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003729
Victor Stinner35bee932015-04-02 12:28:07 +02003730/* The sendmsg() and recvmsg[_into]() methods require a working
3731 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3732#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003733struct sock_recvmsg {
3734 struct msghdr *msg;
3735 int flags;
3736 ssize_t result;
3737};
3738
3739static int
3740sock_recvmsg_impl(PySocketSockObject *s, void *data)
3741{
3742 struct sock_recvmsg *ctx = data;
3743
3744 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3745 return (ctx->result >= 0);
3746}
3747
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003748/*
3749 * Call recvmsg() with the supplied iovec structures, flags, and
3750 * ancillary data buffer size (controllen). Returns the tuple return
3751 * value for recvmsg() or recvmsg_into(), with the first item provided
3752 * by the supplied makeval() function. makeval() will be called with
3753 * the length read and makeval_data as arguments, and must return a
3754 * new reference (which will be decrefed if there is a subsequent
3755 * error). On error, closes any file descriptors received via
3756 * SCM_RIGHTS.
3757 */
3758static PyObject *
3759sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3760 int flags, Py_ssize_t controllen,
3761 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3762{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 sock_addr_t addrbuf;
3764 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003765 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003766 PyObject *cmsg_list = NULL, *retval = NULL;
3767 void *controlbuf = NULL;
3768 struct cmsghdr *cmsgh;
3769 size_t cmsgdatalen = 0;
3770 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003771 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003772
3773 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3774 ignored" when the socket is connected (Linux fills them in
3775 anyway for AF_UNIX sockets at least). Normally msg_namelen
3776 seems to be set to 0 if there's no address, but try to
3777 initialize msg_name to something that won't be mistaken for a
3778 real address if that doesn't happen. */
3779 if (!getsockaddrlen(s, &addrbuflen))
3780 return NULL;
3781 memset(&addrbuf, 0, addrbuflen);
3782 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3783
3784 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3785 PyErr_SetString(PyExc_ValueError,
3786 "invalid ancillary data buffer length");
3787 return NULL;
3788 }
3789 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3790 return PyErr_NoMemory();
3791
3792 /* Make the system call. */
3793 if (!IS_SELECTABLE(s)) {
3794 select_error();
3795 goto finally;
3796 }
3797
Victor Stinner31bf2d52015-04-01 21:57:09 +02003798 msg.msg_name = SAS2SA(&addrbuf);
3799 msg.msg_namelen = addrbuflen;
3800 msg.msg_iov = iov;
3801 msg.msg_iovlen = iovlen;
3802 msg.msg_control = controlbuf;
3803 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003804
Victor Stinner31bf2d52015-04-01 21:57:09 +02003805 ctx.msg = &msg;
3806 ctx.flags = flags;
3807 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003808 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003809
3810 /* Make list of (level, type, data) tuples from control messages. */
3811 if ((cmsg_list = PyList_New(0)) == NULL)
3812 goto err_closefds;
3813 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3814 implementations didn't do so. */
3815 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3816 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3817 PyObject *bytes, *tuple;
3818 int tmp;
3819
3820 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3821 if (cmsg_status != 0) {
3822 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3823 "received malformed or improperly-truncated "
3824 "ancillary data", 1) == -1)
3825 goto err_closefds;
3826 }
3827 if (cmsg_status < 0)
3828 break;
3829 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003830 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003831 goto err_closefds;
3832 }
3833
3834 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3835 cmsgdatalen);
3836 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3837 (int)cmsgh->cmsg_type, bytes);
3838 if (tuple == NULL)
3839 goto err_closefds;
3840 tmp = PyList_Append(cmsg_list, tuple);
3841 Py_DECREF(tuple);
3842 if (tmp != 0)
3843 goto err_closefds;
3844
3845 if (cmsg_status != 0)
3846 break;
3847 }
3848
3849 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003850 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003851 cmsg_list,
3852 (int)msg.msg_flags,
3853 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3854 ((msg.msg_namelen > addrbuflen) ?
3855 addrbuflen : msg.msg_namelen),
3856 s->sock_proto));
3857 if (retval == NULL)
3858 goto err_closefds;
3859
3860finally:
3861 Py_XDECREF(cmsg_list);
3862 PyMem_Free(controlbuf);
3863 return retval;
3864
3865err_closefds:
3866#ifdef SCM_RIGHTS
3867 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3868 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3869 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3870 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3871 if (cmsg_status < 0)
3872 break;
3873 if (cmsgh->cmsg_level == SOL_SOCKET &&
3874 cmsgh->cmsg_type == SCM_RIGHTS) {
3875 size_t numfds;
3876 int *fdp;
3877
3878 numfds = cmsgdatalen / sizeof(int);
3879 fdp = (int *)CMSG_DATA(cmsgh);
3880 while (numfds-- > 0)
3881 close(*fdp++);
3882 }
3883 if (cmsg_status != 0)
3884 break;
3885 }
3886#endif /* SCM_RIGHTS */
3887 goto finally;
3888}
3889
3890
3891static PyObject *
3892makeval_recvmsg(ssize_t received, void *data)
3893{
3894 PyObject **buf = data;
3895
3896 if (received < PyBytes_GET_SIZE(*buf))
3897 _PyBytes_Resize(buf, received);
3898 Py_XINCREF(*buf);
3899 return *buf;
3900}
3901
3902/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3903
3904static PyObject *
3905sock_recvmsg(PySocketSockObject *s, PyObject *args)
3906{
3907 Py_ssize_t bufsize, ancbufsize = 0;
3908 int flags = 0;
3909 struct iovec iov;
3910 PyObject *buf = NULL, *retval = NULL;
3911
3912 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3913 return NULL;
3914
3915 if (bufsize < 0) {
3916 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3917 return NULL;
3918 }
3919 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3920 return NULL;
3921 iov.iov_base = PyBytes_AS_STRING(buf);
3922 iov.iov_len = bufsize;
3923
3924 /* Note that we're passing a pointer to *our pointer* to the bytes
3925 object here (&buf); makeval_recvmsg() may incref the object, or
3926 deallocate it and set our pointer to NULL. */
3927 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3928 &makeval_recvmsg, &buf);
3929 Py_XDECREF(buf);
3930 return retval;
3931}
3932
3933PyDoc_STRVAR(recvmsg_doc,
3934"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3935\n\
3936Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3937socket. The ancbufsize argument sets the size in bytes of the\n\
3938internal buffer used to receive the ancillary data; it defaults to 0,\n\
3939meaning that no ancillary data will be received. Appropriate buffer\n\
3940sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3941CMSG_LEN(), and items which do not fit into the buffer might be\n\
3942truncated or discarded. The flags argument defaults to 0 and has the\n\
3943same meaning as for recv().\n\
3944\n\
3945The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3946The data item is a bytes object holding the non-ancillary data\n\
3947received. The ancdata item is a list of zero or more tuples\n\
3948(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3949(control messages) received: cmsg_level and cmsg_type are integers\n\
3950specifying the protocol level and protocol-specific type respectively,\n\
3951and cmsg_data is a bytes object holding the associated data. The\n\
3952msg_flags item is the bitwise OR of various flags indicating\n\
3953conditions on the received message; see your system documentation for\n\
3954details. If the receiving socket is unconnected, address is the\n\
3955address of the sending socket, if available; otherwise, its value is\n\
3956unspecified.\n\
3957\n\
3958If recvmsg() raises an exception after the system call returns, it\n\
3959will first attempt to close any file descriptors received via the\n\
3960SCM_RIGHTS mechanism.");
3961
3962
3963static PyObject *
3964makeval_recvmsg_into(ssize_t received, void *data)
3965{
3966 return PyLong_FromSsize_t(received);
3967}
3968
3969/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3970
3971static PyObject *
3972sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3973{
3974 Py_ssize_t ancbufsize = 0;
3975 int flags = 0;
3976 struct iovec *iovs = NULL;
3977 Py_ssize_t i, nitems, nbufs = 0;
3978 Py_buffer *bufs = NULL;
3979 PyObject *buffers_arg, *fast, *retval = NULL;
3980
3981 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3982 &buffers_arg, &ancbufsize, &flags))
3983 return NULL;
3984
3985 if ((fast = PySequence_Fast(buffers_arg,
3986 "recvmsg_into() argument 1 must be an "
3987 "iterable")) == NULL)
3988 return NULL;
3989 nitems = PySequence_Fast_GET_SIZE(fast);
3990 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003991 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003992 goto finally;
3993 }
3994
3995 /* Fill in an iovec for each item, and save the Py_buffer
3996 structs to release afterwards. */
3997 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3998 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3999 PyErr_NoMemory();
4000 goto finally;
4001 }
4002 for (; nbufs < nitems; nbufs++) {
4003 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4004 "w*;recvmsg_into() argument 1 must be an iterable "
4005 "of single-segment read-write buffers",
4006 &bufs[nbufs]))
4007 goto finally;
4008 iovs[nbufs].iov_base = bufs[nbufs].buf;
4009 iovs[nbufs].iov_len = bufs[nbufs].len;
4010 }
4011
4012 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4013 &makeval_recvmsg_into, NULL);
4014finally:
4015 for (i = 0; i < nbufs; i++)
4016 PyBuffer_Release(&bufs[i]);
4017 PyMem_Free(bufs);
4018 PyMem_Free(iovs);
4019 Py_DECREF(fast);
4020 return retval;
4021}
4022
4023PyDoc_STRVAR(recvmsg_into_doc,
4024"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4025\n\
4026Receive normal data and ancillary data from the socket, scattering the\n\
4027non-ancillary data into a series of buffers. The buffers argument\n\
4028must be an iterable of objects that export writable buffers\n\
4029(e.g. bytearray objects); these will be filled with successive chunks\n\
4030of the non-ancillary data until it has all been written or there are\n\
4031no more buffers. The ancbufsize argument sets the size in bytes of\n\
4032the internal buffer used to receive the ancillary data; it defaults to\n\
40330, meaning that no ancillary data will be received. Appropriate\n\
4034buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4035or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4036truncated or discarded. The flags argument defaults to 0 and has the\n\
4037same meaning as for recv().\n\
4038\n\
4039The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4040The nbytes item is the total number of bytes of non-ancillary data\n\
4041written into the buffers. The ancdata item is a list of zero or more\n\
4042tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4043data (control messages) received: cmsg_level and cmsg_type are\n\
4044integers specifying the protocol level and protocol-specific type\n\
4045respectively, and cmsg_data is a bytes object holding the associated\n\
4046data. The msg_flags item is the bitwise OR of various flags\n\
4047indicating conditions on the received message; see your system\n\
4048documentation for details. If the receiving socket is unconnected,\n\
4049address is the address of the sending socket, if available; otherwise,\n\
4050its value is unspecified.\n\
4051\n\
4052If recvmsg_into() raises an exception after the system call returns,\n\
4053it will first attempt to close any file descriptors received via the\n\
4054SCM_RIGHTS mechanism.");
4055#endif /* CMSG_LEN */
4056
4057
Victor Stinner31bf2d52015-04-01 21:57:09 +02004058struct sock_send {
4059 char *buf;
4060 Py_ssize_t len;
4061 int flags;
4062 Py_ssize_t result;
4063};
4064
4065static int
4066sock_send_impl(PySocketSockObject *s, void *data)
4067{
4068 struct sock_send *ctx = data;
4069
4070#ifdef MS_WINDOWS
4071 if (ctx->len > INT_MAX)
4072 ctx->len = INT_MAX;
4073 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4074#else
4075 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4076#endif
4077 return (ctx->result >= 0);
4078}
4079
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004080/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004081
Guido van Rossum73624e91994-10-10 17:59:00 +00004082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004083sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004084{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004085 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004087 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4090 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 if (!IS_SELECTABLE(s)) {
4093 PyBuffer_Release(&pbuf);
4094 return select_error();
4095 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004096 ctx.buf = pbuf.buf;
4097 ctx.len = pbuf.len;
4098 ctx.flags = flags;
4099 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004100 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 return NULL;
4102 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004103 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004104
4105 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004106}
4107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004108PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004109"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004110\n\
4111Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004112argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004113sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004114
4115
4116/* s.sendall(data [,flags]) method */
4117
4118static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004119sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004122 Py_ssize_t len, n;
4123 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004125 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004126 int has_timeout = (s->sock_timeout > 0);
4127 _PyTime_t interval = s->sock_timeout;
4128 _PyTime_t deadline = 0;
4129 int deadline_initialized = 0;
4130 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4133 return NULL;
4134 buf = pbuf.buf;
4135 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 if (!IS_SELECTABLE(s)) {
4138 PyBuffer_Release(&pbuf);
4139 return select_error();
4140 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004143 if (has_timeout) {
4144 if (deadline_initialized) {
4145 /* recompute the timeout */
4146 interval = deadline - _PyTime_GetMonotonicClock();
4147 }
4148 else {
4149 deadline_initialized = 1;
4150 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4151 }
4152
4153 if (interval <= 0) {
4154 PyErr_SetString(socket_timeout, "timed out");
4155 goto done;
4156 }
4157 }
4158
Victor Stinner02f32ab2015-04-01 22:53:26 +02004159 ctx.buf = buf;
4160 ctx.len = len;
4161 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004162 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4163 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004164 n = ctx.result;
4165 assert(n >= 0);
4166
4167 buf += n;
4168 len -= n;
4169
4170 /* We must run our signal handlers before looping again.
4171 send() can return a successful partial write when it is
4172 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004173 if (PyErr_CheckSignals())
4174 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004175 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004177
Victor Stinner8912d142015-04-06 23:16:34 +02004178 Py_INCREF(Py_None);
4179 res = Py_None;
4180
4181done:
4182 PyBuffer_Release(&pbuf);
4183 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004184}
4185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004186PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004187"sendall(data[, flags])\n\
4188\n\
4189Send a data string to the socket. For the optional flags\n\
4190argument, see the Unix manual. This calls send() repeatedly\n\
4191until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004192to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004193
Guido van Rossum30a685f1991-06-27 15:51:29 +00004194
Victor Stinner31bf2d52015-04-01 21:57:09 +02004195struct sock_sendto {
4196 char *buf;
4197 Py_ssize_t len;
4198 int flags;
4199 int addrlen;
4200 sock_addr_t *addrbuf;
4201 Py_ssize_t result;
4202};
4203
4204static int
4205sock_sendto_impl(PySocketSockObject *s, void *data)
4206{
4207 struct sock_sendto *ctx = data;
4208
4209#ifdef MS_WINDOWS
4210 if (ctx->len > INT_MAX)
4211 ctx->len = INT_MAX;
4212 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4213 SAS2SA(ctx->addrbuf), ctx->addrlen);
4214#else
4215 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4216 SAS2SA(ctx->addrbuf), ctx->addrlen);
4217#endif
4218 return (ctx->result >= 0);
4219}
4220
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004221/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004222
Guido van Rossum73624e91994-10-10 17:59:00 +00004223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004224sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 Py_buffer pbuf;
4227 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004228 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004230 int addrlen, flags;
4231 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004234 arglen = PyTuple_Size(args);
4235 switch (arglen) {
4236 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004237 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4238 return NULL;
4239 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004240 break;
4241 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004242 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4243 &pbuf, &flags, &addro)) {
4244 return NULL;
4245 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004246 break;
4247 default:
4248 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004249 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004250 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004251 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 if (!IS_SELECTABLE(s)) {
4255 PyBuffer_Release(&pbuf);
4256 return select_error();
4257 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004258
Oren Milman735171e2018-09-11 19:51:29 +03004259 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 PyBuffer_Release(&pbuf);
4261 return NULL;
4262 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004263
Steve Dowerb82e17e2019-05-23 08:45:22 -07004264 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4265 return NULL;
4266 }
4267
Victor Stinner31bf2d52015-04-01 21:57:09 +02004268 ctx.buf = pbuf.buf;
4269 ctx.len = pbuf.len;
4270 ctx.flags = flags;
4271 ctx.addrlen = addrlen;
4272 ctx.addrbuf = &addrbuf;
4273 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004274 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 return NULL;
4276 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004277 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004278
4279 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004280}
4281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004282PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004283"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004284\n\
4285Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004286For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004287
Guido van Rossum30a685f1991-06-27 15:51:29 +00004288
Victor Stinner35bee932015-04-02 12:28:07 +02004289/* The sendmsg() and recvmsg[_into]() methods require a working
4290 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4291#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004292struct sock_sendmsg {
4293 struct msghdr *msg;
4294 int flags;
4295 ssize_t result;
4296};
4297
4298static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004299sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4300 struct msghdr *msg,
4301 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4302 Py_ssize_t ndataparts, ndatabufs = 0;
4303 int result = -1;
4304 struct iovec *iovs = NULL;
4305 PyObject *data_fast = NULL;
4306 Py_buffer *databufs = NULL;
4307
4308 /* Fill in an iovec for each message part, and save the Py_buffer
4309 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004310 data_fast = PySequence_Fast(data_arg,
4311 "sendmsg() argument 1 must be an "
4312 "iterable");
4313 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004314 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004315 }
4316
Christian Heimesdffa3942016-09-05 23:54:41 +02004317 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4318 if (ndataparts > INT_MAX) {
4319 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4320 goto finally;
4321 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004322
Christian Heimesdffa3942016-09-05 23:54:41 +02004323 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004324 if (ndataparts > 0) {
4325 iovs = PyMem_New(struct iovec, ndataparts);
4326 if (iovs == NULL) {
4327 PyErr_NoMemory();
4328 goto finally;
4329 }
4330 msg->msg_iov = iovs;
4331
4332 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004333 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004334 PyErr_NoMemory();
4335 goto finally;
4336 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004337 }
4338 for (; ndatabufs < ndataparts; ndatabufs++) {
4339 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4340 "y*;sendmsg() argument 1 must be an iterable of "
4341 "bytes-like objects",
4342 &databufs[ndatabufs]))
4343 goto finally;
4344 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4345 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4346 }
4347 result = 0;
4348 finally:
4349 *databufsout = databufs;
4350 *ndatabufsout = ndatabufs;
4351 Py_XDECREF(data_fast);
4352 return result;
4353}
4354
4355static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004356sock_sendmsg_impl(PySocketSockObject *s, void *data)
4357{
4358 struct sock_sendmsg *ctx = data;
4359
4360 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4361 return (ctx->result >= 0);
4362}
4363
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004364/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4365
4366static PyObject *
4367sock_sendmsg(PySocketSockObject *s, PyObject *args)
4368{
Christian Heimesdffa3942016-09-05 23:54:41 +02004369 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004370 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004371 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004372 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004373 struct cmsginfo {
4374 int level;
4375 int type;
4376 Py_buffer data;
4377 } *cmsgs = NULL;
4378 void *controlbuf = NULL;
4379 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004380 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004381 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004382 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004383 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384
4385 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004386 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004387 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004388 }
4389
4390 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004391
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004392 /* Parse destination address. */
4393 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004394 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4395 "sendmsg"))
4396 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004397 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004398 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004399 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4400 return NULL;
4401 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004402 msg.msg_name = &addrbuf;
4403 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004404 } else {
4405 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4406 return NULL;
4407 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004408 }
4409
4410 /* Fill in an iovec for each message part, and save the Py_buffer
4411 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004412 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004413 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004414 }
4415
4416 if (cmsg_arg == NULL)
4417 ncmsgs = 0;
4418 else {
4419 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4420 "sendmsg() argument 2 must be an "
4421 "iterable")) == NULL)
4422 goto finally;
4423 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4424 }
4425
4426#ifndef CMSG_SPACE
4427 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004428 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004429 "sending multiple control messages is not supported "
4430 "on this system");
4431 goto finally;
4432 }
4433#endif
4434 /* Save level, type and Py_buffer for each control message,
4435 and calculate total size. */
4436 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4437 PyErr_NoMemory();
4438 goto finally;
4439 }
4440 controllen = controllen_last = 0;
4441 while (ncmsgbufs < ncmsgs) {
4442 size_t bufsize, space;
4443
4444 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4445 "(iiy*):[sendmsg() ancillary data items]",
4446 &cmsgs[ncmsgbufs].level,
4447 &cmsgs[ncmsgbufs].type,
4448 &cmsgs[ncmsgbufs].data))
4449 goto finally;
4450 bufsize = cmsgs[ncmsgbufs++].data.len;
4451
4452#ifdef CMSG_SPACE
4453 if (!get_CMSG_SPACE(bufsize, &space)) {
4454#else
4455 if (!get_CMSG_LEN(bufsize, &space)) {
4456#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004457 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004458 goto finally;
4459 }
4460 controllen += space;
4461 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004462 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004463 goto finally;
4464 }
4465 controllen_last = controllen;
4466 }
4467
4468 /* Construct ancillary data block from control message info. */
4469 if (ncmsgbufs > 0) {
4470 struct cmsghdr *cmsgh = NULL;
4471
Victor Stinner52d61e42016-09-12 11:41:58 +02004472 controlbuf = PyMem_Malloc(controllen);
4473 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004474 PyErr_NoMemory();
4475 goto finally;
4476 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004477 msg.msg_control = controlbuf;
4478
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004479 msg.msg_controllen = controllen;
4480
4481 /* Need to zero out the buffer as a workaround for glibc's
4482 CMSG_NXTHDR() implementation. After getting the pointer to
4483 the next header, it checks its (uninitialized) cmsg_len
4484 member to see if the "message" fits in the buffer, and
4485 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004486 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004487 memset(controlbuf, 0, controllen);
4488
4489 for (i = 0; i < ncmsgbufs; i++) {
4490 size_t msg_len, data_len = cmsgs[i].data.len;
4491 int enough_space = 0;
4492
4493 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4494 if (cmsgh == NULL) {
4495 PyErr_Format(PyExc_RuntimeError,
4496 "unexpected NULL result from %s()",
4497 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4498 goto finally;
4499 }
4500 if (!get_CMSG_LEN(data_len, &msg_len)) {
4501 PyErr_SetString(PyExc_RuntimeError,
4502 "item size out of range for CMSG_LEN()");
4503 goto finally;
4504 }
4505 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4506 size_t space;
4507
4508 cmsgh->cmsg_len = msg_len;
4509 if (get_cmsg_data_space(&msg, cmsgh, &space))
4510 enough_space = (space >= data_len);
4511 }
4512 if (!enough_space) {
4513 PyErr_SetString(PyExc_RuntimeError,
4514 "ancillary data does not fit in calculated "
4515 "space");
4516 goto finally;
4517 }
4518 cmsgh->cmsg_level = cmsgs[i].level;
4519 cmsgh->cmsg_type = cmsgs[i].type;
4520 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4521 }
4522 }
4523
4524 /* Make the system call. */
4525 if (!IS_SELECTABLE(s)) {
4526 select_error();
4527 goto finally;
4528 }
4529
Victor Stinner31bf2d52015-04-01 21:57:09 +02004530 ctx.msg = &msg;
4531 ctx.flags = flags;
4532 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004533 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004534
4535 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004536
4537finally:
4538 PyMem_Free(controlbuf);
4539 for (i = 0; i < ncmsgbufs; i++)
4540 PyBuffer_Release(&cmsgs[i].data);
4541 PyMem_Free(cmsgs);
4542 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004543 PyMem_Free(msg.msg_iov);
4544 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004545 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004546 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004547 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004548 return retval;
4549}
4550
4551PyDoc_STRVAR(sendmsg_doc,
4552"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4553\n\
4554Send normal and ancillary data to the socket, gathering the\n\
4555non-ancillary data from a series of buffers and concatenating it into\n\
4556a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004557data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004558The ancdata argument specifies the ancillary data (control messages)\n\
4559as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4560cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4561protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004562is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004563argument defaults to 0 and has the same meaning as for send(). If\n\
4564address is supplied and not None, it sets a destination address for\n\
4565the message. The return value is the number of bytes of non-ancillary\n\
4566data sent.");
4567#endif /* CMSG_LEN */
4568
Christian Heimesdffa3942016-09-05 23:54:41 +02004569#ifdef HAVE_SOCKADDR_ALG
4570static PyObject*
4571sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4572{
4573 PyObject *retval = NULL;
4574
4575 Py_ssize_t i, ndatabufs = 0;
4576 Py_buffer *databufs = NULL;
4577 PyObject *data_arg = NULL;
4578
4579 Py_buffer iv = {NULL, NULL};
4580
4581 PyObject *opobj = NULL;
4582 int op = -1;
4583
4584 PyObject *assoclenobj = NULL;
4585 int assoclen = -1;
4586
4587 unsigned int *uiptr;
4588 int flags = 0;
4589
4590 struct msghdr msg;
4591 struct cmsghdr *header = NULL;
4592 struct af_alg_iv *alg_iv = NULL;
4593 struct sock_sendmsg ctx;
4594 Py_ssize_t controllen;
4595 void *controlbuf = NULL;
4596 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4597
4598 if (self->sock_family != AF_ALG) {
4599 PyErr_SetString(PyExc_OSError,
4600 "algset is only supported for AF_ALG");
4601 return NULL;
4602 }
4603
4604 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4605 "|O$O!y*O!i:sendmsg_afalg", keywords,
4606 &data_arg,
4607 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004608 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004609 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004610 }
4611
4612 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004613
4614 /* op is a required, keyword-only argument >= 0 */
4615 if (opobj != NULL) {
4616 op = _PyLong_AsInt(opobj);
4617 }
4618 if (op < 0) {
4619 /* override exception from _PyLong_AsInt() */
4620 PyErr_SetString(PyExc_TypeError,
4621 "Invalid or missing argument 'op'");
4622 goto finally;
4623 }
4624 /* assoclen is optional but must be >= 0 */
4625 if (assoclenobj != NULL) {
4626 assoclen = _PyLong_AsInt(assoclenobj);
4627 if (assoclen == -1 && PyErr_Occurred()) {
4628 goto finally;
4629 }
4630 if (assoclen < 0) {
4631 PyErr_SetString(PyExc_TypeError,
4632 "assoclen must be positive");
4633 goto finally;
4634 }
4635 }
4636
4637 controllen = CMSG_SPACE(4);
4638 if (iv.buf != NULL) {
4639 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4640 }
4641 if (assoclen >= 0) {
4642 controllen += CMSG_SPACE(4);
4643 }
4644
4645 controlbuf = PyMem_Malloc(controllen);
4646 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004647 PyErr_NoMemory();
4648 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004649 }
4650 memset(controlbuf, 0, controllen);
4651
Christian Heimesdffa3942016-09-05 23:54:41 +02004652 msg.msg_controllen = controllen;
4653 msg.msg_control = controlbuf;
4654
4655 /* Fill in an iovec for each message part, and save the Py_buffer
4656 structs to release afterwards. */
4657 if (data_arg != NULL) {
4658 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4659 goto finally;
4660 }
4661 }
4662
4663 /* set operation to encrypt or decrypt */
4664 header = CMSG_FIRSTHDR(&msg);
4665 if (header == NULL) {
4666 PyErr_SetString(PyExc_RuntimeError,
4667 "unexpected NULL result from CMSG_FIRSTHDR");
4668 goto finally;
4669 }
4670 header->cmsg_level = SOL_ALG;
4671 header->cmsg_type = ALG_SET_OP;
4672 header->cmsg_len = CMSG_LEN(4);
4673 uiptr = (void*)CMSG_DATA(header);
4674 *uiptr = (unsigned int)op;
4675
4676 /* set initialization vector */
4677 if (iv.buf != NULL) {
4678 header = CMSG_NXTHDR(&msg, header);
4679 if (header == NULL) {
4680 PyErr_SetString(PyExc_RuntimeError,
4681 "unexpected NULL result from CMSG_NXTHDR(iv)");
4682 goto finally;
4683 }
4684 header->cmsg_level = SOL_ALG;
4685 header->cmsg_type = ALG_SET_IV;
4686 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4687 alg_iv = (void*)CMSG_DATA(header);
4688 alg_iv->ivlen = iv.len;
4689 memcpy(alg_iv->iv, iv.buf, iv.len);
4690 }
4691
4692 /* set length of associated data for AEAD */
4693 if (assoclen >= 0) {
4694 header = CMSG_NXTHDR(&msg, header);
4695 if (header == NULL) {
4696 PyErr_SetString(PyExc_RuntimeError,
4697 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4698 goto finally;
4699 }
4700 header->cmsg_level = SOL_ALG;
4701 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4702 header->cmsg_len = CMSG_LEN(4);
4703 uiptr = (void*)CMSG_DATA(header);
4704 *uiptr = (unsigned int)assoclen;
4705 }
4706
4707 ctx.msg = &msg;
4708 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004709 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004710 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004711 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004712
4713 retval = PyLong_FromSsize_t(ctx.result);
4714
4715 finally:
4716 PyMem_Free(controlbuf);
4717 if (iv.buf != NULL) {
4718 PyBuffer_Release(&iv);
4719 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004720 PyMem_Free(msg.msg_iov);
4721 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004722 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004723 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004724 PyMem_Free(databufs);
4725 return retval;
4726}
4727
4728PyDoc_STRVAR(sendmsg_afalg_doc,
4729"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4730\n\
4731Set operation mode, IV and length of associated data for an AF_ALG\n\
4732operation socket.");
4733#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004734
Guido van Rossum30a685f1991-06-27 15:51:29 +00004735/* s.shutdown(how) method */
4736
Guido van Rossum73624e91994-10-10 17:59:00 +00004737static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004738sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 int how;
4741 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004742
Serhiy Storchaka78980432013-01-15 01:12:17 +02004743 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 if (how == -1 && PyErr_Occurred())
4745 return NULL;
4746 Py_BEGIN_ALLOW_THREADS
4747 res = shutdown(s->sock_fd, how);
4748 Py_END_ALLOW_THREADS
4749 if (res < 0)
4750 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004751 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004752}
4753
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004754PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004755"shutdown(flag)\n\
4756\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004757Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4758of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004759
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004760#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004761static PyObject*
4762sock_ioctl(PySocketSockObject *s, PyObject *arg)
4763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 unsigned long cmd = SIO_RCVALL;
4765 PyObject *argO;
4766 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4769 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 switch (cmd) {
4772 case SIO_RCVALL: {
4773 unsigned int option = RCVALL_ON;
4774 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4775 return NULL;
4776 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4777 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4778 return set_error();
4779 }
4780 return PyLong_FromUnsignedLong(recv); }
4781 case SIO_KEEPALIVE_VALS: {
4782 struct tcp_keepalive ka;
4783 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4784 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4785 return NULL;
4786 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4787 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4788 return set_error();
4789 }
4790 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004791#if defined(SIO_LOOPBACK_FAST_PATH)
4792 case SIO_LOOPBACK_FAST_PATH: {
4793 unsigned int option;
4794 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4795 return NULL;
4796 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4797 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4798 return set_error();
4799 }
4800 return PyLong_FromUnsignedLong(recv); }
4801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004803 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 return NULL;
4805 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004806}
4807PyDoc_STRVAR(sock_ioctl_doc,
4808"ioctl(cmd, option) -> long\n\
4809\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004810Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4811SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004812SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4813SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004814#endif
4815
4816#if defined(MS_WINDOWS)
4817static PyObject*
4818sock_share(PySocketSockObject *s, PyObject *arg)
4819{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004820 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004821 DWORD processId;
4822 int result;
4823
4824 if (!PyArg_ParseTuple(arg, "I", &processId))
4825 return NULL;
4826
4827 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004828 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004829 Py_END_ALLOW_THREADS
4830 if (result == SOCKET_ERROR)
4831 return set_error();
4832 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4833}
4834PyDoc_STRVAR(sock_share_doc,
4835"share(process_id) -> bytes\n\
4836\n\
4837Share the socket with another process. The target process id\n\
4838must be provided and the resulting bytes object passed to the target\n\
4839process. There the shared socket can be instantiated by calling\n\
4840socket.fromshare().");
4841
Christian Heimesfaf2f632008-01-06 16:59:19 +00004842
4843#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004844
4845/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004846
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004847static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4849 accept_doc},
4850 {"bind", (PyCFunction)sock_bind, METH_O,
4851 bind_doc},
4852 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004853 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 {"connect", (PyCFunction)sock_connect, METH_O,
4855 connect_doc},
4856 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4857 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004858 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4859 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4861 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004862#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 {"getpeername", (PyCFunction)sock_getpeername,
4864 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 {"getsockname", (PyCFunction)sock_getsockname,
4867 METH_NOARGS, getsockname_doc},
4868 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4869 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004870#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4872 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004873#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004874#if defined(MS_WINDOWS)
4875 {"share", (PyCFunction)sock_share, METH_VARARGS,
4876 sock_share_doc},
4877#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004878 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 listen_doc},
4880 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4881 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004882 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004883 recv_into_doc},
4884 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4885 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004886 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 recvfrom_into_doc},
4888 {"send", (PyCFunction)sock_send, METH_VARARGS,
4889 send_doc},
4890 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4891 sendall_doc},
4892 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4893 sendto_doc},
4894 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4895 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004896 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4897 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4899 settimeout_doc},
4900 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4901 gettimeout_doc},
4902 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4903 setsockopt_doc},
4904 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4905 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004906#ifdef CMSG_LEN
4907 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4908 recvmsg_doc},
4909 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4910 recvmsg_into_doc,},
4911 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4912 sendmsg_doc},
4913#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004914#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004915 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004916 sendmsg_afalg_doc},
4917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004919};
4920
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004921/* SockObject members */
4922static PyMemberDef sock_memberlist[] = {
4923 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4924 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4925 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004926 {0},
4927};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004928
Victor Stinner71694d52015-03-28 01:18:54 +01004929static PyGetSetDef sock_getsetlist[] = {
4930 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4931 {NULL} /* sentinel */
4932};
4933
Guido van Rossum73624e91994-10-10 17:59:00 +00004934/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004935 First close the file description. */
4936
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004937static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004938sock_finalize(PySocketSockObject *s)
4939{
4940 SOCKET_T fd;
4941 PyObject *error_type, *error_value, *error_traceback;
4942
4943 /* Save the current exception, if any. */
4944 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4945
Victor Stinnerd3afb622016-07-22 17:47:09 +02004946 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004947 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4948 /* Spurious errors can appear at shutdown */
4949 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4950 PyErr_WriteUnraisable((PyObject *)s);
4951 }
4952 }
4953
4954 /* Only close the socket *after* logging the ResourceWarning warning
4955 to allow the logger to call socket methods like
4956 socket.getsockname(). If the socket is closed before, socket
4957 methods fails with the EBADF error. */
4958 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004959 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004960
4961 /* We do not want to retry upon EINTR: see sock_close() */
4962 Py_BEGIN_ALLOW_THREADS
4963 (void) SOCKETCLOSE(fd);
4964 Py_END_ALLOW_THREADS
4965 }
4966
4967 /* Restore the saved exception. */
4968 PyErr_Restore(error_type, error_value, error_traceback);
4969}
4970
4971static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004972sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004973{
Victor Stinner19a8e842016-03-21 16:36:48 +01004974 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4975 return;
4976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004978}
4979
Guido van Rossum30a685f1991-06-27 15:51:29 +00004980
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004981static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004982sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004983{
Victor Stinnere254e532014-07-26 14:36:55 +02004984 long sock_fd;
4985 /* On Windows, this test is needed because SOCKET_T is unsigned */
4986 if (s->sock_fd == INVALID_SOCKET) {
4987 sock_fd = -1;
4988 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004989#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004990 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 /* this can occur on Win64, and actually there is a special
4992 ugly printf formatter for decimal pointer length integer
4993 printing, only bother if necessary*/
4994 PyErr_SetString(PyExc_OverflowError,
4995 "no printf formatter to display "
4996 "the socket descriptor in decimal");
4997 return NULL;
4998 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004999#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005000 else
5001 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 return PyUnicode_FromFormat(
5003 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005004 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 s->sock_type,
5006 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005007}
5008
5009
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005010/* Create a new, uninitialized socket object. */
5011
5012static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005013sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 new = type->tp_alloc(type, 0);
5018 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005019 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005020 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 ((PySocketSockObject *)new)->errorhandler = &set_error;
5022 }
5023 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005024}
5025
5026
5027/* Initialize a new socket object. */
5028
Victor Stinnerdaf45552013-08-28 00:53:59 +02005029#ifdef SOCK_CLOEXEC
5030/* socket() and socketpair() fail with EINVAL on Linux kernel older
5031 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5032static int sock_cloexec_works = -1;
5033#endif
5034
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005035/*ARGSUSED*/
5036static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005037sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 PySocketSockObject *s = (PySocketSockObject *)self;
5040 PyObject *fdobj = NULL;
5041 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005042 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005044#ifndef MS_WINDOWS
5045#ifdef SOCK_CLOEXEC
5046 int *atomic_flag_works = &sock_cloexec_works;
5047#else
5048 int *atomic_flag_works = NULL;
5049#endif
5050#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5053 "|iiiO:socket", keywords,
5054 &family, &type, &proto, &fdobj))
5055 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005056
Steve Dowerb82e17e2019-05-23 08:45:22 -07005057#ifdef MS_WINDOWS
5058 /* In this case, we don't use the family, type and proto args */
5059 if (fdobj != NULL && fdobj != Py_None)
5060#endif
5061 {
5062 if (PySys_Audit("socket.__new__", "Oiii",
5063 s, family, type, proto) < 0) {
5064 return -1;
5065 }
5066 }
5067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005069#ifdef MS_WINDOWS
5070 /* recreate a socket that was duplicated */
5071 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005072 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005073 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5074 PyErr_Format(PyExc_ValueError,
5075 "socket descriptor string has wrong size, "
5076 "should be %zu bytes.", sizeof(info));
5077 return -1;
5078 }
5079 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005080
5081 if (PySys_Audit("socket()", "iii", info.iAddressFamily,
5082 info.iSocketType, info.iProtocol) < 0) {
5083 return -1;
5084 }
5085
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005086 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005087 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005088 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5089 Py_END_ALLOW_THREADS
5090 if (fd == INVALID_SOCKET) {
5091 set_error();
5092 return -1;
5093 }
5094 family = info.iAddressFamily;
5095 type = info.iSocketType;
5096 proto = info.iProtocol;
5097 }
5098 else
5099#endif
5100 {
Dima Tisneke9912702018-12-17 22:07:55 +09005101
5102 if (PyFloat_Check(fdobj)) {
5103 PyErr_SetString(PyExc_TypeError,
5104 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005105 return -1;
5106 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005107
Dima Tisneke9912702018-12-17 22:07:55 +09005108 fd = PyLong_AsSocket_t(fdobj);
5109 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5110 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005111#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005112 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005113#else
Dima Tisneke9912702018-12-17 22:07:55 +09005114 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005115#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005116 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5117 return -1;
5118 }
5119
5120 /* validate that passed file descriptor is valid and a socket. */
5121 sock_addr_t addrbuf;
5122 socklen_t addrlen = sizeof(sock_addr_t);
5123
5124 memset(&addrbuf, 0, addrlen);
5125 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5126 if (family == -1) {
5127 family = SAS2SA(&addrbuf)->sa_family;
5128 }
5129 } else {
5130#ifdef MS_WINDOWS
5131 /* getsockname() on an unbound socket is an error on Windows.
5132 Invalid descriptor and not a socket is same error code.
5133 Error out if family must be resolved, or bad descriptor. */
5134 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5135#else
5136 /* getsockname() is not supported for SOL_ALG on Linux. */
5137 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5138#endif
5139 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005140 return -1;
5141 }
5142 }
5143#ifdef SO_TYPE
5144 if (type == -1) {
5145 int tmp;
5146 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005147 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5148 (void *)&tmp, &slen) == 0)
5149 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005150 type = tmp;
5151 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005152 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005153 return -1;
5154 }
5155 }
5156#else
5157 type = SOCK_STREAM;
5158#endif
5159#ifdef SO_PROTOCOL
5160 if (proto == -1) {
5161 int tmp;
5162 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005163 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5164 (void *)&tmp, &slen) == 0)
5165 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005166 proto = tmp;
5167 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005168 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005169 return -1;
5170 }
5171 }
5172#else
5173 proto = 0;
5174#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 }
5176 }
5177 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005178 /* No fd, default to AF_INET and SOCK_STREAM */
5179 if (family == -1) {
5180 family = AF_INET;
5181 }
5182 if (type == -1) {
5183 type = SOCK_STREAM;
5184 }
5185 if (proto == -1) {
5186 proto = 0;
5187 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005188#ifdef MS_WINDOWS
5189 /* Windows implementation */
5190#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5191#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5192#endif
5193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005195 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005196 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005197 NULL, 0,
5198 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5199 if (fd == INVALID_SOCKET) {
5200 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5201 support_wsa_no_inherit = 0;
5202 fd = socket(family, type, proto);
5203 }
5204 }
5205 else {
5206 fd = socket(family, type, proto);
5207 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 if (fd == INVALID_SOCKET) {
5211 set_error();
5212 return -1;
5213 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005214
5215 if (!support_wsa_no_inherit) {
5216 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5217 closesocket(fd);
5218 PyErr_SetFromWindowsErr(0);
5219 return -1;
5220 }
5221 }
5222#else
5223 /* UNIX */
5224 Py_BEGIN_ALLOW_THREADS
5225#ifdef SOCK_CLOEXEC
5226 if (sock_cloexec_works != 0) {
5227 fd = socket(family, type | SOCK_CLOEXEC, proto);
5228 if (sock_cloexec_works == -1) {
5229 if (fd >= 0) {
5230 sock_cloexec_works = 1;
5231 }
5232 else if (errno == EINVAL) {
5233 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5234 sock_cloexec_works = 0;
5235 fd = socket(family, type, proto);
5236 }
5237 }
5238 }
5239 else
5240#endif
5241 {
5242 fd = socket(family, type, proto);
5243 }
5244 Py_END_ALLOW_THREADS
5245
5246 if (fd == INVALID_SOCKET) {
5247 set_error();
5248 return -1;
5249 }
5250
5251 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5252 SOCKETCLOSE(fd);
5253 return -1;
5254 }
5255#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005257 if (init_sockobject(s, fd, family, type, proto) == -1) {
5258 SOCKETCLOSE(fd);
5259 return -1;
5260 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005263
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005264}
5265
5266
Guido van Rossumb6775db1994-08-01 11:34:53 +00005267/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005268
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005269static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5271 "_socket.socket", /* tp_name */
5272 sizeof(PySocketSockObject), /* tp_basicsize */
5273 0, /* tp_itemsize */
5274 (destructor)sock_dealloc, /* tp_dealloc */
5275 0, /* tp_print */
5276 0, /* tp_getattr */
5277 0, /* tp_setattr */
5278 0, /* tp_reserved */
5279 (reprfunc)sock_repr, /* tp_repr */
5280 0, /* tp_as_number */
5281 0, /* tp_as_sequence */
5282 0, /* tp_as_mapping */
5283 0, /* tp_hash */
5284 0, /* tp_call */
5285 0, /* tp_str */
5286 PyObject_GenericGetAttr, /* tp_getattro */
5287 0, /* tp_setattro */
5288 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005289 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5290 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 sock_doc, /* tp_doc */
5292 0, /* tp_traverse */
5293 0, /* tp_clear */
5294 0, /* tp_richcompare */
5295 0, /* tp_weaklistoffset */
5296 0, /* tp_iter */
5297 0, /* tp_iternext */
5298 sock_methods, /* tp_methods */
5299 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005300 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 0, /* tp_base */
5302 0, /* tp_dict */
5303 0, /* tp_descr_get */
5304 0, /* tp_descr_set */
5305 0, /* tp_dictoffset */
5306 sock_initobj, /* tp_init */
5307 PyType_GenericAlloc, /* tp_alloc */
5308 sock_new, /* tp_new */
5309 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005310 0, /* tp_is_gc */
5311 0, /* tp_bases */
5312 0, /* tp_mro */
5313 0, /* tp_cache */
5314 0, /* tp_subclasses */
5315 0, /* tp_weaklist */
5316 0, /* tp_del */
5317 0, /* tp_version_tag */
5318 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005319};
5320
Guido van Rossum30a685f1991-06-27 15:51:29 +00005321
Guido van Rossum81194471991-07-27 21:42:02 +00005322/* Python interface to gethostname(). */
5323
5324/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005325static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005326socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005327{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005328 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5329 return NULL;
5330 }
5331
Martin v. Löwis72f48422010-10-29 18:20:08 +00005332#ifdef MS_WINDOWS
5333 /* Don't use winsock's gethostname, as this returns the ANSI
5334 version of the hostname, whereas we need a Unicode string.
5335 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005336 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005337 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005338 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005339 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005340
5341 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005342 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005343
5344 if (GetLastError() != ERROR_MORE_DATA)
5345 return PyErr_SetFromWindowsErr(0);
5346
5347 if (size == 0)
5348 return PyUnicode_New(0, 0);
5349
5350 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5351 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005352 name = PyMem_New(wchar_t, size);
5353 if (!name) {
5354 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005355 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005356 }
Victor Stinner74168972011-11-17 01:11:36 +01005357 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5358 name,
5359 &size))
5360 {
5361 PyMem_Free(name);
5362 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005363 }
Victor Stinner74168972011-11-17 01:11:36 +01005364
5365 result = PyUnicode_FromWideChar(name, size);
5366 PyMem_Free(name);
5367 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005368#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 char buf[1024];
5370 int res;
5371 Py_BEGIN_ALLOW_THREADS
5372 res = gethostname(buf, (int) sizeof buf - 1);
5373 Py_END_ALLOW_THREADS
5374 if (res < 0)
5375 return set_error();
5376 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005377 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005378#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005379}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005381PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005382"gethostname() -> string\n\
5383\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005384Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005385
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005386#ifdef HAVE_SETHOSTNAME
5387PyDoc_STRVAR(sethostname_doc,
5388"sethostname(name)\n\n\
5389Sets the hostname to name.");
5390
5391static PyObject *
5392socket_sethostname(PyObject *self, PyObject *args)
5393{
5394 PyObject *hnobj;
5395 Py_buffer buf;
5396 int res, flag = 0;
5397
Christian Heimesd2774c72013-06-19 02:06:29 +02005398#ifdef _AIX
5399/* issue #18259, not declared in any useful header file */
5400extern int sethostname(const char *, size_t);
5401#endif
5402
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005403 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5404 PyErr_Clear();
5405 if (!PyArg_ParseTuple(args, "O&:sethostname",
5406 PyUnicode_FSConverter, &hnobj))
5407 return NULL;
5408 flag = 1;
5409 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005410
5411 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5412 return NULL;
5413 }
5414
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005415 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5416 if (!res) {
5417 res = sethostname(buf.buf, buf.len);
5418 PyBuffer_Release(&buf);
5419 }
5420 if (flag)
5421 Py_DECREF(hnobj);
5422 if (res)
5423 return set_error();
5424 Py_RETURN_NONE;
5425}
5426#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005427
Guido van Rossum30a685f1991-06-27 15:51:29 +00005428/* Python interface to gethostbyname(name). */
5429
5430/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005431static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005432socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005435 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005436 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005437
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005438 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005440 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5441 goto finally;
5442 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005443 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005444 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005445 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005446finally:
5447 PyMem_Free(name);
5448 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005449}
5450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005451PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005452"gethostbyname(host) -> address\n\
5453\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005454Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005455
5456
Victor Stinner72400302016-01-28 15:41:01 +01005457static PyObject*
5458sock_decode_hostname(const char *name)
5459{
5460#ifdef MS_WINDOWS
5461 /* Issue #26227: gethostbyaddr() returns a string encoded
5462 * to the ANSI code page */
5463 return PyUnicode_DecodeFSDefault(name);
5464#else
5465 /* Decode from UTF-8 */
5466 return PyUnicode_FromString(name);
5467#endif
5468}
5469
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005470/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5471
5472static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005473gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 char **pch;
5476 PyObject *rtn_tuple = (PyObject *)NULL;
5477 PyObject *name_list = (PyObject *)NULL;
5478 PyObject *addr_list = (PyObject *)NULL;
5479 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005480 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 if (h == NULL) {
5483 /* Let's get real error message to return */
5484 set_herror(h_errno);
5485 return NULL;
5486 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 if (h->h_addrtype != af) {
5489 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005490 errno = EAFNOSUPPORT;
5491 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 return NULL;
5493 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 case AF_INET:
5498 if (alen < sizeof(struct sockaddr_in))
5499 return NULL;
5500 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005501
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005502#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 case AF_INET6:
5504 if (alen < sizeof(struct sockaddr_in6))
5505 return NULL;
5506 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005507#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 if ((name_list = PyList_New(0)) == NULL)
5512 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 if ((addr_list = PyList_New(0)) == NULL)
5515 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 /* SF #1511317: h_aliases can be NULL */
5518 if (h->h_aliases) {
5519 for (pch = h->h_aliases; *pch != NULL; pch++) {
5520 int status;
5521 tmp = PyUnicode_FromString(*pch);
5522 if (tmp == NULL)
5523 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 status = PyList_Append(name_list, tmp);
5526 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 if (status)
5529 goto err;
5530 }
5531 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5534 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 case AF_INET:
5539 {
5540 struct sockaddr_in sin;
5541 memset(&sin, 0, sizeof(sin));
5542 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005543#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005547 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 if (pch == h->h_addr_list && alen >= sizeof(sin))
5550 memcpy((char *) addr, &sin, sizeof(sin));
5551 break;
5552 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005553
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005554#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 case AF_INET6:
5556 {
5557 struct sockaddr_in6 sin6;
5558 memset(&sin6, 0, sizeof(sin6));
5559 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005560#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005561 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005564 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5567 memcpy((char *) addr, &sin6, sizeof(sin6));
5568 break;
5569 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005570#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005573 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 "unsupported address family");
5575 return NULL;
5576 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 if (tmp == NULL)
5579 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 status = PyList_Append(addr_list, tmp);
5582 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 if (status)
5585 goto err;
5586 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005587
Victor Stinner72400302016-01-28 15:41:01 +01005588 name = sock_decode_hostname(h->h_name);
5589 if (name == NULL)
5590 goto err;
5591 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005592
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005593 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 Py_XDECREF(name_list);
5595 Py_XDECREF(addr_list);
5596 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005597}
5598
5599
5600/* Python interface to gethostbyname_ex(name). */
5601
5602/*ARGSUSED*/
5603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005604socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 char *name;
5607 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005608 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005610 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005611#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005613#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005615#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 char buf[16384];
5617 int buf_len = (sizeof buf) - 1;
5618 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005619#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005620#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005622#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005623#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005624
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005625 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005627 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5628 goto finally;
5629 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005630 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005631 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005633#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005634#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005635 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005637#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005639#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 memset((void *) &data, '\0', sizeof(data));
5641 result = gethostbyname_r(name, &hp_allocated, &data);
5642 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005643#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005644#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005645#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005647#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005648 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005650#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 Py_END_ALLOW_THREADS
5652 /* Some C libraries would require addr.__ss_family instead of
5653 addr.ss_family.
5654 Therefore, we cast the sockaddr_storage into sockaddr to
5655 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005656 sa = SAS2SA(&addr);
5657 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005659#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005661#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005662finally:
5663 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005665}
5666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005667PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005668"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5669\n\
5670Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005671for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005672
5673
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005674/* Python interface to gethostbyaddr(IP). */
5675
5676/*ARGSUSED*/
5677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005678socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005679{
Charles-François Natali8b759652011-12-23 16:44:51 +01005680 sock_addr_t addr;
5681 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 char *ip_num;
5683 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005684 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005685#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005687#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005689#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 /* glibcs up to 2.10 assume that the buf argument to
5691 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5692 does not ensure. The attribute below instructs the compiler
5693 to maintain this alignment. */
5694 char buf[16384] Py_ALIGNED(8);
5695 int buf_len = (sizeof buf) - 1;
5696 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005697#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005698#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005700#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005701#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005702 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 int al;
5704 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005705
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005706 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005707 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005708 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5709 goto finally;
5710 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 af = AF_UNSPEC;
5712 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005713 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 af = sa->sa_family;
5715 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005716 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 switch (af) {
5718 case AF_INET:
5719 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5720 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5721 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005722#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 case AF_INET6:
5724 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5725 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5726 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005729 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005730 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 }
5732 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005733#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005734#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005735 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 &hp_allocated, buf, buf_len,
5737 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005738#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 h = gethostbyaddr_r(ap, al, af,
5740 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005741#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 memset((void *) &data, '\0', sizeof(data));
5743 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5744 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005745#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005746#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005747#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005749#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005750 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005752#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005754 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005755#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005757#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005758finally:
5759 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005761}
5762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005763PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005764"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5765\n\
5766Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005767for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005768
Guido van Rossum30a685f1991-06-27 15:51:29 +00005769
5770/* Python interface to getservbyname(name).
5771 This only returns the port number, since the other info is already
5772 known or not useful (like the list of aliases). */
5773
5774/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005776socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005777{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005778 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 struct servent *sp;
5780 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5781 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005782
5783 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5784 return NULL;
5785 }
5786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 Py_BEGIN_ALLOW_THREADS
5788 sp = getservbyname(name, proto);
5789 Py_END_ALLOW_THREADS
5790 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005791 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 return NULL;
5793 }
5794 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005795}
5796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005797PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005798"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005799\n\
5800Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005801The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5802otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005803
Guido van Rossum30a685f1991-06-27 15:51:29 +00005804
Barry Warsaw11b91a02004-06-28 00:50:43 +00005805/* Python interface to getservbyport(port).
5806 This only returns the service name, since the other info is already
5807 known or not useful (like the list of aliases). */
5808
5809/*ARGSUSED*/
5810static PyObject *
5811socket_getservbyport(PyObject *self, PyObject *args)
5812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005814 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 struct servent *sp;
5816 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5817 return NULL;
5818 if (port < 0 || port > 0xffff) {
5819 PyErr_SetString(
5820 PyExc_OverflowError,
5821 "getservbyport: port must be 0-65535.");
5822 return NULL;
5823 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005824
5825 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5826 return NULL;
5827 }
5828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 Py_BEGIN_ALLOW_THREADS
5830 sp = getservbyport(htons((short)port), proto);
5831 Py_END_ALLOW_THREADS
5832 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005833 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 }
5836 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005837}
5838
5839PyDoc_STRVAR(getservbyport_doc,
5840"getservbyport(port[, protocolname]) -> string\n\
5841\n\
5842Return the service name from a port number and protocol name.\n\
5843The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5844otherwise any protocol will match.");
5845
Guido van Rossum3901d851996-12-19 16:35:04 +00005846/* Python interface to getprotobyname(name).
5847 This only returns the protocol number, since the other info is
5848 already known or not useful (like the list of aliases). */
5849
5850/*ARGSUSED*/
5851static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005852socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005853{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005854 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 struct protoent *sp;
5856 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5857 return NULL;
5858 Py_BEGIN_ALLOW_THREADS
5859 sp = getprotobyname(name);
5860 Py_END_ALLOW_THREADS
5861 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005862 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 return NULL;
5864 }
5865 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005866}
5867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005868PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005869"getprotobyname(name) -> integer\n\
5870\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005871Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005872
Christian Heimesd0e31b92018-01-27 09:54:13 +01005873static PyObject *
5874socket_close(PyObject *self, PyObject *fdobj)
5875{
5876 SOCKET_T fd;
5877 int res;
5878
5879 fd = PyLong_AsSocket_t(fdobj);
5880 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5881 return NULL;
5882 Py_BEGIN_ALLOW_THREADS
5883 res = SOCKETCLOSE(fd);
5884 Py_END_ALLOW_THREADS
5885 /* bpo-30319: The peer can already have closed the connection.
5886 Python ignores ECONNRESET on close(). */
5887 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5888 return set_error();
5889 }
5890 Py_RETURN_NONE;
5891}
5892
5893PyDoc_STRVAR(close_doc,
5894"close(integer) -> None\n\
5895\n\
5896Close an integer socket file descriptor. This is like os.close(), but for\n\
5897sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005898
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005899#ifndef NO_DUP
5900/* dup() function for socket fds */
5901
5902static PyObject *
5903socket_dup(PyObject *self, PyObject *fdobj)
5904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 SOCKET_T fd, newfd;
5906 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005907#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005908 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005909#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 fd = PyLong_AsSocket_t(fdobj);
5912 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5913 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005914
Victor Stinnerdaf45552013-08-28 00:53:59 +02005915#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005916 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005917 return set_error();
5918
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005919 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005920 FROM_PROTOCOL_INFO,
5921 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 if (newfd == INVALID_SOCKET)
5923 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005924
Victor Stinnerdaf45552013-08-28 00:53:59 +02005925 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5926 closesocket(newfd);
5927 PyErr_SetFromWindowsErr(0);
5928 return NULL;
5929 }
5930#else
5931 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5932 newfd = _Py_dup(fd);
5933 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005934 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005935#endif
5936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 newfdobj = PyLong_FromSocket_t(newfd);
5938 if (newfdobj == NULL)
5939 SOCKETCLOSE(newfd);
5940 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005941}
5942
5943PyDoc_STRVAR(dup_doc,
5944"dup(integer) -> integer\n\
5945\n\
5946Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5947sockets; on some platforms os.dup() won't work for socket file descriptors.");
5948#endif
5949
5950
Dave Cole331708b2004-08-09 04:51:41 +00005951#ifdef HAVE_SOCKETPAIR
5952/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005953 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005954 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005955
5956/*ARGSUSED*/
5957static PyObject *
5958socket_socketpair(PyObject *self, PyObject *args)
5959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 PySocketSockObject *s0 = NULL, *s1 = NULL;
5961 SOCKET_T sv[2];
5962 int family, type = SOCK_STREAM, proto = 0;
5963 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005964#ifdef SOCK_CLOEXEC
5965 int *atomic_flag_works = &sock_cloexec_works;
5966#else
5967 int *atomic_flag_works = NULL;
5968#endif
5969 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005970
5971#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005973#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005975#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5977 &family, &type, &proto))
5978 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005981 Py_BEGIN_ALLOW_THREADS
5982#ifdef SOCK_CLOEXEC
5983 if (sock_cloexec_works != 0) {
5984 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5985 if (sock_cloexec_works == -1) {
5986 if (ret >= 0) {
5987 sock_cloexec_works = 1;
5988 }
5989 else if (errno == EINVAL) {
5990 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5991 sock_cloexec_works = 0;
5992 ret = socketpair(family, type, proto, sv);
5993 }
5994 }
5995 }
5996 else
5997#endif
5998 {
5999 ret = socketpair(family, type, proto, sv);
6000 }
6001 Py_END_ALLOW_THREADS
6002
6003 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006005
6006 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6007 goto finally;
6008 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6009 goto finally;
6010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 s0 = new_sockobject(sv[0], family, type, proto);
6012 if (s0 == NULL)
6013 goto finally;
6014 s1 = new_sockobject(sv[1], family, type, proto);
6015 if (s1 == NULL)
6016 goto finally;
6017 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006018
6019finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 if (res == NULL) {
6021 if (s0 == NULL)
6022 SOCKETCLOSE(sv[0]);
6023 if (s1 == NULL)
6024 SOCKETCLOSE(sv[1]);
6025 }
6026 Py_XDECREF(s0);
6027 Py_XDECREF(s1);
6028 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006029}
6030
6031PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006032"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006033\n\
6034Create a pair of socket objects from the sockets returned by the platform\n\
6035socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006036The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006037AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006038
6039#endif /* HAVE_SOCKETPAIR */
6040
6041
Guido van Rossum006bf911996-06-12 04:04:55 +00006042static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006043socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006044{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006045 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006046
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006047 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 return NULL;
6049 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006050 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006052 "ntohs: can't convert negative Python int to C "
6053 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 return NULL;
6055 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006056 if (x > 0xffff) {
6057 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6058 "ntohs: Python int too large to convert to C "
6059 "16-bit unsigned integer (The silent truncation "
6060 "is deprecated)",
6061 1)) {
6062 return NULL;
6063 }
6064 }
6065 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006066}
6067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006068PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006069"ntohs(integer) -> integer\n\
6070\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006071Convert a 16-bit unsigned integer from network to host byte order.\n\
6072Note that in case the received integer does not fit in 16-bit unsigned\n\
6073integer, but does fit in a positive C int, it is silently truncated to\n\
607416-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006075However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006076exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006077
6078
Guido van Rossum006bf911996-06-12 04:04:55 +00006079static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006080socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 if (PyLong_Check(arg)) {
6085 x = PyLong_AsUnsignedLong(arg);
6086 if (x == (unsigned long) -1 && PyErr_Occurred())
6087 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006088#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 {
6090 unsigned long y;
6091 /* only want the trailing 32 bits */
6092 y = x & 0xFFFFFFFFUL;
6093 if (y ^ x)
6094 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006095 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 x = y;
6097 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006098#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 }
6100 else
6101 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006102 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006105}
6106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006107PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006108"ntohl(integer) -> integer\n\
6109\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006110Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006111
6112
Guido van Rossum006bf911996-06-12 04:04:55 +00006113static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006114socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006115{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006116 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006117
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006118 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 return NULL;
6120 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006121 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006123 "htons: can't convert negative Python int to C "
6124 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 return NULL;
6126 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006127 if (x > 0xffff) {
6128 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6129 "htons: Python int too large to convert to C "
6130 "16-bit unsigned integer (The silent truncation "
6131 "is deprecated)",
6132 1)) {
6133 return NULL;
6134 }
6135 }
6136 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006137}
6138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006139PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006140"htons(integer) -> integer\n\
6141\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006142Convert a 16-bit unsigned integer from host to network byte order.\n\
6143Note that in case the received integer does not fit in 16-bit unsigned\n\
6144integer, but does fit in a positive C int, it is silently truncated to\n\
614516-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006146However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006147exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006148
6149
Guido van Rossum006bf911996-06-12 04:04:55 +00006150static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006151socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 if (PyLong_Check(arg)) {
6156 x = PyLong_AsUnsignedLong(arg);
6157 if (x == (unsigned long) -1 && PyErr_Occurred())
6158 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006159#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 {
6161 unsigned long y;
6162 /* only want the trailing 32 bits */
6163 y = x & 0xFFFFFFFFUL;
6164 if (y ^ x)
6165 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006166 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 x = y;
6168 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 }
6171 else
6172 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006173 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 Py_TYPE(arg)->tp_name);
6175 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006176}
6177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006178PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006179"htonl(integer) -> integer\n\
6180\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006181Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006182
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006183/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006185PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006186"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006187\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006188Convert 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 +00006189binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006190
6191static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006192socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006193{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006194#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006196#endif
6197
6198#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006199#if (SIZEOF_INT != 4)
6200#error "Not sure if in_addr_t exists and int is not 32-bits."
6201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 /* Have to use inet_addr() instead */
6203 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006204#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006205 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6208 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006209
Tim Peters1df9fdd2003-02-13 03:13:40 +00006210
6211#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006212
6213#ifdef USE_INET_ATON_WEAKLINK
6214 if (inet_aton != NULL) {
6215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 if (inet_aton(ip_addr, &buf))
6217 return PyBytes_FromStringAndSize((char *)(&buf),
6218 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006219
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006220 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 "illegal IP address string passed to inet_aton");
6222 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006223
Thomas Wouters477c8d52006-05-27 19:21:47 +00006224#ifdef USE_INET_ATON_WEAKLINK
6225 } else {
6226#endif
6227
6228#endif
6229
6230#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 /* special-case this address as inet_addr might return INADDR_NONE
6233 * for this */
6234 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006235 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006237
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006238 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006242 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 "illegal IP address string passed to inet_aton");
6244 return NULL;
6245 }
6246 }
6247 return PyBytes_FromStringAndSize((char *) &packed_addr,
6248 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006249
6250#ifdef USE_INET_ATON_WEAKLINK
6251 }
6252#endif
6253
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006254#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006255}
6256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006257PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006258"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006259\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006260Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006261
6262static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006263socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006264{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006265 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006267
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006268 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 return NULL;
6270 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006271
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006272 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006273 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006275 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 return NULL;
6277 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006278
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006279 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6280 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006281
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006282 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006284}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006285
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006286#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006287
6288PyDoc_STRVAR(inet_pton_doc,
6289"inet_pton(af, ip) -> packed IP address string\n\
6290\n\
6291Convert an IP address from string format to a packed string suitable\n\
6292for use with low-level network functions.");
6293
6294static PyObject *
6295socket_inet_pton(PyObject *self, PyObject *args)
6296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006298 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006300#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006301 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006302#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6306 return NULL;
6307 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006308
Martin v. Löwis04697e82004-06-02 12:35:29 +00006309#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006311 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 "can't use AF_INET6, IPv6 is disabled");
6313 return NULL;
6314 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006315#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 retval = inet_pton(af, ip, packed);
6318 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006319 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320 return NULL;
6321 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006322 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 "illegal IP address string passed to inet_pton");
6324 return NULL;
6325 } else if (af == AF_INET) {
6326 return PyBytes_FromStringAndSize(packed,
6327 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006328#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329 } else if (af == AF_INET6) {
6330 return PyBytes_FromStringAndSize(packed,
6331 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006334 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 return NULL;
6336 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006337}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006338
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006339PyDoc_STRVAR(inet_ntop_doc,
6340"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6341\n\
6342Convert a packed IP address of the given family to string format.");
6343
6344static PyObject *
6345socket_inet_ntop(PyObject *self, PyObject *args)
6346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006348 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006350#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006351 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006352#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006353 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006354#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006355
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006356 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 return NULL;
6358 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006361 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 PyErr_SetString(PyExc_ValueError,
6363 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006364 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 return NULL;
6366 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006367#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006369 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyErr_SetString(PyExc_ValueError,
6371 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006372 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 return NULL;
6374 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 } else {
6377 PyErr_Format(PyExc_ValueError,
6378 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006379 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 return NULL;
6381 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006382
Коренберг Марк7766b962018-02-13 00:47:42 +05006383 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006384 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6385 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006387 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 return NULL;
6389 } else {
6390 return PyUnicode_FromString(retval);
6391 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006392}
6393
6394#endif /* HAVE_INET_PTON */
6395
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006396/* Python interface to getaddrinfo(host, port). */
6397
6398/*ARGSUSED*/
6399static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006400socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006401{
Victor Stinner77af1722011-05-26 14:05:59 +02006402 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006403 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 struct addrinfo hints, *res;
6405 struct addrinfo *res0 = NULL;
6406 PyObject *hobj = NULL;
6407 PyObject *pobj = (PyObject *)NULL;
6408 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006409 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410 int family, socktype, protocol, flags;
6411 int error;
6412 PyObject *all = (PyObject *)NULL;
6413 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006414
Georg Brandl6083a4b2013-10-14 06:51:46 +02006415 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006417 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006418 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 &protocol, &flags)) {
6420 return NULL;
6421 }
6422 if (hobj == Py_None) {
6423 hptr = NULL;
6424 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006425 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 if (!idna)
6427 return NULL;
6428 assert(PyBytes_Check(idna));
6429 hptr = PyBytes_AS_STRING(idna);
6430 } else if (PyBytes_Check(hobj)) {
6431 hptr = PyBytes_AsString(hobj);
6432 } else {
6433 PyErr_SetString(PyExc_TypeError,
6434 "getaddrinfo() argument 1 must be string or None");
6435 return NULL;
6436 }
6437 if (PyLong_CheckExact(pobj)) {
6438 long value = PyLong_AsLong(pobj);
6439 if (value == -1 && PyErr_Occurred())
6440 goto err;
6441 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6442 pptr = pbuf;
6443 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006444 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006445 if (pptr == NULL)
6446 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006448 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449 } else if (pobj == Py_None) {
6450 pptr = (char *)NULL;
6451 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006452 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 goto err;
6454 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006455#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006456 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006457 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006458 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6459 * This workaround avoids a segfault in libsystem.
6460 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006461 pptr = "00";
6462 }
6463#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006464
6465 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6466 hobj, pobj, family, socktype, protocol) < 0) {
6467 return NULL;
6468 }
6469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 memset(&hints, 0, sizeof(hints));
6471 hints.ai_family = family;
6472 hints.ai_socktype = socktype;
6473 hints.ai_protocol = protocol;
6474 hints.ai_flags = flags;
6475 Py_BEGIN_ALLOW_THREADS
6476 ACQUIRE_GETADDRINFO_LOCK
6477 error = getaddrinfo(hptr, pptr, &hints, &res0);
6478 Py_END_ALLOW_THREADS
6479 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6480 if (error) {
6481 set_gaierror(error);
6482 goto err;
6483 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006484
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006485 all = PyList_New(0);
6486 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 goto err;
6488 for (res = res0; res; res = res->ai_next) {
6489 PyObject *single;
6490 PyObject *addr =
6491 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6492 if (addr == NULL)
6493 goto err;
6494 single = Py_BuildValue("iiisO", res->ai_family,
6495 res->ai_socktype, res->ai_protocol,
6496 res->ai_canonname ? res->ai_canonname : "",
6497 addr);
6498 Py_DECREF(addr);
6499 if (single == NULL)
6500 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006501
Zackery Spytz4c596d52018-11-14 15:39:01 -07006502 if (PyList_Append(all, single)) {
6503 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006505 }
6506 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507 }
6508 Py_XDECREF(idna);
6509 if (res0)
6510 freeaddrinfo(res0);
6511 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006512 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513 Py_XDECREF(all);
6514 Py_XDECREF(idna);
6515 if (res0)
6516 freeaddrinfo(res0);
6517 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006518}
6519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006520PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006521"getaddrinfo(host, port [, family, type, proto, flags])\n\
6522 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006523\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006524Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006525
6526/* Python interface to getnameinfo(sa, flags). */
6527
6528/*ARGSUSED*/
6529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006530socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532 PyObject *sa = (PyObject *)NULL;
6533 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006534 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006535 int port;
6536 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6538 struct addrinfo hints, *res = NULL;
6539 int error;
6540 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006541 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 flags = flowinfo = scope_id = 0;
6544 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6545 return NULL;
6546 if (!PyTuple_Check(sa)) {
6547 PyErr_SetString(PyExc_TypeError,
6548 "getnameinfo() argument 1 must be a tuple");
6549 return NULL;
6550 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006551 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006553 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006555 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006556 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006557 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006558 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006559 return NULL;
6560 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006561
6562 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6563 return NULL;
6564 }
6565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6567 memset(&hints, 0, sizeof(hints));
6568 hints.ai_family = AF_UNSPEC;
6569 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006570 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 Py_BEGIN_ALLOW_THREADS
6572 ACQUIRE_GETADDRINFO_LOCK
6573 error = getaddrinfo(hostp, pbuf, &hints, &res);
6574 Py_END_ALLOW_THREADS
6575 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6576 if (error) {
6577 set_gaierror(error);
6578 goto fail;
6579 }
6580 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006581 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 "sockaddr resolved to multiple addresses");
6583 goto fail;
6584 }
6585 switch (res->ai_family) {
6586 case AF_INET:
6587 {
6588 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006589 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 "IPv4 sockaddr must be 2 tuple");
6591 goto fail;
6592 }
6593 break;
6594 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006595#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 case AF_INET6:
6597 {
6598 struct sockaddr_in6 *sin6;
6599 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006600 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 sin6->sin6_scope_id = scope_id;
6602 break;
6603 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006606 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6608 if (error) {
6609 set_gaierror(error);
6610 goto fail;
6611 }
Victor Stinner72400302016-01-28 15:41:01 +01006612
6613 name = sock_decode_hostname(hbuf);
6614 if (name == NULL)
6615 goto fail;
6616 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006617
6618fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 if (res)
6620 freeaddrinfo(res);
6621 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006622}
6623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006624PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006625"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006626\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006627Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006628
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006629
6630/* Python API to getting and setting the default timeout value. */
6631
6632static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306633socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006634{
Victor Stinner71694d52015-03-28 01:18:54 +01006635 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006636 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 }
Victor Stinner71694d52015-03-28 01:18:54 +01006638 else {
6639 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6640 return PyFloat_FromDouble(seconds);
6641 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006642}
6643
6644PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006645"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006646\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006647Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006648A value of None indicates that new socket objects have no timeout.\n\
6649When the socket module is first imported, the default is None.");
6650
6651static PyObject *
6652socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6653{
Victor Stinner71694d52015-03-28 01:18:54 +01006654 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006655
Victor Stinner71694d52015-03-28 01:18:54 +01006656 if (socket_parse_timeout(&timeout, arg) < 0)
6657 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006660
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006661 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006662}
6663
6664PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006665"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006666\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006667Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006668A value of None indicates that new socket objects have no timeout.\n\
6669When the socket module is first imported, the default is None.");
6670
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006671#ifdef HAVE_IF_NAMEINDEX
6672/* Python API for getting interface indices and names */
6673
6674static PyObject *
6675socket_if_nameindex(PyObject *self, PyObject *arg)
6676{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006677 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006678 int i;
6679 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006680
Charles-François Natali60713592011-05-20 16:55:06 +02006681 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006682 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006683 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006684 return NULL;
6685 }
6686
6687 list = PyList_New(0);
6688 if (list == NULL) {
6689 if_freenameindex(ni);
6690 return NULL;
6691 }
6692
Gregory P. Smithb474e672018-12-30 17:05:36 -08006693#ifdef _Py_MEMORY_SANITIZER
6694 __msan_unpoison(ni, sizeof(ni));
6695 __msan_unpoison(&ni[0], sizeof(ni[0]));
6696#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006697 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006698#ifdef _Py_MEMORY_SANITIZER
6699 /* This one isn't the end sentinel, the next one must exist. */
6700 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6701 /* Otherwise Py_BuildValue internals are flagged by MSan when
6702 they access the not-msan-tracked if_name string data. */
6703 {
6704 char *to_sanitize = ni[i].if_name;
6705 do {
6706 __msan_unpoison(to_sanitize, 1);
6707 } while (*to_sanitize++ != '\0');
6708 }
6709#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006710 PyObject *ni_tuple = Py_BuildValue("IO&",
6711 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006712
6713 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6714 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006715 Py_DECREF(list);
6716 if_freenameindex(ni);
6717 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006718 }
6719 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006720 }
6721
6722 if_freenameindex(ni);
6723 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006724}
6725
6726PyDoc_STRVAR(if_nameindex_doc,
6727"if_nameindex()\n\
6728\n\
6729Returns a list of network interface information (index, name) tuples.");
6730
Charles-François Natali60713592011-05-20 16:55:06 +02006731static PyObject *
6732socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006733{
Charles-François Natali60713592011-05-20 16:55:06 +02006734 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006735 unsigned long index;
6736
Charles-François Natali60713592011-05-20 16:55:06 +02006737 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6738 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006739 return NULL;
6740
Charles-François Natali60713592011-05-20 16:55:06 +02006741 index = if_nametoindex(PyBytes_AS_STRING(oname));
6742 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006743 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006744 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006745 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006746 return NULL;
6747 }
6748
6749 return PyLong_FromUnsignedLong(index);
6750}
6751
6752PyDoc_STRVAR(if_nametoindex_doc,
6753"if_nametoindex(if_name)\n\
6754\n\
6755Returns the interface index corresponding to the interface name if_name.");
6756
Charles-François Natali60713592011-05-20 16:55:06 +02006757static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006758socket_if_indextoname(PyObject *self, PyObject *arg)
6759{
Charles-François Natali60713592011-05-20 16:55:06 +02006760 unsigned long index;
6761 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006762
Charles-François Natali60713592011-05-20 16:55:06 +02006763 index = PyLong_AsUnsignedLong(arg);
6764 if (index == (unsigned long) -1)
6765 return NULL;
6766
6767 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006768 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006769 return NULL;
6770 }
6771
Charles-François Natali60713592011-05-20 16:55:06 +02006772 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006773}
6774
6775PyDoc_STRVAR(if_indextoname_doc,
6776"if_indextoname(if_index)\n\
6777\n\
6778Returns the interface name corresponding to the interface index if_index.");
6779
6780#endif /* HAVE_IF_NAMEINDEX */
6781
6782
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006783#ifdef CMSG_LEN
6784/* Python interface to CMSG_LEN(length). */
6785
6786static PyObject *
6787socket_CMSG_LEN(PyObject *self, PyObject *args)
6788{
6789 Py_ssize_t length;
6790 size_t result;
6791
6792 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6793 return NULL;
6794 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6795 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6796 return NULL;
6797 }
6798 return PyLong_FromSize_t(result);
6799}
6800
6801PyDoc_STRVAR(CMSG_LEN_doc,
6802"CMSG_LEN(length) -> control message length\n\
6803\n\
6804Return the total length, without trailing padding, of an ancillary\n\
6805data item with associated data of the given length. This value can\n\
6806often be used as the buffer size for recvmsg() to receive a single\n\
6807item of ancillary data, but RFC 3542 requires portable applications to\n\
6808use CMSG_SPACE() and thus include space for padding, even when the\n\
6809item will be the last in the buffer. Raises OverflowError if length\n\
6810is outside the permissible range of values.");
6811
6812
6813#ifdef CMSG_SPACE
6814/* Python interface to CMSG_SPACE(length). */
6815
6816static PyObject *
6817socket_CMSG_SPACE(PyObject *self, PyObject *args)
6818{
6819 Py_ssize_t length;
6820 size_t result;
6821
6822 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6823 return NULL;
6824 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6825 PyErr_SetString(PyExc_OverflowError,
6826 "CMSG_SPACE() argument out of range");
6827 return NULL;
6828 }
6829 return PyLong_FromSize_t(result);
6830}
6831
6832PyDoc_STRVAR(CMSG_SPACE_doc,
6833"CMSG_SPACE(length) -> buffer size\n\
6834\n\
6835Return the buffer size needed for recvmsg() to receive an ancillary\n\
6836data item with associated data of the given length, along with any\n\
6837trailing padding. The buffer space needed to receive multiple items\n\
6838is the sum of the CMSG_SPACE() values for their associated data\n\
6839lengths. Raises OverflowError if length is outside the permissible\n\
6840range of values.");
6841#endif /* CMSG_SPACE */
6842#endif /* CMSG_LEN */
6843
6844
Guido van Rossum30a685f1991-06-27 15:51:29 +00006845/* List of functions exported by this module. */
6846
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006847static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848 {"gethostbyname", socket_gethostbyname,
6849 METH_VARARGS, gethostbyname_doc},
6850 {"gethostbyname_ex", socket_gethostbyname_ex,
6851 METH_VARARGS, ghbn_ex_doc},
6852 {"gethostbyaddr", socket_gethostbyaddr,
6853 METH_VARARGS, gethostbyaddr_doc},
6854 {"gethostname", socket_gethostname,
6855 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006856#ifdef HAVE_SETHOSTNAME
6857 {"sethostname", socket_sethostname,
6858 METH_VARARGS, sethostname_doc},
6859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860 {"getservbyname", socket_getservbyname,
6861 METH_VARARGS, getservbyname_doc},
6862 {"getservbyport", socket_getservbyport,
6863 METH_VARARGS, getservbyport_doc},
6864 {"getprotobyname", socket_getprotobyname,
6865 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006866 {"close", socket_close,
6867 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006868#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 {"dup", socket_dup,
6870 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006871#endif
Dave Cole331708b2004-08-09 04:51:41 +00006872#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 {"socketpair", socket_socketpair,
6874 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 {"ntohs", socket_ntohs,
6877 METH_VARARGS, ntohs_doc},
6878 {"ntohl", socket_ntohl,
6879 METH_O, ntohl_doc},
6880 {"htons", socket_htons,
6881 METH_VARARGS, htons_doc},
6882 {"htonl", socket_htonl,
6883 METH_O, htonl_doc},
6884 {"inet_aton", socket_inet_aton,
6885 METH_VARARGS, inet_aton_doc},
6886 {"inet_ntoa", socket_inet_ntoa,
6887 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006888#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889 {"inet_pton", socket_inet_pton,
6890 METH_VARARGS, inet_pton_doc},
6891 {"inet_ntop", socket_inet_ntop,
6892 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006893#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006894 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006895 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896 {"getnameinfo", socket_getnameinfo,
6897 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306898 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 METH_NOARGS, getdefaulttimeout_doc},
6900 {"setdefaulttimeout", socket_setdefaulttimeout,
6901 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006902#ifdef HAVE_IF_NAMEINDEX
6903 {"if_nameindex", socket_if_nameindex,
6904 METH_NOARGS, if_nameindex_doc},
6905 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006906 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006907 {"if_indextoname", socket_if_indextoname,
6908 METH_O, if_indextoname_doc},
6909#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006910#ifdef CMSG_LEN
6911 {"CMSG_LEN", socket_CMSG_LEN,
6912 METH_VARARGS, CMSG_LEN_doc},
6913#ifdef CMSG_SPACE
6914 {"CMSG_SPACE", socket_CMSG_SPACE,
6915 METH_VARARGS, CMSG_SPACE_doc},
6916#endif
6917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006918 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006919};
6920
Guido van Rossum30a685f1991-06-27 15:51:29 +00006921
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006922#ifdef MS_WINDOWS
6923#define OS_INIT_DEFINED
6924
6925/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006926
6927static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006928os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006931}
6932
6933static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006934os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 WSADATA WSAData;
6937 int ret;
6938 ret = WSAStartup(0x0101, &WSAData);
6939 switch (ret) {
6940 case 0: /* No error */
6941 Py_AtExit(os_cleanup);
6942 return 1; /* Success */
6943 case WSASYSNOTREADY:
6944 PyErr_SetString(PyExc_ImportError,
6945 "WSAStartup failed: network not ready");
6946 break;
6947 case WSAVERNOTSUPPORTED:
6948 case WSAEINVAL:
6949 PyErr_SetString(
6950 PyExc_ImportError,
6951 "WSAStartup failed: requested version not supported");
6952 break;
6953 default:
6954 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6955 break;
6956 }
6957 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006958}
6959
Guido van Rossum8d665e61996-06-26 18:22:49 +00006960#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006961
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006962
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006963
6964#ifndef OS_INIT_DEFINED
6965static int
6966os_init(void)
6967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006969}
6970#endif
6971
6972
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006973/* C API table - always add new things to the end for binary
6974 compatibility. */
6975static
6976PySocketModule_APIObject PySocketModuleAPI =
6977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006979 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006981};
6982
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006983
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006984/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006985
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006986 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006987 "socket.py" which implements some additional functionality.
6988 The import of "_socket" may fail with an ImportError exception if
6989 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006990 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006991 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006992*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006994PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006995"Implementation module for socket operations.\n\
6996\n\
6997See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006998
Martin v. Löwis1a214512008-06-11 05:26:20 +00006999static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007000 PyModuleDef_HEAD_INIT,
7001 PySocket_MODULE_NAME,
7002 socket_doc,
7003 -1,
7004 socket_methods,
7005 NULL,
7006 NULL,
7007 NULL,
7008 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007009};
7010
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007011PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007012PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007016 if (!os_init())
7017 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007018
Victor Stinnerdaf45552013-08-28 00:53:59 +02007019#ifdef MS_WINDOWS
7020 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007021 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007022 }
7023#endif
7024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007025 Py_TYPE(&sock_type) = &PyType_Type;
7026 m = PyModule_Create(&socketmodule);
7027 if (m == NULL)
7028 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007029
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007030 Py_INCREF(PyExc_OSError);
7031 PySocketModuleAPI.error = PyExc_OSError;
7032 Py_INCREF(PyExc_OSError);
7033 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007035 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 if (socket_herror == NULL)
7037 return NULL;
7038 Py_INCREF(socket_herror);
7039 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007040 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041 NULL);
7042 if (socket_gaierror == NULL)
7043 return NULL;
7044 Py_INCREF(socket_gaierror);
7045 PyModule_AddObject(m, "gaierror", socket_gaierror);
7046 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007047 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048 if (socket_timeout == NULL)
7049 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007050 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051 Py_INCREF(socket_timeout);
7052 PyModule_AddObject(m, "timeout", socket_timeout);
7053 Py_INCREF((PyObject *)&sock_type);
7054 if (PyModule_AddObject(m, "SocketType",
7055 (PyObject *)&sock_type) != 0)
7056 return NULL;
7057 Py_INCREF((PyObject *)&sock_type);
7058 if (PyModule_AddObject(m, "socket",
7059 (PyObject *)&sock_type) != 0)
7060 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007061
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007062#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007064#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007067 Py_INCREF(has_ipv6);
7068 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007070 /* Export C API */
7071 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7072 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7073 ) != 0)
7074 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007076 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007077#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007079#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007081#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007083#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007084#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007087#endif
7088#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007090#endif
7091#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007094#endif
7095#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007096 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007097 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007098#endif
7099#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007102#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007103#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007106#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007107#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007109 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007110#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007111#ifdef HAVE_SOCKADDR_ALG
7112 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7113#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007117#endif
7118#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007120#endif
7121#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007124#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007125#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007128#endif
7129#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007132#endif
7133#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007134 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007136#endif
7137#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007140#endif
7141#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, AF_NETLINK);
7144 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007145#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007147#endif
7148#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007150#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007151 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7152 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007153#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007155#endif
7156#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007158#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007159#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007161#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007162#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007163 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007164#endif
7165#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007167#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007169#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007171#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007172#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007174#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007175#ifdef NETLINK_CRYPTO
7176 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7177#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007178#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007179
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007180#ifdef AF_QIPCRTR
7181 /* Qualcomm IPCROUTER */
7182 PyModule_AddIntMacro(m, AF_QIPCRTR);
7183#endif
7184
caaveryeffc12f2017-09-06 18:18:10 -04007185#ifdef AF_VSOCK
7186 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7187 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7188 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7189 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7190 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7191 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7192 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7193 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7194 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7195#endif
7196
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007197#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007200#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007201#ifdef AF_LINK
7202 PyModule_AddIntMacro(m, AF_LINK);
7203#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007204#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007207#endif
7208#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007211#endif
7212#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007215#endif
7216#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007219#endif
7220#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007223#endif
7224#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007227#endif
7228#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007231#endif
7232#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007235#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007236
Hye-Shik Chang81268602004-02-02 06:05:24 +00007237#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7239 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7240 PyModule_AddIntMacro(m, BTPROTO_HCI);
7241 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007242#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007244#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007245#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007246#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007247 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007248#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7250 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007251#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7254 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007255#endif
7256
Charles-François Natali47413c12011-10-06 19:47:44 +02007257#ifdef AF_CAN
7258 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007260#endif
7261#ifdef PF_CAN
7262 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007264#endif
7265
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007266/* Reliable Datagram Sockets */
7267#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007268 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007269#endif
7270#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007272#endif
7273
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007274/* Kernel event messages */
7275#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007277#endif
7278#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007280#endif
7281
Antoine Pitroub156a462010-10-27 20:13:57 +00007282#ifdef AF_PACKET
7283 PyModule_AddIntMacro(m, AF_PACKET);
7284#endif
7285#ifdef PF_PACKET
7286 PyModule_AddIntMacro(m, PF_PACKET);
7287#endif
7288#ifdef PACKET_HOST
7289 PyModule_AddIntMacro(m, PACKET_HOST);
7290#endif
7291#ifdef PACKET_BROADCAST
7292 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7293#endif
7294#ifdef PACKET_MULTICAST
7295 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7296#endif
7297#ifdef PACKET_OTHERHOST
7298 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7299#endif
7300#ifdef PACKET_OUTGOING
7301 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7302#endif
7303#ifdef PACKET_LOOPBACK
7304 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7305#endif
7306#ifdef PACKET_FASTROUTE
7307 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007308#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007309
Christian Heimes043d6f62008-01-07 17:19:16 +00007310#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7315 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7316 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007317
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7319 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7320 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, SOL_TIPC);
7324 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7325 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7326 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7327 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007328
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7330 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7331 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7332 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7336 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007337#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007340#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7342 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7343 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7344 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7345 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7346 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007347#endif
7348
Christian Heimesdffa3942016-09-05 23:54:41 +02007349#ifdef HAVE_SOCKADDR_ALG
7350 /* Socket options */
7351 PyModule_AddIntMacro(m, ALG_SET_KEY);
7352 PyModule_AddIntMacro(m, ALG_SET_IV);
7353 PyModule_AddIntMacro(m, ALG_SET_OP);
7354 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7355 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7356 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7357
7358 /* Operations */
7359 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7360 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7361 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7362 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7363#endif
7364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007365 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007366 PyModule_AddIntMacro(m, SOCK_STREAM);
7367 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007368/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007369#ifdef SOCK_RAW
7370 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007372#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007374#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007376#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007377#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007379#endif
7380#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007382#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007384#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007390#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007392#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007393#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007395#endif
7396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007414#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007415#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007417 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007418#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007441#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007444#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007445 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007446#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007447#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007448 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007449#endif
7450#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007451 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007452#endif
7453#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007454 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007455#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007456#ifdef SO_PASSSEC
7457 PyModule_AddIntMacro(m, SO_PASSSEC);
7458#endif
7459#ifdef SO_PEERSEC
7460 PyModule_AddIntMacro(m, SO_PEERSEC);
7461#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007462#ifdef SO_BINDTODEVICE
7463 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7464#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007465#ifdef SO_PRIORITY
7466 PyModule_AddIntMacro(m, SO_PRIORITY);
7467#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007468#ifdef SO_MARK
7469 PyModule_AddIntMacro(m, SO_MARK);
7470#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007471#ifdef SO_DOMAIN
7472 PyModule_AddIntMacro(m, SO_DOMAIN);
7473#endif
7474#ifdef SO_PROTOCOL
7475 PyModule_AddIntMacro(m, SO_PROTOCOL);
7476#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478 /* Maximum number of connections for "listen" */
7479#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007482 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
7484
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007485 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007486#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007488#endif
7489#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007491#endif
7492#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007494#endif
7495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496 /* Flags for send, recv */
7497#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007500#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007501 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007503#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007504 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007506#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007507 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007509#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007510 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007512#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007513 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007519 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007521#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007522 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007524#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007527#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007528 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007529#endif
7530#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007531 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007532#endif
7533#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007534 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007535#endif
7536#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007538#endif
7539#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007541#endif
7542#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007544#endif
7545#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007547#endif
7548#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007550#endif
7551#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007553#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007554#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007556#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558 /* Protocol level and numbers, usable for [gs]etsockopt */
7559#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007560 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007562#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007563 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007570#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007576#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007579#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007587#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007590 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007591#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007592#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007593 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007594#endif
7595#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7597 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007598#endif
7599#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7601 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7602 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007603
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7605 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7606 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007607#ifdef CAN_ISOTP
7608 PyModule_AddIntMacro(m, CAN_ISOTP);
7609#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007610#endif
7611#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7613 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7614 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7615 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007616#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007617#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7618 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7619#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007620#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007622 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7623 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7624 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7625 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7626 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7627 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7628 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7629 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7630 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7631 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7632 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7633 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7634#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007635#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007637#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007638#ifdef HAVE_SOCKADDR_ALG
7639 PyModule_AddIntMacro(m, SOL_ALG);
7640#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007641#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007643#endif
7644#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007646#endif
7647#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007649#endif
7650#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007652#endif
7653#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007655#endif
7656#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007661#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007664#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007667#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007669#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007670 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007672#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007673 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007675#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007676 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007678#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007679 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007681#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007682 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007685 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007687#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007688 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007689#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007692#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007693 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007695#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007696 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007699 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007700#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007701 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007706#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007715#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007716 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007718#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007719 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007721#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007724#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007725 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007728 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007730#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007731 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007733#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007734 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007736#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007737 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007739#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007740 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007742#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007743 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007745#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007746 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007748#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007749 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007751#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007752 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007754#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007755 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007757#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007758 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007759#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007760#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007761 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007763#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007765#endif
7766/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007767#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007769#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007770 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007772#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007774#endif
7775
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007776#ifdef MS_WINDOWS
7777 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7778 PyModule_AddIntMacro(m, IPPROTO_ST);
7779 PyModule_AddIntMacro(m, IPPROTO_CBT);
7780 PyModule_AddIntMacro(m, IPPROTO_IGP);
7781 PyModule_AddIntMacro(m, IPPROTO_RDP);
7782 PyModule_AddIntMacro(m, IPPROTO_PGM);
7783 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7784 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7785#endif
7786
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007787#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007789#endif
7790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007791 /* Some port configuration */
7792#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007793 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007794#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007795 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007797#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007799#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007800 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007801#endif
7802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007803 /* Some reserved IP v.4 addresses */
7804#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007806#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007807 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007809#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007810 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007811#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007812 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007814#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007815 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007816#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007817 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007821#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007824#ifdef INADDR_ALLHOSTS_GROUP
7825 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7826 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007827#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007828 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007830#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007831 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007832#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007833 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007835#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007837#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007838 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007839#endif
7840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007841 /* IPv4 [gs]etsockopt options */
7842#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007843 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007845#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007846 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007848#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007849 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007851#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007852 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007854#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007855 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007857#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007858 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007860#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007861 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007863#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007864 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007866#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007867 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007869#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007871#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007872#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007875#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007876 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007877#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007878#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007881#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007884#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007885 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007887#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007889#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007890#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007892#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007894 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7895#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007896 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007898#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007901#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007902 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007904#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007905 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007907#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007908 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007910#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007911 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007913 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007914#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007915 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007917 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007918#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007919 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007920#endif
7921#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007922 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007923#endif
7924#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007925 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007926#endif
7927#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007928 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007929#endif
7930#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007931 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007932#endif
7933#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007934 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007935#endif
7936#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007937 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007938#endif
7939#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007940 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007941#endif
7942#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007943 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007944#endif
7945#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007946 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007947#endif
7948#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007949 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007950#endif
7951#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007952 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007953#endif
7954#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007955 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007956#endif
7957#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007958 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007959#endif
7960#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007961 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007962#endif
7963#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007965#endif
7966#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007968#endif
7969#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007970 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007971#endif
7972#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007974#endif
7975#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007976 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007977#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007979 /* TCP options */
7980#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007981 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007983#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007984 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007986#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007987 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007989#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007990 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007992#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007993 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007995#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007996 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007998#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008001#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008002 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008004#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008005 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008007#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008008 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008010#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008013#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008014 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008015#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008016#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008017 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008018#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008019#ifdef TCP_CONGESTION
8020 PyModule_AddIntMacro(m, TCP_CONGESTION);
8021#endif
8022#ifdef TCP_USER_TIMEOUT
8023 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8024#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008025#ifdef TCP_NOTSENT_LOWAT
8026 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8027#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008029 /* IPX options */
8030#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008031 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008032#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008033
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008034/* Reliable Datagram Sockets */
8035#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008036 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008037#endif
8038#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008039 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008040#endif
8041#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008042 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008043#endif
8044#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008045 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008046#endif
8047#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008048 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008049#endif
8050#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008051 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008052#endif
8053#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008054 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008055#endif
8056#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008057 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008058#endif
8059#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008060 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008061#endif
8062#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008063 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008064#endif
8065#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008066 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008067#endif
8068#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008069 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008070#endif
8071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008072 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008073#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008074 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008075#endif
8076#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008077 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008078#endif
8079#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008080 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008081#endif
8082#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008083 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008084#endif
8085#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008086 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008087#endif
8088#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008089 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008090#endif
8091#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008092 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008093#endif
8094#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008095 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008096#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008097#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008098 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008099#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008100#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008101 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008102#endif
8103#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008105#endif
8106#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008108#endif
8109#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008111#endif
8112#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008114#endif
8115#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008117#endif
8118#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008120#endif
8121#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008123#endif
8124#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008126#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008127#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008129#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008130#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008132#endif
8133#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008135#endif
8136#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008138#endif
8139#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008140 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008141#endif
8142#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008143 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008144#endif
8145#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008146 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008147#endif
8148#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008149 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008150#endif
8151#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008152 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008153#endif
8154#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008155 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008156#endif
8157#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008158 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008159#endif
8160#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008161 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008162#endif
8163#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008164 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008165#endif
8166#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008167 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008168#endif
8169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008170 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008171#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008172 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008173#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008174 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008175#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008176 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008177#endif
8178#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008179 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008180#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008181 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008182#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008183 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008184#endif
8185#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008186 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008187#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008188 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008189#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008190 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008191#endif
8192
Christian Heimesfaf2f632008-01-06 16:59:19 +00008193#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008194 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008195 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8196#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008197 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008198#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008199 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008200 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8201#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008202 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008203#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008204 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008205 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008206 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008207 PyObject *tmp;
8208 tmp = PyLong_FromUnsignedLong(codes[i]);
8209 if (tmp == NULL)
8210 return NULL;
8211 PyModule_AddObject(m, names[i], tmp);
8212 }
8213 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, RCVALL_OFF);
8215 PyModule_AddIntMacro(m, RCVALL_ON);
8216 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008217#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008218 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008219#endif
8220#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008221 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008222#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008223#endif /* _MSTCPIP_ */
8224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008225 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008226#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008227 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008228#endif
animalize19e7d482018-02-27 02:10:36 +08008229
8230#ifdef MS_WINDOWS
8231 /* remove some flags on older version Windows during run-time */
8232 remove_unusable_flags(m);
8233#endif
8234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008235 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008236}