blob: 5dc5f4e0d397b4e0c91beb1c6af6f8c73ca240c5 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Bjorn Anderssonbb816512018-09-26 06:47:52 -070010 portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are
11 supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Bjorn Anderssonbb816512018-09-26 06:47:52 -070058- an AF_QIPCRTR socket address is a (node, port) tuple where the
59 node and port are non-negative integers.
Christian Heimes043d6f62008-01-07 17:19:16 +000060- an AF_TIPC socket address is expressed as
61 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000063 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000065 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if addr_type is TIPC_ADDR_NAME:
67 v1 is the server type
68 v2 is the port identifier
69 v3 is ignored
70 if addr_type is TIPC_ADDR_NAMESEQ:
71 v1 is the server type
72 v2 is the lower port number
73 v3 is the upper port number
74 if addr_type is TIPC_ADDR_ID:
75 v1 is the node
76 v2 is the ref
77 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000078
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000082- names starting with sock_ are socket object methods
83- names starting with socket_ are module-level functions
84- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Thomas Wouters477c8d52006-05-27 19:21:47 +000088#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110089#include <AvailabilityMacros.h>
90/* for getaddrinfo thread safety test on old versions of OS X */
91#ifndef MAC_OS_X_VERSION_10_5
92#define MAC_OS_X_VERSION_10_5 1050
93#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 /*
95 * inet_aton is not available on OSX 10.3, yet we want to use a binary
96 * that was build on 10.4 or later to work on that release, weak linking
97 * comes to the rescue.
98 */
99# pragma weak inet_aton
100#endif
101
Inada Naokie9a1dcb2019-03-20 19:02:46 +0900102#define PY_SSIZE_T_CLEAN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000103#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000104#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105
Gregory P. Smithb474e672018-12-30 17:05:36 -0800106#ifdef _Py_MEMORY_SANITIZER
107# include <sanitizer/msan_interface.h>
108#endif
109
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000110/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000111PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100112"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
113socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
115Open a socket of the given type. The family argument specifies the\n\
116address family; it defaults to AF_INET. The type argument specifies\n\
117whether this is a stream (SOCK_STREAM, this is the default)\n\
118or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
119specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200120The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000121\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100122When a fileno is passed in, family, type and proto are auto-detected,\n\
123unless they are explicitly set.\n\
124\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125A socket object represents one endpoint of a network connection.\n\
126\n\
127Methods of socket objects (keyword arguments not allowed):\n\
128\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000129_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130bind(addr) -- bind the socket to a local address\n\
131close() -- close the socket\n\
132connect(addr) -- connect the socket to a remote address\n\
133connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200134dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135fileno() -- return underlying file descriptor\n\
136getpeername() -- return remote address [*]\n\
137getsockname() -- return local address\n\
138getsockopt(level, optname[, buflen]) -- get socket options\n\
139gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100140listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000141recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000142recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000144recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000145 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000146sendall(data[, flags]) -- send all data\n\
147send(data[, flags]) -- send data, may not send all of it\n\
148sendto(data[, flags], addr) -- send data to a given address\n\
149setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500150getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200151setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000152settimeout(None | float) -- set or clear the timeout\n\
153shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700154if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700155if_nametoindex(name) -- return the corresponding interface index\n\
156if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000157\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000158 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000159
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000160/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000161 I hope some day someone can clean this up please... */
162
Guido van Rossum9376b741999-09-15 22:01:40 +0000163/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
164 script doesn't get this right, so we hardcode some platform checks below.
165 On the other hand, not all Linux versions agree, so there the settings
166 computed by the configure script are needed! */
167
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700168#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# undef HAVE_GETHOSTBYNAME_R_3_ARG
170# undef HAVE_GETHOSTBYNAME_R_5_ARG
171# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000172#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000173
Victor Stinner710d27e2011-08-23 10:57:32 +0200174#if defined(__OpenBSD__)
175# include <sys/uio.h>
176#endif
177
Stefan Krah1f9eb872016-05-22 17:35:34 +0200178#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000180#endif
181
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000183# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# define HAVE_GETHOSTBYNAME_R_3_ARG
185# elif defined(__sun) || defined(__sgi)
186# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700187# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000188/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000189# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
190# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000191# else
192# undef HAVE_GETHOSTBYNAME_R
193# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000194#endif
195
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200196#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000198#endif
199
Ned Deilye1d4e582016-02-23 22:05:29 +1100200/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000201#ifdef HAVE_SYS_PARAM_H
202#include <sys/param.h>
203#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000204/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100205 (this includes the getaddrinfo emulation) protect access with a lock.
206
207 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
208 a mix of code including an unsafe implementation from an old BSD's
209 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
210 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100212
Ned Deilye1d4e582016-02-23 22:05:29 +1100213 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
214 http://www.openbsd.org/plus54.html
215
216 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
217
218http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100219 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200220#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100221 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000222 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100223 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
224 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100225 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000226#define USE_GETADDRINFO_LOCK
227#endif
228
229#ifdef USE_GETADDRINFO_LOCK
230#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
231#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
232#else
233#define ACQUIRE_GETADDRINFO_LOCK
234#define RELEASE_GETADDRINFO_LOCK
235#endif
236
237#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000239#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241
Serhiy Storchakad3187152017-11-09 18:00:38 +0200242#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243# include <sys/ioctl.h>
244#endif
245
246
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000247#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248/* make sure that the reentrant (gethostbyaddr_r etc)
249 functions are declared correctly if compiling with
250 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Thomas Wouters477c8d52006-05-27 19:21:47 +0000252/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000255#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000256
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000257#undef _XOPEN_SOURCE
258#include <sys/socket.h>
259#include <sys/types.h>
260#include <netinet/in.h>
261#ifdef _SS_ALIGNSIZE
262#define HAVE_GETADDRINFO 1
263#define HAVE_GETNAMEINFO 1
264#endif
265
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000266#define HAVE_INET_PTON
267#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000268#endif
269
Benjamin Peterson06930632017-09-04 16:36:05 -0700270/* Solaris fails to define this variable at all. */
Jakub Kulík6f9bc722018-12-31 03:16:40 +0100271#if (defined(__sun) && defined(__SVR4)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000272#define INET_ADDRSTRLEN 16
273#endif
274
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000276#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000277#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000278#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700280#ifdef HAVE_SYS_SOCKET_H
281#include <sys/socket.h>
282#endif
283
284#ifdef HAVE_NET_IF_H
285#include <net/if.h>
286#endif
287
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000288/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000289#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000290#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291
292/* Addressing includes */
293
Guido van Rossum6f489d91996-06-28 20:15:15 +0000294#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295
296/* Non-MS WINDOWS includes */
297# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000298# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000299
Guido van Rossum9376b741999-09-15 22:01:40 +0000300/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000305#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000308# ifdef HAVE_FCNTL_H
309# include <fcntl.h>
310# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100312/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
313#ifdef MS_WINDOWS
314#define IPPROTO_ICMP IPPROTO_ICMP
315#define IPPROTO_IGMP IPPROTO_IGMP
316#define IPPROTO_GGP IPPROTO_GGP
317#define IPPROTO_TCP IPPROTO_TCP
318#define IPPROTO_PUP IPPROTO_PUP
319#define IPPROTO_UDP IPPROTO_UDP
320#define IPPROTO_IDP IPPROTO_IDP
321#define IPPROTO_ND IPPROTO_ND
322#define IPPROTO_RAW IPPROTO_RAW
323#define IPPROTO_MAX IPPROTO_MAX
324#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
325#define IPPROTO_IPV4 IPPROTO_IPV4
326#define IPPROTO_IPV6 IPPROTO_IPV6
327#define IPPROTO_ROUTING IPPROTO_ROUTING
328#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
329#define IPPROTO_ESP IPPROTO_ESP
330#define IPPROTO_AH IPPROTO_AH
331#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
332#define IPPROTO_NONE IPPROTO_NONE
333#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
334#define IPPROTO_EGP IPPROTO_EGP
335#define IPPROTO_PIM IPPROTO_PIM
336#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
337#define IPPROTO_ST IPPROTO_ST // WinSock2 only
338#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
339#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
340#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
341#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
342#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
343#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
344#endif /* MS_WINDOWS */
345
Steve Dower65e4cb12014-11-22 12:54:57 -0800346/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200347#include <versionhelpers.h>
Zackery Spytz8f96c9f2019-05-29 15:02:37 -0600348// For if_nametoindex() and if_indextoname()
349#include <iphlpapi.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800350
animalize19e7d482018-02-27 02:10:36 +0800351/* remove some flags on older version Windows during run-time.
352 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
353typedef struct {
354 DWORD build_number; /* available starting with this Win10 BuildNumber */
355 const char flag_name[20];
356} FlagRuntimeInfo;
357
358/* IMPORTANT: make sure the list ordered by descending build_number */
359static FlagRuntimeInfo win_runtime_flags[] = {
360 /* available starting with Windows 10 1709 */
361 {16299, "TCP_KEEPIDLE"},
362 {16299, "TCP_KEEPINTVL"},
363 /* available starting with Windows 10 1703 */
364 {15063, "TCP_KEEPCNT"},
365 /* available starting with Windows 10 1607 */
366 {14393, "TCP_FASTOPEN"}
367};
368
369static void
370remove_unusable_flags(PyObject *m)
371{
372 PyObject *dict;
373 OSVERSIONINFOEX info;
374 DWORDLONG dwlConditionMask;
375
376 dict = PyModule_GetDict(m);
377 if (dict == NULL) {
378 return;
379 }
380
381 /* set to Windows 10, except BuildNumber. */
382 memset(&info, 0, sizeof(info));
383 info.dwOSVersionInfoSize = sizeof(info);
384 info.dwMajorVersion = 10;
385 info.dwMinorVersion = 0;
386
387 /* set Condition Mask */
388 dwlConditionMask = 0;
389 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
390 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
391 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
392
393 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
394 info.dwBuildNumber = win_runtime_flags[i].build_number;
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +0100395 /* greater than or equal to the specified version?
animalize19e7d482018-02-27 02:10:36 +0800396 Compatibility Mode will not cheat VerifyVersionInfo(...) */
397 if (VerifyVersionInfo(
398 &info,
399 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
400 dwlConditionMask)) {
401 break;
402 }
403 else {
404 if (PyDict_GetItemString(
405 dict,
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200406 win_runtime_flags[i].flag_name) != NULL)
407 {
408 if (PyDict_DelItemString(
409 dict,
410 win_runtime_flags[i].flag_name))
411 {
412 PyErr_Clear();
413 }
animalize19e7d482018-02-27 02:10:36 +0800414 }
415 }
416 }
417}
418
Jeremy Hylton22308652001-02-02 03:23:09 +0000419#endif
420
Skip Montanaro7befb992004-02-10 16:50:21 +0000421#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000422
Neal Norwitz39d22e52002-11-02 19:55:21 +0000423#ifndef O_NONBLOCK
424# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000425#endif
426
Trent Micka708d6e2004-09-07 17:48:26 +0000427/* include Python's addrinfo.h unless it causes trouble */
428#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
429 /* Do not include addinfo.h on some newer IRIX versions.
430 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
431 * for example, but not by 6.5.10.
432 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000433#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000434 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
435 * EAI_* constants are defined in (the already included) ws2tcpip.h.
436 */
437#else
438# include "addrinfo.h"
439#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000440
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000441#ifdef __APPLE__
442/* On OS X, getaddrinfo returns no error indication of lookup
443 failure, so we must use the emulation instead of the libinfo
444 implementation. Unfortunately, performing an autoconf test
445 for this bug would require DNS access for the machine performing
446 the configuration, which is not acceptable. Therefore, we
447 determine the bug just by checking for __APPLE__. If this bug
448 gets ever fixed, perhaps checking for sys/version.h would be
449 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000450#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600451/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000452 Find to check for Jaguar is that it has getnameinfo(), which
453 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000454#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000455#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000456
457#ifdef HAVE_INET_ATON
458#define USE_INET_ATON_WEAKLINK
459#endif
460
Jack Jansen84262fb2002-07-02 14:40:42 +0000461#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000462
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000463/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000464#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000465/* avoid clashes with the C library definition of the symbol. */
466#define getaddrinfo fake_getaddrinfo
467#define gai_strerror fake_gai_strerror
468#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000469#include "getaddrinfo.c"
470#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000471#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000472#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000473#include "getnameinfo.c"
474#endif
475
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000476#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000477#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000478#endif
479
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000481#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482#define EAFNOSUPPORT WSAEAFNOSUPPORT
483#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000484#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000485
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000486#ifndef SOCKETCLOSE
487#define SOCKETCLOSE close
488#endif
489
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000490#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000491#define USE_BLUETOOTH 1
492#if defined(__FreeBSD__)
493#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
494#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000495#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000496#define SOL_HCI SOL_HCI_RAW
497#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000498#define sockaddr_l2 sockaddr_l2cap
499#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000501#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
502#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000503#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000504#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000505#define sockaddr_l2 sockaddr_bt
506#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000507#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000508#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000509#define SOL_HCI BTPROTO_HCI
510#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000511#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
512#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000513#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000515#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000516#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
517#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000518#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000519#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
520#endif
521#endif
522
Charles-François Natali8b759652011-12-23 16:44:51 +0100523/* Convert "sock_addr_t *" to "struct sockaddr *". */
524#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000525
Martin v. Löwise9416172003-05-03 10:12:45 +0000526/*
527 * Constants for getnameinfo()
528 */
529#if !defined(NI_MAXHOST)
530#define NI_MAXHOST 1025
531#endif
532#if !defined(NI_MAXSERV)
533#define NI_MAXSERV 32
534#endif
535
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000536#ifndef INVALID_SOCKET /* MS defines this */
537#define INVALID_SOCKET (-1)
538#endif
539
Charles-François Natali0cc86852013-09-13 19:53:08 +0200540#ifndef INADDR_NONE
541#define INADDR_NONE (-1)
542#endif
543
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000544/* XXX There's a problem here: *static* functions are not supposed to have
545 a Py prefix (or use CapitalizedWords). Later... */
546
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547/* Global variable holding the exception type for errors detected
548 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000549static PyObject *socket_herror;
550static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000551static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000552
Tim Peters643a7fc2002-02-17 04:13:21 +0000553/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000554 The sock_type variable contains pointers to various functions,
555 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000556 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000557static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000558
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000559#if defined(HAVE_POLL_H)
560#include <poll.h>
561#elif defined(HAVE_SYS_POLL_H)
562#include <sys/poll.h>
563#endif
564
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000565/* Largest value to try to store in a socklen_t (used when handling
566 ancillary data). POSIX requires socklen_t to hold at least
567 (2**31)-1 and recommends against storing larger values, but
568 socklen_t was originally int in the BSD interface, so to be on the
569 safe side we use the smaller of (2**31)-1 and INT_MAX. */
570#if INT_MAX > 0x7fffffff
571#define SOCKLEN_T_LIMIT 0x7fffffff
572#else
573#define SOCKLEN_T_LIMIT INT_MAX
574#endif
575
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200576#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000577/* Instead of select(), we'll use poll() since poll() works on any fd. */
578#define IS_SELECTABLE(s) 1
579/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000580#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200581/* If there's no timeout left, we don't have to call select, so it's a safe,
582 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100583#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000584#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000585
586static PyObject*
587select_error(void)
588{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200589 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000591}
592
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000593#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000594#ifndef WSAEAGAIN
595#define WSAEAGAIN WSAEWOULDBLOCK
596#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000597#define CHECK_ERRNO(expected) \
598 (WSAGetLastError() == WSA ## expected)
599#else
600#define CHECK_ERRNO(expected) \
601 (errno == expected)
602#endif
603
Victor Stinnerdaf45552013-08-28 00:53:59 +0200604#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200605# define GET_SOCK_ERROR WSAGetLastError()
606# define SET_SOCK_ERROR(err) WSASetLastError(err)
607# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
608# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
609#else
610# define GET_SOCK_ERROR errno
611# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
612# define SOCK_TIMEOUT_ERR EWOULDBLOCK
613# define SOCK_INPROGRESS_ERR EINPROGRESS
614#endif
615
Erik Janssens874809e2018-09-05 08:29:42 +0200616#ifdef _MSC_VER
617# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
618#else
619# define SUPPRESS_DEPRECATED_CALL
620#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200621
622#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200623/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
624static int support_wsa_no_inherit = -1;
625#endif
626
Guido van Rossum30a685f1991-06-27 15:51:29 +0000627/* Convenience function to raise an error according to errno
628 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629
Guido van Rossum73624e91994-10-10 17:59:00 +0000630static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000631set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000633#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 int err_no = WSAGetLastError();
635 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
636 recognizes the error codes used by both GetLastError() and
637 WSAGetLastError */
638 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200639 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000640#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000641
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200642 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643}
644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000647set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650
651#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (v != NULL) {
657 PyErr_SetObject(socket_herror, v);
658 Py_DECREF(v);
659 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662}
663
664
665static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000666set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669
Martin v. Löwis272cb402002-03-01 08:31:07 +0000670#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 /* EAI_SYSTEM is not available on Windows XP. */
672 if (error == EAI_SYSTEM)
673 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000674#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000676#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 if (v != NULL) {
682 PyErr_SetObject(socket_gaierror, v);
683 Py_DECREF(v);
684 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687}
688
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000689/* Function to perform the setting of socket blocking mode
690 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691static int
692internal_setblocking(PySocketSockObject *s, int block)
693{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400694 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200695#ifdef MS_WINDOWS
696 u_long arg;
697#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100698#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100699 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100700 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000701#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000704#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100705#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200707 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400708 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100709#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200711 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400712 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100714 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 else
Victor Stinner9a954832013-12-04 00:41:24 +0100716 new_delay_flag = delay_flag | O_NONBLOCK;
717 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200718 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400719 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100720#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000721#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200722 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200723 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400724 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000725#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400726
727 result = 0;
728
729 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Yury Selivanovfa22b292016-10-18 16:03:52 -0400732 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200733#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400734 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200735#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400736 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200737#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400738 }
739
740 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000741}
742
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000743static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200744internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
745 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100748#ifdef HAVE_POLL
749 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200750 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100751#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200752 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200753 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100754#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000755
Victor Stinnerb7df3142015-03-27 22:59:32 +0100756 /* must be called with the GIL held */
757 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100758
Victor Stinner416f2e62015-03-31 13:56:29 +0200759 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200763 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* Prefer poll, if available, since you can poll() any fd
767 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000768#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100769 pollfd.fd = s->sock_fd;
770 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 if (connect) {
772 /* On Windows, the socket becomes writable on connection success,
773 but a connection failure is notified as an error. On POSIX, the
774 socket becomes writable on connection success or on connection
775 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200776 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000778
Victor Stinner71694d52015-03-28 01:18:54 +0100779 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200780 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200781 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000782
Miss Islington (bot)123f6c42019-08-14 14:47:43 -0700783 /* On some OSes, typically BSD-based ones, the timeout parameter of the
784 poll() syscall, when negative, must be exactly INFTIM, where defined,
785 or -1. See issue 37811. */
786 if (ms < 0) {
787#ifdef INFTIM
788 ms = INFTIM;
789#else
790 ms = -1;
791#endif
792 }
793
Victor Stinner71694d52015-03-28 01:18:54 +0100794 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200795 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100796 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000797#else
Victor Stinnerced11742015-04-09 10:27:25 +0200798 if (interval >= 0) {
799 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
800 tvp = &tv;
801 }
802 else
803 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000804
Victor Stinner71694d52015-03-28 01:18:54 +0100805 FD_ZERO(&fds);
806 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200807 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200808 if (connect) {
809 /* On Windows, the socket becomes writable on connection success,
810 but a connection failure is notified as an error. On POSIX, the
811 socket becomes writable on connection success or on connection
812 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200813 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200814 }
Victor Stinner71694d52015-03-28 01:18:54 +0100815
816 /* See if the socket is ready */
817 Py_BEGIN_ALLOW_THREADS;
818 if (writing)
819 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200820 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100821 else
822 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200823 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100824 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000825#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 if (n < 0)
828 return -1;
829 if (n == 0)
830 return 1;
831 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000832}
833
Victor Stinner31bf2d52015-04-01 21:57:09 +0200834/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000835
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 On error, raise an exception and return -1 if err is set, or fill err and
837 return -1 otherwise. If a signal was received and the signal handler raised
838 an exception, return -1, and set err to -1 if err is set.
839
840 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100841
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842 If the socket has a timeout, wait until the socket is ready before calling
843 the function: wait until the socket is writable if writing is nonzero, wait
844 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100845
Victor Stinner81c41db2015-04-02 11:50:57 +0200846 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200847 the function, except if the signal handler raised an exception (PEP 475).
848
849 When the function is retried, recompute the timeout using a monotonic clock.
850
Victor Stinner81c41db2015-04-02 11:50:57 +0200851 sock_call_ex() must be called with the GIL held. The socket function is
852 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200853static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200854sock_call_ex(PySocketSockObject *s,
855 int writing,
856 int (*sock_func) (PySocketSockObject *s, void *data),
857 void *data,
858 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200859 int *err,
860 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861{
Victor Stinner8912d142015-04-06 23:16:34 +0200862 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200863 _PyTime_t deadline = 0;
864 int deadline_initialized = 0;
865 int res;
866
867 /* sock_call() must be called with the GIL held. */
868 assert(PyGILState_Check());
869
870 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200871 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200872 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200873 /* For connect(), poll even for blocking socket. The connection
874 runs asynchronously. */
875 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200877 _PyTime_t interval;
878
Victor Stinner81c41db2015-04-02 11:50:57 +0200879 if (deadline_initialized) {
880 /* recompute the timeout */
881 interval = deadline - _PyTime_GetMonotonicClock();
882 }
883 else {
884 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200885 deadline = _PyTime_GetMonotonicClock() + timeout;
886 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200887 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200888
Victor Stinner10550cd2015-04-03 13:22:27 +0200889 if (interval >= 0)
890 res = internal_select(s, writing, interval, connect);
891 else
892 res = 1;
893 }
894 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200895 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200896 }
897
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200899 if (err)
900 *err = GET_SOCK_ERROR;
901
Victor Stinner31bf2d52015-04-01 21:57:09 +0200902 if (CHECK_ERRNO(EINTR)) {
903 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200904 if (PyErr_CheckSignals()) {
905 if (err)
906 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200907 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200908 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200909
910 /* retry select() */
911 continue;
912 }
913
914 /* select() failed */
915 s->errorhandler();
916 return -1;
917 }
918
919 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200920 if (err)
921 *err = SOCK_TIMEOUT_ERR;
922 else
923 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200924 return -1;
925 }
926
927 /* the socket is ready */
928 }
929
Victor Stinner81c41db2015-04-02 11:50:57 +0200930 /* inner loop to retry sock_func() when sock_func() is interrupted
931 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200932 while (1) {
933 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200934 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200935 Py_END_ALLOW_THREADS
936
937 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200938 /* sock_func() succeeded */
939 if (err)
940 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200941 return 0;
942 }
943
Victor Stinner81c41db2015-04-02 11:50:57 +0200944 if (err)
945 *err = GET_SOCK_ERROR;
946
Victor Stinner31bf2d52015-04-01 21:57:09 +0200947 if (!CHECK_ERRNO(EINTR))
948 break;
949
Victor Stinner81c41db2015-04-02 11:50:57 +0200950 /* sock_func() was interrupted by a signal */
951 if (PyErr_CheckSignals()) {
952 if (err)
953 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200954 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200955 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200956
Victor Stinner81c41db2015-04-02 11:50:57 +0200957 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200958 }
959
960 if (s->sock_timeout > 0
961 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200962 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200963
964 For example, select() could indicate a socket is ready for
965 reading, but the data then discarded by the OS because of a
966 wrong checksum.
967
968 Loop on select() to recheck for socket readyness. */
969 continue;
970 }
971
Victor Stinner81c41db2015-04-02 11:50:57 +0200972 /* sock_func() failed */
973 if (!err)
974 s->errorhandler();
975 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000976 return -1;
977 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200978}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000979
Victor Stinner81c41db2015-04-02 11:50:57 +0200980static int
981sock_call(PySocketSockObject *s,
982 int writing,
983 int (*func) (PySocketSockObject *s, void *data),
984 void *data)
985{
Victor Stinner8912d142015-04-06 23:16:34 +0200986 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200987}
988
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000989
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000990/* Initialize a new socket object. */
991
Victor Stinner88ed6402015-04-09 10:23:12 +0200992/* Default timeout for new sockets */
993static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000994
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200995static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000996init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 s->sock_fd = fd;
1000 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -05001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -05001003
1004 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
1005 on some OSes as part of socket.type. We want to reset them here,
1006 to make socket.type be set to the same value on all platforms.
1007 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
1008 not portable.
1009 */
1010#ifdef SOCK_NONBLOCK
1011 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
1012#endif
1013#ifdef SOCK_CLOEXEC
1014 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
1015#endif
1016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001020#ifdef SOCK_NONBLOCK
1021 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +01001022 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +00001023 else
1024#endif
1025 {
1026 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001027 if (defaulttimeout >= 0) {
1028 if (internal_setblocking(s, 0) == -1) {
1029 return -1;
1030 }
1031 }
Antoine Pitroub1c54962010-10-14 15:05:38 +00001032 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001033 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001034}
1035
1036
Guido van Rossum30a685f1991-06-27 15:51:29 +00001037/* Create a new socket object.
1038 This just creates the object and initializes it.
1039 If the creation fails, return NULL and set an exception (implicit
1040 in NEWOBJ()). */
1041
Guido van Rossum73624e91994-10-10 17:59:00 +00001042static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001043new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 PySocketSockObject *s;
1046 s = (PySocketSockObject *)
1047 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02001048 if (s == NULL)
1049 return NULL;
1050 if (init_sockobject(s, fd, family, type, proto) == -1) {
1051 Py_DECREF(s);
1052 return NULL;
1053 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001055}
1056
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057
Guido van Rossum48a680c2001-03-02 06:34:14 +00001058/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001059 thread to be in gethostbyname or getaddrinfo */
1060#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001061static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001062#endif
1063
1064
Guido van Rossum30a685f1991-06-27 15:51:29 +00001065/* Convert a string specifying a host name or one of a few symbolic
1066 names to a numeric IP address. This usually calls gethostbyname()
1067 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001068 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001069 an error occurred; then an exception is raised. */
1070
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001071static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001072setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 struct addrinfo hints, *res;
1075 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1078 if (name[0] == '\0') {
1079 int siz;
1080 memset(&hints, 0, sizeof(hints));
1081 hints.ai_family = af;
1082 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1083 hints.ai_flags = AI_PASSIVE;
1084 Py_BEGIN_ALLOW_THREADS
1085 ACQUIRE_GETADDRINFO_LOCK
1086 error = getaddrinfo(NULL, "0", &hints, &res);
1087 Py_END_ALLOW_THREADS
1088 /* We assume that those thread-unsafe getaddrinfo() versions
1089 *are* safe regarding their return value, ie. that a
1090 subsequent call to getaddrinfo() does not destroy the
1091 outcome of the first call. */
1092 RELEASE_GETADDRINFO_LOCK
1093 if (error) {
1094 set_gaierror(error);
1095 return -1;
1096 }
1097 switch (res->ai_family) {
1098 case AF_INET:
1099 siz = 4;
1100 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001101#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 case AF_INET6:
1103 siz = 16;
1104 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 default:
1107 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001108 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 "unsupported address family");
1110 return -1;
1111 }
1112 if (res->ai_next) {
1113 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001114 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 "wildcard resolved to multiple address");
1116 return -1;
1117 }
1118 if (res->ai_addrlen < addr_ret_size)
1119 addr_ret_size = res->ai_addrlen;
1120 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1121 freeaddrinfo(res);
1122 return siz;
1123 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001124 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001125 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001126 if (strcmp(name, "255.255.255.255") == 0 ||
1127 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 struct sockaddr_in *sin;
1129 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001130 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 "address family mismatched");
1132 return -1;
1133 }
1134 sin = (struct sockaddr_in *)addr_ret;
1135 memset((void *) sin, '\0', sizeof(*sin));
1136 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001137#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 sin->sin_addr.s_addr = INADDR_BROADCAST;
1141 return sizeof(sin->sin_addr);
1142 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001143
1144 /* avoid a name resolution in case of numeric address */
1145#ifdef HAVE_INET_PTON
1146 /* check for an IPv4 address */
1147 if (af == AF_UNSPEC || af == AF_INET) {
1148 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1149 memset(sin, 0, sizeof(*sin));
1150 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1151 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001152#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001153 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001154#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001155 return 4;
1156 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001158#ifdef ENABLE_IPV6
1159 /* check for an IPv6 address - if the address contains a scope ID, we
1160 * fallback to getaddrinfo(), which can handle translation from interface
1161 * name to interface index */
1162 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1163 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1164 memset(sin, 0, sizeof(*sin));
1165 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1166 sin->sin6_family = AF_INET6;
1167#ifdef HAVE_SOCKADDR_SA_LEN
1168 sin->sin6_len = sizeof(*sin);
1169#endif
1170 return 16;
1171 }
1172 }
1173#endif /* ENABLE_IPV6 */
1174#else /* HAVE_INET_PTON */
1175 /* check for an IPv4 address */
1176 if (af == AF_INET || af == AF_UNSPEC) {
1177 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1178 memset(sin, 0, sizeof(*sin));
1179 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1180 sin->sin_family = AF_INET;
1181#ifdef HAVE_SOCKADDR_SA_LEN
1182 sin->sin_len = sizeof(*sin);
1183#endif
1184 return 4;
1185 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001186 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001187#endif /* HAVE_INET_PTON */
1188
1189 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 memset(&hints, 0, sizeof(hints));
1191 hints.ai_family = af;
1192 Py_BEGIN_ALLOW_THREADS
1193 ACQUIRE_GETADDRINFO_LOCK
1194 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001195#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 if (error == EAI_NONAME && af == AF_UNSPEC) {
1197 /* On Tru64 V5.1, numeric-to-addr conversion fails
1198 if no address family is given. Assume IPv4 for now.*/
1199 hints.ai_family = AF_INET;
1200 error = getaddrinfo(name, NULL, &hints, &res);
1201 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 Py_END_ALLOW_THREADS
1204 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1205 if (error) {
1206 set_gaierror(error);
1207 return -1;
1208 }
1209 if (res->ai_addrlen < addr_ret_size)
1210 addr_ret_size = res->ai_addrlen;
1211 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1212 freeaddrinfo(res);
1213 switch (addr_ret->sa_family) {
1214 case AF_INET:
1215 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001216#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 case AF_INET6:
1218 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001221 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return -1;
1223 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001224}
1225
Guido van Rossum30a685f1991-06-27 15:51:29 +00001226
Коренберг Марк7766b962018-02-13 00:47:42 +05001227/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228
Guido van Rossum73624e91994-10-10 17:59:00 +00001229static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001230make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231{
Коренберг Марк7766b962018-02-13 00:47:42 +05001232 char buf[INET_ADDRSTRLEN];
1233 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1234 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return NULL;
1236 }
1237 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238}
1239
Коренберг Марк7766b962018-02-13 00:47:42 +05001240#ifdef ENABLE_IPV6
1241/* Convert IPv6 sockaddr to a Python str. */
1242
1243static PyObject *
1244make_ipv6_addr(const struct sockaddr_in6 *addr)
1245{
1246 char buf[INET6_ADDRSTRLEN];
1247 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1248 PyErr_SetFromErrno(PyExc_OSError);
1249 return NULL;
1250 }
1251 return PyUnicode_FromString(buf);
1252}
1253#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255#ifdef USE_BLUETOOTH
1256/* Convert a string representation of a Bluetooth address into a numeric
1257 address. Returns the length (6), or raises an exception and returns -1 if
1258 an error occurred. */
1259
1260static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001261setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 unsigned int b0, b1, b2, b3, b4, b5;
1264 char ch;
1265 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1268 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1269 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1270 bdaddr->b[0] = b0;
1271 bdaddr->b[1] = b1;
1272 bdaddr->b[2] = b2;
1273 bdaddr->b[3] = b3;
1274 bdaddr->b[4] = b4;
1275 bdaddr->b[5] = b5;
1276 return 6;
1277 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001278 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 return -1;
1280 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001281}
1282
1283/* Create a string representation of the Bluetooth address. This is always a
1284 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1285 value (zero padded if necessary). */
1286
1287static PyObject *
1288makebdaddr(bdaddr_t *bdaddr)
1289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1293 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1294 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1295 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001296}
1297#endif
1298
1299
Guido van Rossum30a685f1991-06-27 15:51:29 +00001300/* Create an object representing the given socket address,
1301 suitable for passing it back to bind(), connect() etc.
1302 The family field of the sockaddr structure is inspected
1303 to determine what kind of address it really is. */
1304
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001305/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001306static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001307makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (addrlen == 0) {
1310 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001311 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 case AF_INET:
1317 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001318 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1319 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 PyObject *ret = NULL;
1321 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1323 Py_DECREF(addrobj);
1324 }
1325 return ret;
1326 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001328#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 case AF_UNIX:
1330 {
1331 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001332#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001333 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1334 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1335 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 }
1337 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001338#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 {
1340 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001341 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 }
1343 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001344#endif /* AF_UNIX */
1345
Martin v. Löwis11017b12006-01-14 18:12:57 +00001346#if defined(AF_NETLINK)
1347 case AF_NETLINK:
1348 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1350 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001351 }
1352#endif /* AF_NETLINK */
1353
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001354#if defined(AF_QIPCRTR)
1355 case AF_QIPCRTR:
1356 {
1357 struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr;
1358 return Py_BuildValue("II", a->sq_node, a->sq_port);
1359 }
1360#endif /* AF_QIPCRTR */
1361
caaveryeffc12f2017-09-06 18:18:10 -04001362#if defined(AF_VSOCK)
1363 case AF_VSOCK:
1364 {
1365 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1366 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1367 }
1368#endif /* AF_VSOCK */
1369
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001370#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 case AF_INET6:
1372 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001373 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1374 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 PyObject *ret = NULL;
1376 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001377 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 addrobj,
1379 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001380 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 a->sin6_scope_id);
1382 Py_DECREF(addrobj);
1383 }
1384 return ret;
1385 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001386#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001387
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001388#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 case AF_BLUETOOTH:
1390 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 case BTPROTO_L2CAP:
1393 {
1394 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1395 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1396 PyObject *ret = NULL;
1397 if (addrobj) {
1398 ret = Py_BuildValue("Oi",
1399 addrobj,
1400 _BT_L2_MEMB(a, psm));
1401 Py_DECREF(addrobj);
1402 }
1403 return ret;
1404 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 case BTPROTO_RFCOMM:
1407 {
1408 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1409 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1410 PyObject *ret = NULL;
1411 if (addrobj) {
1412 ret = Py_BuildValue("Oi",
1413 addrobj,
1414 _BT_RC_MEMB(a, channel));
1415 Py_DECREF(addrobj);
1416 }
1417 return ret;
1418 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 case BTPROTO_HCI:
1421 {
1422 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001423#if defined(__NetBSD__) || defined(__DragonFly__)
1424 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001425#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 PyObject *ret = NULL;
1427 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1428 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001429#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001431
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001432#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 case BTPROTO_SCO:
1434 {
1435 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1436 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1437 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001438#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 default:
1441 PyErr_SetString(PyExc_ValueError,
1442 "Unknown Bluetooth protocol");
1443 return NULL;
1444 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001445#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001446
Antoine Pitroub156a462010-10-27 20:13:57 +00001447#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 case AF_PACKET:
1449 {
1450 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001451 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 struct ifreq ifr;
1453 /* need to look up interface name give index */
1454 if (a->sll_ifindex) {
1455 ifr.ifr_ifindex = a->sll_ifindex;
1456 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1457 ifname = ifr.ifr_name;
1458 }
1459 return Py_BuildValue("shbhy#",
1460 ifname,
1461 ntohs(a->sll_protocol),
1462 a->sll_pkttype,
1463 a->sll_hatype,
1464 a->sll_addr,
Inada Naokie9a1dcb2019-03-20 19:02:46 +09001465 (Py_ssize_t)a->sll_halen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001467#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001468
Christian Heimes043d6f62008-01-07 17:19:16 +00001469#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 case AF_TIPC:
1471 {
1472 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1473 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1474 return Py_BuildValue("IIIII",
1475 a->addrtype,
1476 a->addr.nameseq.type,
1477 a->addr.nameseq.lower,
1478 a->addr.nameseq.upper,
1479 a->scope);
1480 } else if (a->addrtype == TIPC_ADDR_NAME) {
1481 return Py_BuildValue("IIIII",
1482 a->addrtype,
1483 a->addr.name.name.type,
1484 a->addr.name.name.instance,
1485 a->addr.name.name.instance,
1486 a->scope);
1487 } else if (a->addrtype == TIPC_ADDR_ID) {
1488 return Py_BuildValue("IIIII",
1489 a->addrtype,
1490 a->addr.id.node,
1491 a->addr.id.ref,
1492 0,
1493 a->scope);
1494 } else {
1495 PyErr_SetString(PyExc_ValueError,
1496 "Invalid address type");
1497 return NULL;
1498 }
1499 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001500#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001501
Serhiy Storchakad3187152017-11-09 18:00:38 +02001502#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001503 case AF_CAN:
1504 {
1505 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001506 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001507 struct ifreq ifr;
1508 /* need to look up interface name given index */
1509 if (a->can_ifindex) {
1510 ifr.ifr_ifindex = a->can_ifindex;
1511 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1512 ifname = ifr.ifr_name;
1513 }
1514
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001515 switch (proto) {
1516#ifdef CAN_ISOTP
1517 case CAN_ISOTP:
1518 {
1519 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1520 ifname,
1521 a->can_addr.tp.rx_id,
1522 a->can_addr.tp.tx_id);
1523 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001524#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001525 default:
1526 {
Miss Islington (bot)f60fd952019-09-12 03:34:28 -07001527 return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault,
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001528 ifname);
1529 }
1530 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001531 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001532#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001533
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001534#ifdef PF_SYSTEM
1535 case PF_SYSTEM:
1536 switch(proto) {
1537#ifdef SYSPROTO_CONTROL
1538 case SYSPROTO_CONTROL:
1539 {
1540 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1541 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1542 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001543#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001544 default:
1545 PyErr_SetString(PyExc_ValueError,
1546 "Invalid address type");
1547 return 0;
1548 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001549#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001550
Christian Heimesdffa3942016-09-05 23:54:41 +02001551#ifdef HAVE_SOCKADDR_ALG
1552 case AF_ALG:
1553 {
1554 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1555 return Py_BuildValue("s#s#HH",
1556 a->salg_type,
1557 strnlen((const char*)a->salg_type,
1558 sizeof(a->salg_type)),
1559 a->salg_name,
1560 strnlen((const char*)a->salg_name,
1561 sizeof(a->salg_name)),
1562 a->salg_feat,
1563 a->salg_mask);
1564 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001565#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 default:
1570 /* If we don't know the address family, don't raise an
1571 exception -- return it as an (int, bytes) tuple. */
1572 return Py_BuildValue("iy#",
1573 addr->sa_family,
1574 addr->sa_data,
1575 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578}
1579
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001580/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1581 (in particular, numeric IP addresses). */
1582struct maybe_idna {
1583 PyObject *obj;
1584 char *buf;
1585};
1586
1587static void
1588idna_cleanup(struct maybe_idna *data)
1589{
1590 Py_CLEAR(data->obj);
1591}
1592
1593static int
1594idna_converter(PyObject *obj, struct maybe_idna *data)
1595{
1596 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001597 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001598 if (obj == NULL) {
1599 idna_cleanup(data);
1600 return 1;
1601 }
1602 data->obj = NULL;
1603 len = -1;
1604 if (PyBytes_Check(obj)) {
1605 data->buf = PyBytes_AsString(obj);
1606 len = PyBytes_Size(obj);
1607 }
1608 else if (PyByteArray_Check(obj)) {
1609 data->buf = PyByteArray_AsString(obj);
1610 len = PyByteArray_Size(obj);
1611 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001612 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001613 if (PyUnicode_READY(obj) == -1) {
1614 return 0;
1615 }
1616 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001617 data->buf = PyUnicode_DATA(obj);
1618 len = PyUnicode_GET_LENGTH(obj);
1619 }
1620 else {
1621 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1622 if (!obj2) {
1623 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1624 return 0;
1625 }
1626 assert(PyBytes_Check(obj2));
1627 data->obj = obj2;
1628 data->buf = PyBytes_AS_STRING(obj2);
1629 len = PyBytes_GET_SIZE(obj2);
1630 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001631 }
1632 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001633 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1634 obj->ob_type->tp_name);
1635 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001636 }
1637 if (strlen(data->buf) != len) {
1638 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001639 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001640 return 0;
1641 }
1642 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001643}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644
1645/* Parse a socket address argument according to the socket object's
1646 address family. Return 1 if the address was in the proper format,
1647 0 of not. The address is returned through addr_ret, its length
1648 through len_ret. */
1649
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001650static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001651getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001652 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001656#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 case AF_UNIX:
1658 {
1659 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001660 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001661 int retval = 0;
1662
1663 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1664 allow embedded nulls on Linux. */
1665 if (PyUnicode_Check(args)) {
1666 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1667 return 0;
1668 }
1669 else
1670 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001671 if (!PyArg_Parse(args, "y*", &path)) {
1672 Py_DECREF(args);
1673 return retval;
1674 }
1675 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001678#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001679 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001681 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001682 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001684 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 }
1686 }
1687 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001688#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 {
1690 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001691 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001692 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001694 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001696 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 }
1698 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001699 memcpy(addr->sun_path, path.buf, path.len);
1700 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001701 retval = 1;
1702 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001703 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001704 Py_DECREF(args);
1705 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001707#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708
Martin v. Löwis11017b12006-01-14 18:12:57 +00001709#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 case AF_NETLINK:
1711 {
1712 struct sockaddr_nl* addr;
1713 int pid, groups;
1714 addr = (struct sockaddr_nl *)addr_ret;
1715 if (!PyTuple_Check(args)) {
1716 PyErr_Format(
1717 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001718 "%s(): AF_NETLINK address must be tuple, not %.500s",
1719 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 return 0;
1721 }
Oren Milman735171e2018-09-11 19:51:29 +03001722 if (!PyArg_ParseTuple(args,
1723 "II;AF_NETLINK address must be a pair "
1724 "(pid, groups)",
1725 &pid, &groups))
1726 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 addr->nl_family = AF_NETLINK;
1730 addr->nl_pid = pid;
1731 addr->nl_groups = groups;
1732 *len_ret = sizeof(*addr);
1733 return 1;
1734 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001735#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001736
Bjorn Anderssonbb816512018-09-26 06:47:52 -07001737#if defined(AF_QIPCRTR)
1738 case AF_QIPCRTR:
1739 {
1740 struct sockaddr_qrtr* addr;
1741 unsigned int node, port;
1742 addr = (struct sockaddr_qrtr *)addr_ret;
1743 if (!PyTuple_Check(args)) {
1744 PyErr_Format(
1745 PyExc_TypeError,
1746 "getsockaddrarg: "
1747 "AF_QIPCRTR address must be tuple, not %.500s",
1748 Py_TYPE(args)->tp_name);
1749 return 0;
1750 }
1751 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port))
1752 return 0;
1753 addr->sq_family = AF_QIPCRTR;
1754 addr->sq_node = node;
1755 addr->sq_port = port;
1756 *len_ret = sizeof(*addr);
1757 return 1;
1758 }
1759#endif /* AF_QIPCRTR */
1760
caaveryeffc12f2017-09-06 18:18:10 -04001761#if defined(AF_VSOCK)
1762 case AF_VSOCK:
1763 {
1764 struct sockaddr_vm* addr;
1765 int port, cid;
1766 addr = (struct sockaddr_vm *)addr_ret;
1767 memset(addr, 0, sizeof(struct sockaddr_vm));
1768 if (!PyTuple_Check(args)) {
1769 PyErr_Format(
1770 PyExc_TypeError,
1771 "getsockaddrarg: "
1772 "AF_VSOCK address must be tuple, not %.500s",
1773 Py_TYPE(args)->tp_name);
1774 return 0;
1775 }
1776 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1777 return 0;
1778 addr->svm_family = s->sock_family;
1779 addr->svm_port = port;
1780 addr->svm_cid = cid;
1781 *len_ret = sizeof(*addr);
1782 return 1;
1783 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001784#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001785
1786
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001787#ifdef AF_RDS
1788 case AF_RDS:
1789 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001790#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 case AF_INET:
1793 {
1794 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001795 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 int port, result;
1797 if (!PyTuple_Check(args)) {
1798 PyErr_Format(
1799 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001800 "%s(): AF_INET address must be tuple, not %.500s",
1801 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 return 0;
1803 }
Oren Milman735171e2018-09-11 19:51:29 +03001804 if (!PyArg_ParseTuple(args,
1805 "O&i;AF_INET address must be a pair "
1806 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001807 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001808 {
1809 assert(PyErr_Occurred());
1810 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1811 PyErr_Format(PyExc_OverflowError,
1812 "%s(): port must be 0-65535.", caller);
1813 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001815 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001817 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001819 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 if (result < 0)
1821 return 0;
1822 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001823 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001825 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 return 0;
1827 }
1828 addr->sin_family = AF_INET;
1829 addr->sin_port = htons((short)port);
1830 *len_ret = sizeof *addr;
1831 return 1;
1832 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001833
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001834#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 case AF_INET6:
1836 {
1837 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001838 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001839 int port, result;
1840 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 flowinfo = scope_id = 0;
1842 if (!PyTuple_Check(args)) {
1843 PyErr_Format(
1844 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001845 "%s(): AF_INET6 address must be tuple, not %.500s",
1846 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 return 0;
1848 }
Oren Milman735171e2018-09-11 19:51:29 +03001849 if (!PyArg_ParseTuple(args,
1850 "O&i|II;AF_INET6 address must be a tuple "
1851 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001852 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001853 &scope_id))
1854 {
1855 assert(PyErr_Occurred());
1856 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1857 PyErr_Format(PyExc_OverflowError,
1858 "%s(): port must be 0-65535.", caller);
1859 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return 0;
1861 }
1862 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001863 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001865 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (result < 0)
1867 return 0;
1868 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001869 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001871 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 return 0;
1873 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001874 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001875 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001876 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001877 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001878 return 0;
1879 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 addr->sin6_family = s->sock_family;
1881 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001882 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 addr->sin6_scope_id = scope_id;
1884 *len_ret = sizeof *addr;
1885 return 1;
1886 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001887#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001888
Hye-Shik Chang81268602004-02-02 06:05:24 +00001889#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 case AF_BLUETOOTH:
1891 {
1892 switch (s->sock_proto) {
1893 case BTPROTO_L2CAP:
1894 {
1895 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001896 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 addr = (struct sockaddr_l2 *)addr_ret;
1899 memset(addr, 0, sizeof(struct sockaddr_l2));
1900 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1901 if (!PyArg_ParseTuple(args, "si", &straddr,
1902 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001903 PyErr_Format(PyExc_OSError,
1904 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 0;
1906 }
1907 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1908 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 *len_ret = sizeof *addr;
1911 return 1;
1912 }
1913 case BTPROTO_RFCOMM:
1914 {
1915 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001916 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 addr = (struct sockaddr_rc *)addr_ret;
1919 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1920 if (!PyArg_ParseTuple(args, "si", &straddr,
1921 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001922 PyErr_Format(PyExc_OSError,
1923 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 return 0;
1925 }
1926 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1927 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 *len_ret = sizeof *addr;
1930 return 1;
1931 }
1932 case BTPROTO_HCI:
1933 {
1934 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001935#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001936 const char *straddr;
1937 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1938 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001939 PyErr_Format(PyExc_OSError, "%s: "
1940 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001941 return 0;
1942 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001943 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001944 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1945 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001946#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1948 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001949 PyErr_Format(PyExc_OSError,
1950 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 return 0;
1952 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001953#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 *len_ret = sizeof *addr;
1955 return 1;
1956 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001957#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 case BTPROTO_SCO:
1959 {
1960 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001961 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 addr = (struct sockaddr_sco *)addr_ret;
1964 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1965 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001966 PyErr_Format(PyExc_OSError,
1967 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 return 0;
1969 }
1970 straddr = PyBytes_AS_STRING(args);
1971 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1972 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 *len_ret = sizeof *addr;
1975 return 1;
1976 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001977#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 default:
Oren Milman735171e2018-09-11 19:51:29 +03001979 PyErr_Format(PyExc_OSError,
1980 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 return 0;
1982 }
1983 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001984#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001985
Antoine Pitroub156a462010-10-27 20:13:57 +00001986#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 case AF_PACKET:
1988 {
1989 struct sockaddr_ll* addr;
1990 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001991 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 int protoNumber;
1993 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001994 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001995 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 if (!PyTuple_Check(args)) {
1998 PyErr_Format(
1999 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002000 "%s(): AF_PACKET address must be tuple, not %.500s",
2001 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 return 0;
2003 }
Oren Milman735171e2018-09-11 19:51:29 +03002004 /* XXX: improve the default error message according to the
2005 documentation of AF_PACKET, which would be added as part
2006 of bpo-25041. */
2007 if (!PyArg_ParseTuple(args,
2008 "si|iiy*;AF_PACKET address must be a tuple of "
2009 "two to five elements",
2010 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002011 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03002012 {
2013 assert(PyErr_Occurred());
2014 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2015 PyErr_Format(PyExc_OverflowError,
2016 "%s(): address argument out of range", caller);
2017 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002019 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
2021 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2022 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2023 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002024 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 return 0;
2026 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002027 if (haddr.buf && haddr.len > 8) {
2028 PyErr_SetString(PyExc_ValueError,
2029 "Hardware address must be 8 bytes or less");
2030 PyBuffer_Release(&haddr);
2031 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 }
2033 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03002034 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04002036 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002037 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 return 0;
2039 }
2040 addr = (struct sockaddr_ll*)addr_ret;
2041 addr->sll_family = AF_PACKET;
2042 addr->sll_protocol = htons((short)protoNumber);
2043 addr->sll_ifindex = ifr.ifr_ifindex;
2044 addr->sll_pkttype = pkttype;
2045 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002046 if (haddr.buf) {
2047 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
2048 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002050 else
2051 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002053 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 return 1;
2055 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002056#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002057
Christian Heimes043d6f62008-01-07 17:19:16 +00002058#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 case AF_TIPC:
2060 {
2061 unsigned int atype, v1, v2, v3;
2062 unsigned int scope = TIPC_CLUSTER_SCOPE;
2063 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 if (!PyTuple_Check(args)) {
2066 PyErr_Format(
2067 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03002068 "%s(): AF_TIPC address must be tuple, not %.500s",
2069 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 return 0;
2071 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03002074 "IIII|I;AF_TIPC address must be a tuple "
2075 "(addr_type, v1, v2, v3[, scope])",
2076 &atype, &v1, &v2, &v3, &scope))
2077 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002079 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 addr = (struct sockaddr_tipc *) addr_ret;
2082 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00002083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 addr->family = AF_TIPC;
2085 addr->scope = scope;
2086 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if (atype == TIPC_ADDR_NAMESEQ) {
2089 addr->addr.nameseq.type = v1;
2090 addr->addr.nameseq.lower = v2;
2091 addr->addr.nameseq.upper = v3;
2092 } else if (atype == TIPC_ADDR_NAME) {
2093 addr->addr.name.name.type = v1;
2094 addr->addr.name.name.instance = v2;
2095 } else if (atype == TIPC_ADDR_ID) {
2096 addr->addr.id.node = v1;
2097 addr->addr.id.ref = v2;
2098 } else {
2099 /* Shouldn't happen */
2100 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2101 return 0;
2102 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 return 1;
2107 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002108#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002109
Serhiy Storchakad3187152017-11-09 18:00:38 +02002110#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002111 case AF_CAN:
2112 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002113#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002114 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002115 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002116#endif
2117#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002118 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002119#endif
2120#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002121 {
2122 struct sockaddr_can *addr;
2123 PyObject *interfaceName;
2124 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002125 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002126 addr = (struct sockaddr_can *)addr_ret;
2127
Oren Milman735171e2018-09-11 19:51:29 +03002128 if (!PyTuple_Check(args)) {
2129 PyErr_Format(PyExc_TypeError,
2130 "%s(): AF_CAN address must be tuple, not %.500s",
2131 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002132 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002133 }
2134 if (!PyArg_ParseTuple(args,
2135 "O&;AF_CAN address must be a tuple "
2136 "(interface, )",
2137 PyUnicode_FSConverter, &interfaceName))
2138 {
2139 return 0;
2140 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002141
2142 len = PyBytes_GET_SIZE(interfaceName);
2143
2144 if (len == 0) {
2145 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002146 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002147 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2148 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002149 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2150 s->errorhandler();
2151 Py_DECREF(interfaceName);
2152 return 0;
2153 }
2154 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002155 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002156 "AF_CAN interface name too long");
2157 Py_DECREF(interfaceName);
2158 return 0;
2159 }
2160
2161 addr->can_family = AF_CAN;
2162 addr->can_ifindex = ifr.ifr_ifindex;
2163
2164 *len_ret = sizeof(*addr);
2165 Py_DECREF(interfaceName);
2166 return 1;
2167 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002168#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002169
2170#ifdef CAN_ISOTP
2171 case CAN_ISOTP:
2172 {
2173 struct sockaddr_can *addr;
2174 PyObject *interfaceName;
2175 struct ifreq ifr;
2176 Py_ssize_t len;
2177 unsigned long int rx_id, tx_id;
2178
2179 addr = (struct sockaddr_can *)addr_ret;
2180
2181 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2182 &interfaceName,
2183 &rx_id,
2184 &tx_id))
2185 return 0;
2186
2187 len = PyBytes_GET_SIZE(interfaceName);
2188
2189 if (len == 0) {
2190 ifr.ifr_ifindex = 0;
2191 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2192 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2193 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2194 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2195 s->errorhandler();
2196 Py_DECREF(interfaceName);
2197 return 0;
2198 }
2199 } else {
2200 PyErr_SetString(PyExc_OSError,
2201 "AF_CAN interface name too long");
2202 Py_DECREF(interfaceName);
2203 return 0;
2204 }
2205
2206 addr->can_family = AF_CAN;
2207 addr->can_ifindex = ifr.ifr_ifindex;
2208 addr->can_addr.tp.rx_id = rx_id;
2209 addr->can_addr.tp.tx_id = tx_id;
2210
2211 *len_ret = sizeof(*addr);
2212 Py_DECREF(interfaceName);
2213 return 1;
2214 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002215#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002216 default:
Oren Milman735171e2018-09-11 19:51:29 +03002217 PyErr_Format(PyExc_OSError,
2218 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002219 return 0;
2220 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002221#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002222
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002223#ifdef PF_SYSTEM
2224 case PF_SYSTEM:
2225 switch (s->sock_proto) {
2226#ifdef SYSPROTO_CONTROL
2227 case SYSPROTO_CONTROL:
2228 {
2229 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002230
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002231 addr = (struct sockaddr_ctl *)addr_ret;
2232 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002233 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002234
2235 if (PyUnicode_Check(args)) {
2236 struct ctl_info info;
2237 PyObject *ctl_name;
2238
2239 if (!PyArg_Parse(args, "O&",
2240 PyUnicode_FSConverter, &ctl_name)) {
2241 return 0;
2242 }
2243
Victor Stinnerf50e1872015-03-20 11:32:24 +01002244 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002245 PyErr_SetString(PyExc_ValueError,
2246 "provided string is too long");
2247 Py_DECREF(ctl_name);
2248 return 0;
2249 }
2250 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2251 sizeof(info.ctl_name));
2252 Py_DECREF(ctl_name);
2253
2254 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2255 PyErr_SetString(PyExc_OSError,
2256 "cannot find kernel control with provided name");
2257 return 0;
2258 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002259
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002260 addr->sc_id = info.ctl_id;
2261 addr->sc_unit = 0;
2262 } else if (!PyArg_ParseTuple(args, "II",
2263 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002264 PyErr_Format(PyExc_TypeError,
2265 "%s(): PF_SYSTEM address must be a str or "
2266 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002267 return 0;
2268 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002269
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002270 *len_ret = sizeof(*addr);
2271 return 1;
2272 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002273#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002274 default:
Oren Milman735171e2018-09-11 19:51:29 +03002275 PyErr_Format(PyExc_OSError,
2276 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002277 return 0;
2278 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002279#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002280#ifdef HAVE_SOCKADDR_ALG
2281 case AF_ALG:
2282 {
2283 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002284 const char *type;
2285 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002286 sa = (struct sockaddr_alg *)addr_ret;
2287
2288 memset(sa, 0, sizeof(*sa));
2289 sa->salg_family = AF_ALG;
2290
Oren Milman735171e2018-09-11 19:51:29 +03002291 if (!PyTuple_Check(args)) {
2292 PyErr_Format(PyExc_TypeError,
2293 "%s(): AF_ALG address must be tuple, not %.500s",
2294 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002295 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002296 }
2297 if (!PyArg_ParseTuple(args,
2298 "ss|HH;AF_ALG address must be a tuple "
2299 "(type, name[, feat[, mask]])",
2300 &type, &name, &sa->salg_feat, &sa->salg_mask))
2301 {
2302 return 0;
2303 }
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002304 /* sockaddr_alg has fixed-sized char arrays for type, and name
2305 * both must be NULL terminated.
2306 */
2307 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002308 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2309 return 0;
2310 }
2311 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Christian Heimes2eb6ad82018-12-10 11:22:37 +01002312 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002313 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2314 return 0;
2315 }
2316 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2317
2318 *len_ret = sizeof(*sa);
2319 return 1;
2320 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002321#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 default:
Oren Milman735171e2018-09-11 19:51:29 +03002326 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002330}
2331
Guido van Rossum30a685f1991-06-27 15:51:29 +00002332
Guido van Rossum48a680c2001-03-02 06:34:14 +00002333/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002334 Return 1 if the family is known, 0 otherwise. The length is returned
2335 through len_ret. */
2336
2337static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002338getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002341
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002342#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 case AF_UNIX:
2344 {
2345 *len_ret = sizeof (struct sockaddr_un);
2346 return 1;
2347 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002348#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002349
Martin v. Löwis11017b12006-01-14 18:12:57 +00002350#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002351 case AF_NETLINK:
2352 {
2353 *len_ret = sizeof (struct sockaddr_nl);
2354 return 1;
2355 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002356#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002357
Bjorn Anderssonbb816512018-09-26 06:47:52 -07002358#if defined(AF_QIPCRTR)
2359 case AF_QIPCRTR:
2360 {
2361 *len_ret = sizeof (struct sockaddr_qrtr);
2362 return 1;
2363 }
2364#endif /* AF_QIPCRTR */
2365
caaveryeffc12f2017-09-06 18:18:10 -04002366#if defined(AF_VSOCK)
2367 case AF_VSOCK:
2368 {
2369 *len_ret = sizeof (struct sockaddr_vm);
2370 return 1;
2371 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002372#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002373
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002374#ifdef AF_RDS
2375 case AF_RDS:
2376 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002377#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 case AF_INET:
2380 {
2381 *len_ret = sizeof (struct sockaddr_in);
2382 return 1;
2383 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002384
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002385#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 case AF_INET6:
2387 {
2388 *len_ret = sizeof (struct sockaddr_in6);
2389 return 1;
2390 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002391#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002392
Hye-Shik Chang81268602004-02-02 06:05:24 +00002393#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 case AF_BLUETOOTH:
2395 {
2396 switch(s->sock_proto)
2397 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 case BTPROTO_L2CAP:
2400 *len_ret = sizeof (struct sockaddr_l2);
2401 return 1;
2402 case BTPROTO_RFCOMM:
2403 *len_ret = sizeof (struct sockaddr_rc);
2404 return 1;
2405 case BTPROTO_HCI:
2406 *len_ret = sizeof (struct sockaddr_hci);
2407 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002408#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 case BTPROTO_SCO:
2410 *len_ret = sizeof (struct sockaddr_sco);
2411 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002412#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002414 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 "unknown BT protocol");
2416 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 }
2419 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002420#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002421
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002422#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 case AF_PACKET:
2424 {
2425 *len_ret = sizeof (struct sockaddr_ll);
2426 return 1;
2427 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002428#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002429
Christian Heimes043d6f62008-01-07 17:19:16 +00002430#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 case AF_TIPC:
2432 {
2433 *len_ret = sizeof (struct sockaddr_tipc);
2434 return 1;
2435 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002436#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002437
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002438#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002439 case AF_CAN:
2440 {
2441 *len_ret = sizeof (struct sockaddr_can);
2442 return 1;
2443 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002444#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002445
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002446#ifdef PF_SYSTEM
2447 case PF_SYSTEM:
2448 switch(s->sock_proto) {
2449#ifdef SYSPROTO_CONTROL
2450 case SYSPROTO_CONTROL:
2451 *len_ret = sizeof (struct sockaddr_ctl);
2452 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002453#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002454 default:
2455 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2456 "unknown PF_SYSTEM protocol");
2457 return 0;
2458 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002459#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002460#ifdef HAVE_SOCKADDR_ALG
2461 case AF_ALG:
2462 {
2463 *len_ret = sizeof (struct sockaddr_alg);
2464 return 1;
2465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002466#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002471 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002475}
2476
2477
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002478/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2479 Currently, these methods are only compiled if the RFC 2292/3542
2480 CMSG_LEN() macro is available. Older systems seem to have used
2481 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2482 it may be possible to define CMSG_LEN() that way if it's not
2483 provided. Some architectures might need extra padding after the
2484 cmsghdr, however, and CMSG_LEN() would have to take account of
2485 this. */
2486#ifdef CMSG_LEN
2487/* If length is in range, set *result to CMSG_LEN(length) and return
2488 true; otherwise, return false. */
2489static int
2490get_CMSG_LEN(size_t length, size_t *result)
2491{
2492 size_t tmp;
2493
2494 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2495 return 0;
2496 tmp = CMSG_LEN(length);
2497 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2498 return 0;
2499 *result = tmp;
2500 return 1;
2501}
2502
2503#ifdef CMSG_SPACE
2504/* If length is in range, set *result to CMSG_SPACE(length) and return
2505 true; otherwise, return false. */
2506static int
2507get_CMSG_SPACE(size_t length, size_t *result)
2508{
2509 size_t tmp;
2510
2511 /* Use CMSG_SPACE(1) here in order to take account of the padding
2512 necessary before *and* after the data. */
2513 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2514 return 0;
2515 tmp = CMSG_SPACE(length);
2516 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2517 return 0;
2518 *result = tmp;
2519 return 1;
2520}
2521#endif
2522
2523/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2524 pointer in msg->msg_control with at least "space" bytes after it,
2525 and its cmsg_len member inside the buffer. */
2526static int
2527cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2528{
2529 size_t cmsg_offset;
2530 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2531 sizeof(cmsgh->cmsg_len));
2532
Charles-François Natali466517d2011-08-28 18:23:43 +02002533 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002534 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002535 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002536 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2537 annoying under OS X as it's unsigned there and so it triggers a
2538 tautological comparison warning under Clang when compared against 0.
2539 Since the check is valid on other platforms, silence the warning under
2540 Clang. */
2541 #ifdef __clang__
2542 #pragma clang diagnostic push
2543 #pragma clang diagnostic ignored "-Wtautological-compare"
2544 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002545 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002546 #pragma GCC diagnostic push
2547 #pragma GCC diagnostic ignored "-Wtype-limits"
2548 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002549 if (msg->msg_controllen < 0)
2550 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002551 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002552 #pragma GCC diagnostic pop
2553 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002554 #ifdef __clang__
2555 #pragma clang diagnostic pop
2556 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002557 if (space < cmsg_len_end)
2558 space = cmsg_len_end;
2559 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2560 return (cmsg_offset <= (size_t)-1 - space &&
2561 cmsg_offset + space <= msg->msg_controllen);
2562}
2563
2564/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2565 *space to number of bytes following it in the buffer and return
2566 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2567 msg->msg_controllen are valid. */
2568static int
2569get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2570{
2571 size_t data_offset;
2572 char *data_ptr;
2573
2574 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2575 return 0;
2576 data_offset = data_ptr - (char *)msg->msg_control;
2577 if (data_offset > msg->msg_controllen)
2578 return 0;
2579 *space = msg->msg_controllen - data_offset;
2580 return 1;
2581}
2582
2583/* If cmsgh is invalid or not contained in the buffer pointed to by
2584 msg->msg_control, return -1. If cmsgh is valid and its associated
2585 data is entirely contained in the buffer, set *data_len to the
2586 length of the associated data and return 0. If only part of the
2587 associated data is contained in the buffer but cmsgh is otherwise
2588 valid, set *data_len to the length contained in the buffer and
2589 return 1. */
2590static int
2591get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2592{
2593 size_t space, cmsg_data_len;
2594
2595 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2596 cmsgh->cmsg_len < CMSG_LEN(0))
2597 return -1;
2598 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2599 if (!get_cmsg_data_space(msg, cmsgh, &space))
2600 return -1;
2601 if (space >= cmsg_data_len) {
2602 *data_len = cmsg_data_len;
2603 return 0;
2604 }
2605 *data_len = space;
2606 return 1;
2607}
2608#endif /* CMSG_LEN */
2609
2610
Victor Stinner31bf2d52015-04-01 21:57:09 +02002611struct sock_accept {
2612 socklen_t *addrlen;
2613 sock_addr_t *addrbuf;
2614 SOCKET_T result;
2615};
2616
2617#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2618/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2619static int accept4_works = -1;
2620#endif
2621
2622static int
2623sock_accept_impl(PySocketSockObject *s, void *data)
2624{
2625 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002626 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2627 socklen_t *paddrlen = ctx->addrlen;
2628#ifdef HAVE_SOCKADDR_ALG
2629 /* AF_ALG does not support accept() with addr and raises
2630 * ECONNABORTED instead. */
2631 if (s->sock_family == AF_ALG) {
2632 addr = NULL;
2633 paddrlen = NULL;
2634 *ctx->addrlen = 0;
2635 }
2636#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002637
2638#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2639 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002640 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002641 SOCK_CLOEXEC);
2642 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2643 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2644 accept4_works = (errno != ENOSYS);
2645 }
2646 }
2647 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002648 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002649#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002650 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002651#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002652
2653#ifdef MS_WINDOWS
2654 return (ctx->result != INVALID_SOCKET);
2655#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002656 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002657#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002658}
2659
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002660/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002661
Guido van Rossum73624e91994-10-10 17:59:00 +00002662static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302663sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002666 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 socklen_t addrlen;
2668 PyObject *sock = NULL;
2669 PyObject *addr = NULL;
2670 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002671 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 if (!getsockaddrlen(s, &addrlen))
2674 return NULL;
2675 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (!IS_SELECTABLE(s))
2678 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002679
Victor Stinner31bf2d52015-04-01 21:57:09 +02002680 ctx.addrlen = &addrlen;
2681 ctx.addrbuf = &addrbuf;
2682 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002684 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002685
Victor Stinnerdaf45552013-08-28 00:53:59 +02002686#ifdef MS_WINDOWS
2687 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2688 PyErr_SetFromWindowsErr(0);
2689 SOCKETCLOSE(newfd);
2690 goto finally;
2691 }
2692#else
2693
2694#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2695 if (!accept4_works)
2696#endif
2697 {
2698 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2699 SOCKETCLOSE(newfd);
2700 goto finally;
2701 }
2702 }
2703#endif
2704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 sock = PyLong_FromSocket_t(newfd);
2706 if (sock == NULL) {
2707 SOCKETCLOSE(newfd);
2708 goto finally;
2709 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2712 addrlen, s->sock_proto);
2713 if (addr == NULL)
2714 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002717
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 Py_XDECREF(sock);
2720 Py_XDECREF(addr);
2721 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002722}
2723
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002724PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002725"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002726\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002727Wait for an incoming connection. Return a new socket file descriptor\n\
2728representing the connection, and the address of the client.\n\
2729For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002730
Guido van Rossum11ba0942002-06-13 15:07:44 +00002731/* s.setblocking(flag) method. Argument:
2732 False -- non-blocking mode; same as settimeout(0)
2733 True -- blocking mode; same as settimeout(None)
2734*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002735
Guido van Rossum73624e91994-10-10 17:59:00 +00002736static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002737sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002738{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002739 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 block = PyLong_AsLong(arg);
2742 if (block == -1 && PyErr_Occurred())
2743 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002744
Victor Stinner9001d802015-04-06 23:06:01 +02002745 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002746 if (internal_setblocking(s, block) == -1) {
2747 return NULL;
2748 }
2749 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002750}
Guido van Rossume4485b01994-09-07 14:32:49 +00002751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753"setblocking(flag)\n\
2754\n\
2755Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002756setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002757setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002758
Yury Selivanovf11b4602018-01-28 17:27:38 -05002759/* s.getblocking() method.
2760 Returns True if socket is in blocking mode,
2761 False if it is in non-blocking mode.
2762*/
2763static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302764sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002765{
2766 if (s->sock_timeout) {
2767 Py_RETURN_TRUE;
2768 }
2769 else {
2770 Py_RETURN_FALSE;
2771 }
2772}
2773
2774PyDoc_STRVAR(getblocking_doc,
2775"getblocking()\n\
2776\n\
2777Returns True if socket is in blocking mode, or False if it\n\
2778is in non-blocking mode.");
2779
Victor Stinner71694d52015-03-28 01:18:54 +01002780static int
2781socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2782{
2783#ifdef MS_WINDOWS
2784 struct timeval tv;
2785#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002786#ifndef HAVE_POLL
2787 _PyTime_t ms;
2788#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002789 int overflow = 0;
2790
2791 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002792 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002793 return 0;
2794 }
2795
Victor Stinner869e1772015-03-30 03:49:14 +02002796 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002797 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002798 return -1;
2799
2800 if (*timeout < 0) {
2801 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2802 return -1;
2803 }
2804
2805#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002806 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002807#endif
2808#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002809 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002810 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002811#endif
2812 if (overflow) {
2813 PyErr_SetString(PyExc_OverflowError,
2814 "timeout doesn't fit into C timeval");
2815 return -1;
2816 }
2817
2818 return 0;
2819}
2820
Guido van Rossum11ba0942002-06-13 15:07:44 +00002821/* s.settimeout(timeout) method. Argument:
2822 None -- no timeout, blocking mode; same as setblocking(True)
2823 0.0 -- non-blocking mode; same as setblocking(False)
2824 > 0 -- timeout mode; operations time out after timeout seconds
2825 < 0 -- illegal; raises an exception
2826*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002828sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002829{
Victor Stinner71694d52015-03-28 01:18:54 +01002830 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002831
Victor Stinner71694d52015-03-28 01:18:54 +01002832 if (socket_parse_timeout(&timeout, arg) < 0)
2833 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002836
2837 int block = timeout < 0;
2838 /* Blocking mode for a Python socket object means that operations
2839 like :meth:`recv` or :meth:`sendall` will block the execution of
2840 the current thread until they are complete or aborted with a
2841 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2842 the underlying FD is in a blocking mode. When timeout is a positive
2843 number, the FD is in a non-blocking mode, and socket ops are
2844 implemented with a `select()` call.
2845
2846 When timeout is 0.0, the FD is in a non-blocking mode.
2847
2848 This table summarizes all states in which the socket object and
2849 its underlying FD can be:
2850
2851 ==================== ===================== ==============
2852 `gettimeout()` `getblocking()` FD
2853 ==================== ===================== ==============
2854 ``None`` ``True`` blocking
2855 ``0.0`` ``False`` non-blocking
2856 ``> 0`` ``True`` non-blocking
2857 */
2858
2859 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002860 return NULL;
2861 }
2862 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002863}
2864
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002865PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002866"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002867\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002868Set a timeout on socket operations. 'timeout' can be a float,\n\
2869giving in seconds, or None. Setting a timeout of None disables\n\
2870the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002871Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002873/* s.gettimeout() method.
2874 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002875static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302876sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002877{
Victor Stinner71694d52015-03-28 01:18:54 +01002878 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002879 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 }
Victor Stinner71694d52015-03-28 01:18:54 +01002881 else {
2882 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2883 return PyFloat_FromDouble(seconds);
2884 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002885}
2886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002888"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002889\n\
oldkaa0735f2018-02-02 16:52:55 +08002890Returns the timeout in seconds (float) associated with socket\n\
2891operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002892operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002893
Guido van Rossumaee08791992-09-08 09:05:33 +00002894/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002895 With an integer third argument, sets an integer optval with optlen=4.
2896 With None as third argument and an integer fourth argument, set
2897 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002898 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002899 use optional built-in module 'struct' to encode the string.
2900*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002901
Guido van Rossum73624e91994-10-10 17:59:00 +00002902static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002903sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 int level;
2906 int optname;
2907 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002908 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002910 unsigned int optlen;
2911 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002912
caaveryeffc12f2017-09-06 18:18:10 -04002913#ifdef AF_VSOCK
2914 if (s->sock_family == AF_VSOCK) {
2915 uint64_t vflag; // Must be set width of 64 bits
2916 /* setsockopt(level, opt, flag) */
2917 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2918 &level, &optname, &vflag)) {
2919 // level should always be set to AF_VSOCK
2920 res = setsockopt(s->sock_fd, level, optname,
2921 (void*)&vflag, sizeof vflag);
2922 goto done;
2923 }
2924 return NULL;
2925 }
2926#endif
2927
Christian Heimesdffa3942016-09-05 23:54:41 +02002928 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 if (PyArg_ParseTuple(args, "iii:setsockopt",
2930 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002931 res = setsockopt(s->sock_fd, level, optname,
2932 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002933 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002935
2936 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002937 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002938 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2939 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2940 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002941 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002942 NULL, (socklen_t)optlen);
2943 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002945
2946 PyErr_Clear();
2947 /* setsockopt(level, opt, buffer) */
2948 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2949 &level, &optname, &optval))
2950 return NULL;
2951
2952#ifdef MS_WINDOWS
2953 if (optval.len > INT_MAX) {
2954 PyBuffer_Release(&optval);
2955 PyErr_Format(PyExc_OverflowError,
2956 "socket option is larger than %i bytes",
2957 INT_MAX);
2958 return NULL;
2959 }
2960 res = setsockopt(s->sock_fd, level, optname,
2961 optval.buf, (int)optval.len);
2962#else
2963 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2964#endif
2965 PyBuffer_Release(&optval);
2966
2967done:
Victor Stinnercc739322016-03-23 21:35:29 +01002968 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002970 }
2971
2972 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002973}
2974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002975PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002976"setsockopt(level, option, value: int)\n\
2977setsockopt(level, option, value: buffer)\n\
2978setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002979\n\
2980Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002981The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002982None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002984
Guido van Rossumaee08791992-09-08 09:05:33 +00002985/* s.getsockopt() method.
2986 With two arguments, retrieves an integer option.
2987 With a third integer argument, retrieves a string buffer of that size;
2988 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002989
Guido van Rossum73624e91994-10-10 17:59:00 +00002990static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002991sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 int level;
2994 int optname;
2995 int res;
2996 PyObject *buf;
2997 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002998 int flag = 0;
2999 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
3002 &level, &optname, &buflen))
3003 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04003006#ifdef AF_VSOCK
3007 if (s->sock_family == AF_VSOCK) {
3008 uint64_t vflag = 0; // Must be set width of 64 bits
3009 flagsize = sizeof vflag;
3010 res = getsockopt(s->sock_fd, level, optname,
3011 (void *)&vflag, &flagsize);
3012 if (res < 0)
3013 return s->errorhandler();
3014 return PyLong_FromUnsignedLong(vflag);
3015 }
3016#endif
3017 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 res = getsockopt(s->sock_fd, level, optname,
3019 (void *)&flag, &flagsize);
3020 if (res < 0)
3021 return s->errorhandler();
3022 return PyLong_FromLong(flag);
3023 }
caaveryeffc12f2017-09-06 18:18:10 -04003024#ifdef AF_VSOCK
3025 if (s->sock_family == AF_VSOCK) {
3026 PyErr_SetString(PyExc_OSError,
3027 "getsockopt string buffer not allowed");
3028 return NULL;
3029 }
3030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003032 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 "getsockopt buflen out of range");
3034 return NULL;
3035 }
3036 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
3037 if (buf == NULL)
3038 return NULL;
3039 res = getsockopt(s->sock_fd, level, optname,
3040 (void *)PyBytes_AS_STRING(buf), &buflen);
3041 if (res < 0) {
3042 Py_DECREF(buf);
3043 return s->errorhandler();
3044 }
3045 _PyBytes_Resize(&buf, buflen);
3046 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003047}
3048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003049PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003050"getsockopt(level, option[, buffersize]) -> value\n\
3051\n\
3052Get a socket option. See the Unix manual for level and option.\n\
3053If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003054string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003055
Guido van Rossum0e69587d1992-06-05 15:11:30 +00003056
Fred Drake728819a2000-07-01 03:40:12 +00003057/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003058
Guido van Rossum73624e91994-10-10 17:59:00 +00003059static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003060sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 sock_addr_t addrbuf;
3063 int addrlen;
3064 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003065
Oren Milman735171e2018-09-11 19:51:29 +03003066 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003068 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07003069
3070 if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
3071 return NULL;
3072 }
3073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 Py_BEGIN_ALLOW_THREADS
3075 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
3076 Py_END_ALLOW_THREADS
3077 if (res < 0)
3078 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003079 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003080}
3081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003083"bind(address)\n\
3084\n\
3085Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00003086pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04003087sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088
Guido van Rossum30a685f1991-06-27 15:51:29 +00003089
3090/* s.close() method.
3091 Set the file descriptor to -1 so operations tried subsequently
3092 will surely fail. */
3093
Guido van Rossum73624e91994-10-10 17:59:00 +00003094static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303095sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00003098 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003099
Victor Stinner19a8e842016-03-21 16:36:48 +01003100 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003101 if (fd != INVALID_SOCKET) {
3102 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01003103
3104 /* We do not want to retry upon EINTR: see
3105 http://lwn.net/Articles/576478/ and
3106 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3107 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003109 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003111 /* bpo-30319: The peer can already have closed the connection.
3112 Python ignores ECONNRESET on close(). */
3113 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003114 return s->errorhandler();
3115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003117 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003118}
3119
Christian Heimesd0e31b92018-01-27 09:54:13 +01003120PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003121"close()\n\
3122\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003124
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003125static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303126sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003127{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003128 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003129 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003130 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003131}
3132
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003133PyDoc_STRVAR(detach_doc,
3134"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003135\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003136Close the socket object without closing the underlying file descriptor.\n\
3137The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003138can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003139
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003140static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003141sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003142{
Victor Stinner81c41db2015-04-02 11:50:57 +02003143 int err;
3144 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003145
Victor Stinner81c41db2015-04-02 11:50:57 +02003146 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3147 /* getsockopt() failed */
3148 return 0;
3149 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003150
Victor Stinner81c41db2015-04-02 11:50:57 +02003151 if (err == EISCONN)
3152 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003153 if (err != 0) {
3154 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3155 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003156 return 0;
3157 }
3158 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003159}
3160
3161static int
3162internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3163 int raise)
3164{
3165 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003166
3167 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003169 Py_END_ALLOW_THREADS
3170
Victor Stinner70a46f62015-03-31 22:03:59 +02003171 if (!res) {
3172 /* connect() succeeded, the socket is connected */
3173 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003175
Victor Stinner81c41db2015-04-02 11:50:57 +02003176 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003177
Victor Stinner81c41db2015-04-02 11:50:57 +02003178 /* save error, PyErr_CheckSignals() can replace it */
3179 err = GET_SOCK_ERROR;
3180 if (CHECK_ERRNO(EINTR)) {
3181 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003182 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003183
3184 /* Issue #23618: when connect() fails with EINTR, the connection is
3185 running asynchronously.
3186
3187 If the socket is blocking or has a timeout, wait until the
3188 connection completes, fails or timed out using select(), and then
3189 get the connection status using getsockopt(SO_ERROR).
3190
3191 If the socket is non-blocking, raise InterruptedError. The caller is
3192 responsible to wait until the connection completes, fails or timed
3193 out (it's the case in asyncio for example). */
3194 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3195 }
3196 else {
3197 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3198 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003199 }
3200
Victor Stinner81c41db2015-04-02 11:50:57 +02003201 if (!wait_connect) {
3202 if (raise) {
3203 /* restore error, maybe replaced by PyErr_CheckSignals() */
3204 SET_SOCK_ERROR(err);
3205 s->errorhandler();
3206 return -1;
3207 }
3208 else
3209 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003210 }
3211
Victor Stinner81c41db2015-04-02 11:50:57 +02003212 if (raise) {
3213 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003214 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3215 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003216 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003217 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003218 else {
3219 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003220 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3221 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003222 return err;
3223 }
3224 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003225}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003226
Fred Drake728819a2000-07-01 03:40:12 +00003227/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003228
Guido van Rossum73624e91994-10-10 17:59:00 +00003229static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003230sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 sock_addr_t addrbuf;
3233 int addrlen;
3234 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003235
Oren Milman735171e2018-09-11 19:51:29 +03003236 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003238 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003239
Steve Dowerb82e17e2019-05-23 08:45:22 -07003240 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3241 return NULL;
3242 }
3243
Victor Stinner81c41db2015-04-02 11:50:57 +02003244 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003245 if (res < 0)
3246 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003247
Victor Stinneree699e92015-03-31 21:28:42 +02003248 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003249}
3250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003251PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003252"connect(address)\n\
3253\n\
3254Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003255is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003256
Guido van Rossum30a685f1991-06-27 15:51:29 +00003257
Fred Drake728819a2000-07-01 03:40:12 +00003258/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003259
3260static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003261sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 sock_addr_t addrbuf;
3264 int addrlen;
3265 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003266
Oren Milman735171e2018-09-11 19:51:29 +03003267 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003269 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003270
Steve Dowerb82e17e2019-05-23 08:45:22 -07003271 if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
3272 return NULL;
3273 }
3274
Victor Stinner81c41db2015-04-02 11:50:57 +02003275 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003276 if (res < 0)
3277 return NULL;
3278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003280}
3281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003282PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003283"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003284\n\
3285This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003286instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003287
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003288
Guido van Rossumed233a51992-06-23 09:07:03 +00003289/* s.fileno() method */
3290
Guido van Rossum73624e91994-10-10 17:59:00 +00003291static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303292sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003295}
3296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003297PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003298"fileno() -> integer\n\
3299\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003300Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003301
Guido van Rossumed233a51992-06-23 09:07:03 +00003302
Guido van Rossumc89705d1992-11-26 08:54:07 +00003303/* s.getsockname() method */
3304
Guido van Rossum73624e91994-10-10 17:59:00 +00003305static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303306sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 sock_addr_t addrbuf;
3309 int res;
3310 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 if (!getsockaddrlen(s, &addrlen))
3313 return NULL;
3314 memset(&addrbuf, 0, addrlen);
3315 Py_BEGIN_ALLOW_THREADS
3316 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3317 Py_END_ALLOW_THREADS
3318 if (res < 0)
3319 return s->errorhandler();
3320 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3321 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003322}
3323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003325"getsockname() -> address info\n\
3326\n\
3327Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003328info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003329
Guido van Rossumc89705d1992-11-26 08:54:07 +00003330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003332/* s.getpeername() method */
3333
Guido van Rossum73624e91994-10-10 17:59:00 +00003334static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303335sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 sock_addr_t addrbuf;
3338 int res;
3339 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 if (!getsockaddrlen(s, &addrlen))
3342 return NULL;
3343 memset(&addrbuf, 0, addrlen);
3344 Py_BEGIN_ALLOW_THREADS
3345 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3346 Py_END_ALLOW_THREADS
3347 if (res < 0)
3348 return s->errorhandler();
3349 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3350 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003351}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003353PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003354"getpeername() -> address info\n\
3355\n\
3356Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003357info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003358
Guido van Rossumb6775db1994-08-01 11:34:53 +00003359#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003360
3361
Guido van Rossum30a685f1991-06-27 15:51:29 +00003362/* s.listen(n) method */
3363
Guido van Rossum73624e91994-10-10 17:59:00 +00003364static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003365sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003366{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003367 /* We try to choose a default backlog high enough to avoid connection drops
3368 * for common workloads, yet not too high to limit resource usage. */
3369 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003371
Charles-François Natali644b8f52014-05-22 19:45:39 +01003372 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003376 /* To avoid problems on systems that don't allow a negative backlog
3377 * (which doesn't make sense anyway) we force a minimum value of 0. */
3378 if (backlog < 0)
3379 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 res = listen(s->sock_fd, backlog);
3381 Py_END_ALLOW_THREADS
3382 if (res < 0)
3383 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003384 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003385}
3386
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003387PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003388"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003389\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003390Enable a server to accept connections. If backlog is specified, it must be\n\
3391at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003392unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003393connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003394
Victor Stinner31bf2d52015-04-01 21:57:09 +02003395struct sock_recv {
3396 char *cbuf;
3397 Py_ssize_t len;
3398 int flags;
3399 Py_ssize_t result;
3400};
3401
3402static int
3403sock_recv_impl(PySocketSockObject *s, void *data)
3404{
3405 struct sock_recv *ctx = data;
3406
3407#ifdef MS_WINDOWS
3408 if (ctx->len > INT_MAX)
3409 ctx->len = INT_MAX;
3410 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3411#else
3412 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3413#endif
3414 return (ctx->result >= 0);
3415}
3416
Guido van Rossum82a5c661998-07-07 20:45:43 +00003417
Thomas Wouters477c8d52006-05-27 19:21:47 +00003418/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003419 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003420 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003421 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003422 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003423 * also possible that we return a number of bytes smaller than the request
3424 * bytes.
3425 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003426
Antoine Pitrou19467d22010-08-17 19:33:30 +00003427static Py_ssize_t
3428sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003429{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003430 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 if (!IS_SELECTABLE(s)) {
3433 select_error();
3434 return -1;
3435 }
3436 if (len == 0) {
3437 /* If 0 bytes were requested, do nothing. */
3438 return 0;
3439 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003440
Victor Stinner31bf2d52015-04-01 21:57:09 +02003441 ctx.cbuf = cbuf;
3442 ctx.len = len;
3443 ctx.flags = flags;
3444 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003446
3447 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003448}
3449
Guido van Rossum48a680c2001-03-02 06:34:14 +00003450
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003451/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003452
Guido van Rossum73624e91994-10-10 17:59:00 +00003453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003454sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003455{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003456 Py_ssize_t recvlen, outlen;
3457 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003459
Antoine Pitrou19467d22010-08-17 19:33:30 +00003460 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 if (recvlen < 0) {
3464 PyErr_SetString(PyExc_ValueError,
3465 "negative buffersize in recv");
3466 return NULL;
3467 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 /* Allocate a new string. */
3470 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3471 if (buf == NULL)
3472 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 /* Call the guts */
3475 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3476 if (outlen < 0) {
3477 /* An error occurred, release the string and return an
3478 error. */
3479 Py_DECREF(buf);
3480 return NULL;
3481 }
3482 if (outlen != recvlen) {
3483 /* We did not read as many bytes as we anticipated, resize the
3484 string if possible and be successful. */
3485 _PyBytes_Resize(&buf, outlen);
3486 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003489}
3490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003491PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003492"recv(buffersize[, flags]) -> data\n\
3493\n\
3494Receive up to buffersize bytes from the socket. For the optional flags\n\
3495argument, see the Unix manual. When no data is available, block until\n\
3496at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003497the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003498
Guido van Rossum30a685f1991-06-27 15:51:29 +00003499
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003500/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003501
Thomas Wouters477c8d52006-05-27 19:21:47 +00003502static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003503sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003506
Antoine Pitrou19467d22010-08-17 19:33:30 +00003507 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 Py_buffer pbuf;
3509 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003510 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003513 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 &pbuf, &recvlen, &flags))
3515 return NULL;
3516 buf = pbuf.buf;
3517 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 if (recvlen < 0) {
3520 PyBuffer_Release(&pbuf);
3521 PyErr_SetString(PyExc_ValueError,
3522 "negative buffersize in recv_into");
3523 return NULL;
3524 }
3525 if (recvlen == 0) {
3526 /* If nbytes was not specified, use the buffer's length */
3527 recvlen = buflen;
3528 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 /* Check if the buffer is large enough */
3531 if (buflen < recvlen) {
3532 PyBuffer_Release(&pbuf);
3533 PyErr_SetString(PyExc_ValueError,
3534 "buffer too small for requested bytes");
3535 return NULL;
3536 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 /* Call the guts */
3539 readlen = sock_recv_guts(s, buf, recvlen, flags);
3540 if (readlen < 0) {
3541 /* Return an error. */
3542 PyBuffer_Release(&pbuf);
3543 return NULL;
3544 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 PyBuffer_Release(&pbuf);
3547 /* Return the number of bytes read. Note that we do not do anything
3548 special here in the case that readlen < recvlen. */
3549 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003550}
3551
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003552PyDoc_STRVAR(recv_into_doc,
3553"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003554\n\
oldkaa0735f2018-02-02 16:52:55 +08003555A version of recv() that stores its data into a buffer rather than creating\n\
3556a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003557is not specified (or 0), receive up to the size available in the given buffer.\n\
3558\n\
3559See recv() for documentation about the flags.");
3560
Victor Stinner31bf2d52015-04-01 21:57:09 +02003561struct sock_recvfrom {
3562 char* cbuf;
3563 Py_ssize_t len;
3564 int flags;
3565 socklen_t *addrlen;
3566 sock_addr_t *addrbuf;
3567 Py_ssize_t result;
3568};
3569
3570static int
3571sock_recvfrom_impl(PySocketSockObject *s, void *data)
3572{
3573 struct sock_recvfrom *ctx = data;
3574
3575 memset(ctx->addrbuf, 0, *ctx->addrlen);
3576
3577#ifdef MS_WINDOWS
3578 if (ctx->len > INT_MAX)
3579 ctx->len = INT_MAX;
3580 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3581 SAS2SA(ctx->addrbuf), ctx->addrlen);
3582#else
3583 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3584 SAS2SA(ctx->addrbuf), ctx->addrlen);
3585#endif
3586 return (ctx->result >= 0);
3587}
3588
Thomas Wouters477c8d52006-05-27 19:21:47 +00003589
3590/*
Christian Heimes99170a52007-12-19 02:07:34 +00003591 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3592 * into a char buffer. If you have any inc/def ref to do to the objects that
3593 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003594 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003595 * that it is also possible that we return a number of bytes smaller than the
3596 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003597 *
3598 * 'addr' is a return value for the address object. Note that you must decref
3599 * it yourself.
3600 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003601static Py_ssize_t
3602sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003607 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 if (!getsockaddrlen(s, &addrlen))
3612 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 if (!IS_SELECTABLE(s)) {
3615 select_error();
3616 return -1;
3617 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003618
Victor Stinner31bf2d52015-04-01 21:57:09 +02003619 ctx.cbuf = cbuf;
3620 ctx.len = len;
3621 ctx.flags = flags;
3622 ctx.addrbuf = &addrbuf;
3623 ctx.addrlen = &addrlen;
3624 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003626
Victor Stinner31bf2d52015-04-01 21:57:09 +02003627 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3628 s->sock_proto);
3629 if (*addr == NULL)
3630 return -1;
3631
3632 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003633}
3634
3635/* s.recvfrom(nbytes [,flags]) method */
3636
3637static PyObject *
3638sock_recvfrom(PySocketSockObject *s, PyObject *args)
3639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 PyObject *buf = NULL;
3641 PyObject *addr = NULL;
3642 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003643 int flags = 0;
3644 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003645
Antoine Pitrou19467d22010-08-17 19:33:30 +00003646 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 if (recvlen < 0) {
3650 PyErr_SetString(PyExc_ValueError,
3651 "negative buffersize in recvfrom");
3652 return NULL;
3653 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3656 if (buf == NULL)
3657 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3660 recvlen, flags, &addr);
3661 if (outlen < 0) {
3662 goto finally;
3663 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 if (outlen != recvlen) {
3666 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003667 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003669 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003670 goto finally;
3671 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003673 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003674
3675finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 Py_XDECREF(buf);
3677 Py_XDECREF(addr);
3678 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003679}
3680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003681PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003682"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3683\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003684Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003685
Thomas Wouters477c8d52006-05-27 19:21:47 +00003686
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003687/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003688
3689static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003690sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003693
Antoine Pitrou19467d22010-08-17 19:33:30 +00003694 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 Py_buffer pbuf;
3696 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003697 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003700
Antoine Pitrou19467d22010-08-17 19:33:30 +00003701 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 kwlist, &pbuf,
3703 &recvlen, &flags))
3704 return NULL;
3705 buf = pbuf.buf;
3706 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 if (recvlen < 0) {
3709 PyBuffer_Release(&pbuf);
3710 PyErr_SetString(PyExc_ValueError,
3711 "negative buffersize in recvfrom_into");
3712 return NULL;
3713 }
3714 if (recvlen == 0) {
3715 /* If nbytes was not specified, use the buffer's length */
3716 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003717 } else if (recvlen > buflen) {
3718 PyBuffer_Release(&pbuf);
3719 PyErr_SetString(PyExc_ValueError,
3720 "nbytes is greater than the length of the buffer");
3721 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3725 if (readlen < 0) {
3726 PyBuffer_Release(&pbuf);
3727 /* Return an error */
3728 Py_XDECREF(addr);
3729 return NULL;
3730 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 PyBuffer_Release(&pbuf);
3733 /* Return the number of bytes read and the address. Note that we do
3734 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003735 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003736}
3737
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003738PyDoc_STRVAR(recvfrom_into_doc,
3739"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003740\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003741Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003742
Victor Stinner35bee932015-04-02 12:28:07 +02003743/* The sendmsg() and recvmsg[_into]() methods require a working
3744 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3745#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003746struct sock_recvmsg {
3747 struct msghdr *msg;
3748 int flags;
3749 ssize_t result;
3750};
3751
3752static int
3753sock_recvmsg_impl(PySocketSockObject *s, void *data)
3754{
3755 struct sock_recvmsg *ctx = data;
3756
3757 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3758 return (ctx->result >= 0);
3759}
3760
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003761/*
3762 * Call recvmsg() with the supplied iovec structures, flags, and
3763 * ancillary data buffer size (controllen). Returns the tuple return
3764 * value for recvmsg() or recvmsg_into(), with the first item provided
3765 * by the supplied makeval() function. makeval() will be called with
3766 * the length read and makeval_data as arguments, and must return a
3767 * new reference (which will be decrefed if there is a subsequent
3768 * error). On error, closes any file descriptors received via
3769 * SCM_RIGHTS.
3770 */
3771static PyObject *
3772sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3773 int flags, Py_ssize_t controllen,
3774 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3775{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003776 sock_addr_t addrbuf;
3777 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003778 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003779 PyObject *cmsg_list = NULL, *retval = NULL;
3780 void *controlbuf = NULL;
3781 struct cmsghdr *cmsgh;
3782 size_t cmsgdatalen = 0;
3783 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003784 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003785
3786 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3787 ignored" when the socket is connected (Linux fills them in
3788 anyway for AF_UNIX sockets at least). Normally msg_namelen
3789 seems to be set to 0 if there's no address, but try to
3790 initialize msg_name to something that won't be mistaken for a
3791 real address if that doesn't happen. */
3792 if (!getsockaddrlen(s, &addrbuflen))
3793 return NULL;
3794 memset(&addrbuf, 0, addrbuflen);
3795 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3796
3797 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3798 PyErr_SetString(PyExc_ValueError,
3799 "invalid ancillary data buffer length");
3800 return NULL;
3801 }
3802 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3803 return PyErr_NoMemory();
3804
3805 /* Make the system call. */
3806 if (!IS_SELECTABLE(s)) {
3807 select_error();
3808 goto finally;
3809 }
3810
Victor Stinner31bf2d52015-04-01 21:57:09 +02003811 msg.msg_name = SAS2SA(&addrbuf);
3812 msg.msg_namelen = addrbuflen;
3813 msg.msg_iov = iov;
3814 msg.msg_iovlen = iovlen;
3815 msg.msg_control = controlbuf;
3816 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003817
Victor Stinner31bf2d52015-04-01 21:57:09 +02003818 ctx.msg = &msg;
3819 ctx.flags = flags;
3820 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003821 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003822
3823 /* Make list of (level, type, data) tuples from control messages. */
3824 if ((cmsg_list = PyList_New(0)) == NULL)
3825 goto err_closefds;
3826 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3827 implementations didn't do so. */
3828 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3829 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3830 PyObject *bytes, *tuple;
3831 int tmp;
3832
3833 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3834 if (cmsg_status != 0) {
3835 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3836 "received malformed or improperly-truncated "
3837 "ancillary data", 1) == -1)
3838 goto err_closefds;
3839 }
3840 if (cmsg_status < 0)
3841 break;
3842 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003843 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003844 goto err_closefds;
3845 }
3846
3847 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3848 cmsgdatalen);
3849 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3850 (int)cmsgh->cmsg_type, bytes);
3851 if (tuple == NULL)
3852 goto err_closefds;
3853 tmp = PyList_Append(cmsg_list, tuple);
3854 Py_DECREF(tuple);
3855 if (tmp != 0)
3856 goto err_closefds;
3857
3858 if (cmsg_status != 0)
3859 break;
3860 }
3861
3862 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003863 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003864 cmsg_list,
3865 (int)msg.msg_flags,
3866 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3867 ((msg.msg_namelen > addrbuflen) ?
3868 addrbuflen : msg.msg_namelen),
3869 s->sock_proto));
3870 if (retval == NULL)
3871 goto err_closefds;
3872
3873finally:
3874 Py_XDECREF(cmsg_list);
3875 PyMem_Free(controlbuf);
3876 return retval;
3877
3878err_closefds:
3879#ifdef SCM_RIGHTS
3880 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3881 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3882 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3883 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3884 if (cmsg_status < 0)
3885 break;
3886 if (cmsgh->cmsg_level == SOL_SOCKET &&
3887 cmsgh->cmsg_type == SCM_RIGHTS) {
3888 size_t numfds;
3889 int *fdp;
3890
3891 numfds = cmsgdatalen / sizeof(int);
3892 fdp = (int *)CMSG_DATA(cmsgh);
3893 while (numfds-- > 0)
3894 close(*fdp++);
3895 }
3896 if (cmsg_status != 0)
3897 break;
3898 }
3899#endif /* SCM_RIGHTS */
3900 goto finally;
3901}
3902
3903
3904static PyObject *
3905makeval_recvmsg(ssize_t received, void *data)
3906{
3907 PyObject **buf = data;
3908
3909 if (received < PyBytes_GET_SIZE(*buf))
3910 _PyBytes_Resize(buf, received);
3911 Py_XINCREF(*buf);
3912 return *buf;
3913}
3914
3915/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3916
3917static PyObject *
3918sock_recvmsg(PySocketSockObject *s, PyObject *args)
3919{
3920 Py_ssize_t bufsize, ancbufsize = 0;
3921 int flags = 0;
3922 struct iovec iov;
3923 PyObject *buf = NULL, *retval = NULL;
3924
3925 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3926 return NULL;
3927
3928 if (bufsize < 0) {
3929 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3930 return NULL;
3931 }
3932 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3933 return NULL;
3934 iov.iov_base = PyBytes_AS_STRING(buf);
3935 iov.iov_len = bufsize;
3936
3937 /* Note that we're passing a pointer to *our pointer* to the bytes
3938 object here (&buf); makeval_recvmsg() may incref the object, or
3939 deallocate it and set our pointer to NULL. */
3940 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3941 &makeval_recvmsg, &buf);
3942 Py_XDECREF(buf);
3943 return retval;
3944}
3945
3946PyDoc_STRVAR(recvmsg_doc,
3947"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3948\n\
3949Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3950socket. The ancbufsize argument sets the size in bytes of the\n\
3951internal buffer used to receive the ancillary data; it defaults to 0,\n\
3952meaning that no ancillary data will be received. Appropriate buffer\n\
3953sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3954CMSG_LEN(), and items which do not fit into the buffer might be\n\
3955truncated or discarded. The flags argument defaults to 0 and has the\n\
3956same meaning as for recv().\n\
3957\n\
3958The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3959The data item is a bytes object holding the non-ancillary data\n\
3960received. The ancdata item is a list of zero or more tuples\n\
3961(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3962(control messages) received: cmsg_level and cmsg_type are integers\n\
3963specifying the protocol level and protocol-specific type respectively,\n\
3964and cmsg_data is a bytes object holding the associated data. The\n\
3965msg_flags item is the bitwise OR of various flags indicating\n\
3966conditions on the received message; see your system documentation for\n\
3967details. If the receiving socket is unconnected, address is the\n\
3968address of the sending socket, if available; otherwise, its value is\n\
3969unspecified.\n\
3970\n\
3971If recvmsg() raises an exception after the system call returns, it\n\
3972will first attempt to close any file descriptors received via the\n\
3973SCM_RIGHTS mechanism.");
3974
3975
3976static PyObject *
3977makeval_recvmsg_into(ssize_t received, void *data)
3978{
3979 return PyLong_FromSsize_t(received);
3980}
3981
3982/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3983
3984static PyObject *
3985sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3986{
3987 Py_ssize_t ancbufsize = 0;
3988 int flags = 0;
3989 struct iovec *iovs = NULL;
3990 Py_ssize_t i, nitems, nbufs = 0;
3991 Py_buffer *bufs = NULL;
3992 PyObject *buffers_arg, *fast, *retval = NULL;
3993
3994 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3995 &buffers_arg, &ancbufsize, &flags))
3996 return NULL;
3997
3998 if ((fast = PySequence_Fast(buffers_arg,
3999 "recvmsg_into() argument 1 must be an "
4000 "iterable")) == NULL)
4001 return NULL;
4002 nitems = PySequence_Fast_GET_SIZE(fast);
4003 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004004 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004005 goto finally;
4006 }
4007
4008 /* Fill in an iovec for each item, and save the Py_buffer
4009 structs to release afterwards. */
4010 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
4011 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
4012 PyErr_NoMemory();
4013 goto finally;
4014 }
4015 for (; nbufs < nitems; nbufs++) {
4016 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
4017 "w*;recvmsg_into() argument 1 must be an iterable "
4018 "of single-segment read-write buffers",
4019 &bufs[nbufs]))
4020 goto finally;
4021 iovs[nbufs].iov_base = bufs[nbufs].buf;
4022 iovs[nbufs].iov_len = bufs[nbufs].len;
4023 }
4024
4025 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
4026 &makeval_recvmsg_into, NULL);
4027finally:
4028 for (i = 0; i < nbufs; i++)
4029 PyBuffer_Release(&bufs[i]);
4030 PyMem_Free(bufs);
4031 PyMem_Free(iovs);
4032 Py_DECREF(fast);
4033 return retval;
4034}
4035
4036PyDoc_STRVAR(recvmsg_into_doc,
4037"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
4038\n\
4039Receive normal data and ancillary data from the socket, scattering the\n\
4040non-ancillary data into a series of buffers. The buffers argument\n\
4041must be an iterable of objects that export writable buffers\n\
4042(e.g. bytearray objects); these will be filled with successive chunks\n\
4043of the non-ancillary data until it has all been written or there are\n\
4044no more buffers. The ancbufsize argument sets the size in bytes of\n\
4045the internal buffer used to receive the ancillary data; it defaults to\n\
40460, meaning that no ancillary data will be received. Appropriate\n\
4047buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
4048or CMSG_LEN(), and items which do not fit into the buffer might be\n\
4049truncated or discarded. The flags argument defaults to 0 and has the\n\
4050same meaning as for recv().\n\
4051\n\
4052The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
4053The nbytes item is the total number of bytes of non-ancillary data\n\
4054written into the buffers. The ancdata item is a list of zero or more\n\
4055tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
4056data (control messages) received: cmsg_level and cmsg_type are\n\
4057integers specifying the protocol level and protocol-specific type\n\
4058respectively, and cmsg_data is a bytes object holding the associated\n\
4059data. The msg_flags item is the bitwise OR of various flags\n\
4060indicating conditions on the received message; see your system\n\
4061documentation for details. If the receiving socket is unconnected,\n\
4062address is the address of the sending socket, if available; otherwise,\n\
4063its value is unspecified.\n\
4064\n\
4065If recvmsg_into() raises an exception after the system call returns,\n\
4066it will first attempt to close any file descriptors received via the\n\
4067SCM_RIGHTS mechanism.");
4068#endif /* CMSG_LEN */
4069
4070
Victor Stinner31bf2d52015-04-01 21:57:09 +02004071struct sock_send {
4072 char *buf;
4073 Py_ssize_t len;
4074 int flags;
4075 Py_ssize_t result;
4076};
4077
4078static int
4079sock_send_impl(PySocketSockObject *s, void *data)
4080{
4081 struct sock_send *ctx = data;
4082
4083#ifdef MS_WINDOWS
4084 if (ctx->len > INT_MAX)
4085 ctx->len = INT_MAX;
4086 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
4087#else
4088 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
4089#endif
4090 return (ctx->result >= 0);
4091}
4092
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004093/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004094
Guido van Rossum73624e91994-10-10 17:59:00 +00004095static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004096sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004097{
Victor Stinner31bf2d52015-04-01 21:57:09 +02004098 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004100 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
4103 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 if (!IS_SELECTABLE(s)) {
4106 PyBuffer_Release(&pbuf);
4107 return select_error();
4108 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02004109 ctx.buf = pbuf.buf;
4110 ctx.len = pbuf.len;
4111 ctx.flags = flags;
4112 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004113 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 return NULL;
4115 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004116 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004117
4118 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004119}
4120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004121PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004122"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004123\n\
4124Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004125argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004126sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004127
4128
4129/* s.sendall(data [,flags]) method */
4130
4131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004132sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004135 Py_ssize_t len, n;
4136 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004138 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004139 int has_timeout = (s->sock_timeout > 0);
4140 _PyTime_t interval = s->sock_timeout;
4141 _PyTime_t deadline = 0;
4142 int deadline_initialized = 0;
4143 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004145 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4146 return NULL;
4147 buf = pbuf.buf;
4148 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 if (!IS_SELECTABLE(s)) {
4151 PyBuffer_Release(&pbuf);
4152 return select_error();
4153 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004155 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004156 if (has_timeout) {
4157 if (deadline_initialized) {
4158 /* recompute the timeout */
4159 interval = deadline - _PyTime_GetMonotonicClock();
4160 }
4161 else {
4162 deadline_initialized = 1;
4163 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4164 }
4165
4166 if (interval <= 0) {
4167 PyErr_SetString(socket_timeout, "timed out");
4168 goto done;
4169 }
4170 }
4171
Victor Stinner02f32ab2015-04-01 22:53:26 +02004172 ctx.buf = buf;
4173 ctx.len = len;
4174 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004175 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4176 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004177 n = ctx.result;
4178 assert(n >= 0);
4179
4180 buf += n;
4181 len -= n;
4182
4183 /* We must run our signal handlers before looping again.
4184 send() can return a successful partial write when it is
4185 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004186 if (PyErr_CheckSignals())
4187 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004188 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004190
Victor Stinner8912d142015-04-06 23:16:34 +02004191 Py_INCREF(Py_None);
4192 res = Py_None;
4193
4194done:
4195 PyBuffer_Release(&pbuf);
4196 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004197}
4198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004199PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004200"sendall(data[, flags])\n\
4201\n\
4202Send a data string to the socket. For the optional flags\n\
4203argument, see the Unix manual. This calls send() repeatedly\n\
4204until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004205to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004206
Guido van Rossum30a685f1991-06-27 15:51:29 +00004207
Victor Stinner31bf2d52015-04-01 21:57:09 +02004208struct sock_sendto {
4209 char *buf;
4210 Py_ssize_t len;
4211 int flags;
4212 int addrlen;
4213 sock_addr_t *addrbuf;
4214 Py_ssize_t result;
4215};
4216
4217static int
4218sock_sendto_impl(PySocketSockObject *s, void *data)
4219{
4220 struct sock_sendto *ctx = data;
4221
4222#ifdef MS_WINDOWS
4223 if (ctx->len > INT_MAX)
4224 ctx->len = INT_MAX;
4225 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4226 SAS2SA(ctx->addrbuf), ctx->addrlen);
4227#else
4228 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4229 SAS2SA(ctx->addrbuf), ctx->addrlen);
4230#endif
4231 return (ctx->result >= 0);
4232}
4233
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004234/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004235
Guido van Rossum73624e91994-10-10 17:59:00 +00004236static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004237sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 Py_buffer pbuf;
4240 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004241 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004243 int addrlen, flags;
4244 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004247 arglen = PyTuple_Size(args);
4248 switch (arglen) {
4249 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004250 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4251 return NULL;
4252 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004253 break;
4254 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004255 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4256 &pbuf, &flags, &addro)) {
4257 return NULL;
4258 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004259 break;
4260 default:
4261 PyErr_Format(PyExc_TypeError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004262 "sendto() takes 2 or 3 arguments (%zd given)",
Antoine Pitrou5e981412011-03-17 22:38:37 +01004263 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004264 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 if (!IS_SELECTABLE(s)) {
4268 PyBuffer_Release(&pbuf);
4269 return select_error();
4270 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004271
Oren Milman735171e2018-09-11 19:51:29 +03004272 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 PyBuffer_Release(&pbuf);
4274 return NULL;
4275 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004276
Steve Dowerb82e17e2019-05-23 08:45:22 -07004277 if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
4278 return NULL;
4279 }
4280
Victor Stinner31bf2d52015-04-01 21:57:09 +02004281 ctx.buf = pbuf.buf;
4282 ctx.len = pbuf.len;
4283 ctx.flags = flags;
4284 ctx.addrlen = addrlen;
4285 ctx.addrbuf = &addrbuf;
4286 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004287 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 return NULL;
4289 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004290 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004291
4292 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004293}
4294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004295PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004296"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004297\n\
4298Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004299For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004300
Guido van Rossum30a685f1991-06-27 15:51:29 +00004301
Victor Stinner35bee932015-04-02 12:28:07 +02004302/* The sendmsg() and recvmsg[_into]() methods require a working
4303 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4304#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004305struct sock_sendmsg {
4306 struct msghdr *msg;
4307 int flags;
4308 ssize_t result;
4309};
4310
4311static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004312sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4313 struct msghdr *msg,
4314 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4315 Py_ssize_t ndataparts, ndatabufs = 0;
4316 int result = -1;
4317 struct iovec *iovs = NULL;
4318 PyObject *data_fast = NULL;
4319 Py_buffer *databufs = NULL;
4320
4321 /* Fill in an iovec for each message part, and save the Py_buffer
4322 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004323 data_fast = PySequence_Fast(data_arg,
4324 "sendmsg() argument 1 must be an "
4325 "iterable");
4326 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004327 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004328 }
4329
Christian Heimesdffa3942016-09-05 23:54:41 +02004330 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4331 if (ndataparts > INT_MAX) {
4332 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4333 goto finally;
4334 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004335
Christian Heimesdffa3942016-09-05 23:54:41 +02004336 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004337 if (ndataparts > 0) {
4338 iovs = PyMem_New(struct iovec, ndataparts);
4339 if (iovs == NULL) {
4340 PyErr_NoMemory();
4341 goto finally;
4342 }
4343 msg->msg_iov = iovs;
4344
4345 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004346 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004347 PyErr_NoMemory();
4348 goto finally;
4349 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004350 }
4351 for (; ndatabufs < ndataparts; ndatabufs++) {
4352 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4353 "y*;sendmsg() argument 1 must be an iterable of "
4354 "bytes-like objects",
4355 &databufs[ndatabufs]))
4356 goto finally;
4357 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4358 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4359 }
4360 result = 0;
4361 finally:
4362 *databufsout = databufs;
4363 *ndatabufsout = ndatabufs;
4364 Py_XDECREF(data_fast);
4365 return result;
4366}
4367
4368static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004369sock_sendmsg_impl(PySocketSockObject *s, void *data)
4370{
4371 struct sock_sendmsg *ctx = data;
4372
4373 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4374 return (ctx->result >= 0);
4375}
4376
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004377/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4378
4379static PyObject *
4380sock_sendmsg(PySocketSockObject *s, PyObject *args)
4381{
Christian Heimesdffa3942016-09-05 23:54:41 +02004382 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004383 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004384 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004385 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004386 struct cmsginfo {
4387 int level;
4388 int type;
4389 Py_buffer data;
4390 } *cmsgs = NULL;
4391 void *controlbuf = NULL;
4392 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004393 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004394 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004395 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004396 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004397
4398 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004399 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004400 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004401 }
4402
4403 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004404
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004405 /* Parse destination address. */
4406 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004407 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4408 "sendmsg"))
4409 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004410 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004411 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07004412 if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
4413 return NULL;
4414 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004415 msg.msg_name = &addrbuf;
4416 msg.msg_namelen = addrlen;
Steve Dowerb82e17e2019-05-23 08:45:22 -07004417 } else {
4418 if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
4419 return NULL;
4420 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004421 }
4422
4423 /* Fill in an iovec for each message part, and save the Py_buffer
4424 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004425 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004426 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004427 }
4428
4429 if (cmsg_arg == NULL)
4430 ncmsgs = 0;
4431 else {
4432 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4433 "sendmsg() argument 2 must be an "
4434 "iterable")) == NULL)
4435 goto finally;
4436 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4437 }
4438
4439#ifndef CMSG_SPACE
4440 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004441 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004442 "sending multiple control messages is not supported "
4443 "on this system");
4444 goto finally;
4445 }
4446#endif
4447 /* Save level, type and Py_buffer for each control message,
4448 and calculate total size. */
4449 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4450 PyErr_NoMemory();
4451 goto finally;
4452 }
4453 controllen = controllen_last = 0;
4454 while (ncmsgbufs < ncmsgs) {
4455 size_t bufsize, space;
4456
4457 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4458 "(iiy*):[sendmsg() ancillary data items]",
4459 &cmsgs[ncmsgbufs].level,
4460 &cmsgs[ncmsgbufs].type,
4461 &cmsgs[ncmsgbufs].data))
4462 goto finally;
4463 bufsize = cmsgs[ncmsgbufs++].data.len;
4464
4465#ifdef CMSG_SPACE
4466 if (!get_CMSG_SPACE(bufsize, &space)) {
4467#else
4468 if (!get_CMSG_LEN(bufsize, &space)) {
4469#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004470 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004471 goto finally;
4472 }
4473 controllen += space;
4474 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004475 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004476 goto finally;
4477 }
4478 controllen_last = controllen;
4479 }
4480
4481 /* Construct ancillary data block from control message info. */
4482 if (ncmsgbufs > 0) {
4483 struct cmsghdr *cmsgh = NULL;
4484
Victor Stinner52d61e42016-09-12 11:41:58 +02004485 controlbuf = PyMem_Malloc(controllen);
4486 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004487 PyErr_NoMemory();
4488 goto finally;
4489 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004490 msg.msg_control = controlbuf;
4491
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004492 msg.msg_controllen = controllen;
4493
4494 /* Need to zero out the buffer as a workaround for glibc's
4495 CMSG_NXTHDR() implementation. After getting the pointer to
4496 the next header, it checks its (uninitialized) cmsg_len
4497 member to see if the "message" fits in the buffer, and
4498 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004499 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004500 memset(controlbuf, 0, controllen);
4501
4502 for (i = 0; i < ncmsgbufs; i++) {
4503 size_t msg_len, data_len = cmsgs[i].data.len;
4504 int enough_space = 0;
4505
4506 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4507 if (cmsgh == NULL) {
4508 PyErr_Format(PyExc_RuntimeError,
4509 "unexpected NULL result from %s()",
4510 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4511 goto finally;
4512 }
4513 if (!get_CMSG_LEN(data_len, &msg_len)) {
4514 PyErr_SetString(PyExc_RuntimeError,
4515 "item size out of range for CMSG_LEN()");
4516 goto finally;
4517 }
4518 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4519 size_t space;
4520
4521 cmsgh->cmsg_len = msg_len;
4522 if (get_cmsg_data_space(&msg, cmsgh, &space))
4523 enough_space = (space >= data_len);
4524 }
4525 if (!enough_space) {
4526 PyErr_SetString(PyExc_RuntimeError,
4527 "ancillary data does not fit in calculated "
4528 "space");
4529 goto finally;
4530 }
4531 cmsgh->cmsg_level = cmsgs[i].level;
4532 cmsgh->cmsg_type = cmsgs[i].type;
4533 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4534 }
4535 }
4536
4537 /* Make the system call. */
4538 if (!IS_SELECTABLE(s)) {
4539 select_error();
4540 goto finally;
4541 }
4542
Victor Stinner31bf2d52015-04-01 21:57:09 +02004543 ctx.msg = &msg;
4544 ctx.flags = flags;
4545 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004546 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004547
4548 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004549
4550finally:
4551 PyMem_Free(controlbuf);
4552 for (i = 0; i < ncmsgbufs; i++)
4553 PyBuffer_Release(&cmsgs[i].data);
4554 PyMem_Free(cmsgs);
4555 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004556 PyMem_Free(msg.msg_iov);
4557 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004558 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004559 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004560 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004561 return retval;
4562}
4563
4564PyDoc_STRVAR(sendmsg_doc,
4565"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4566\n\
4567Send normal and ancillary data to the socket, gathering the\n\
4568non-ancillary data from a series of buffers and concatenating it into\n\
4569a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004570data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004571The ancdata argument specifies the ancillary data (control messages)\n\
4572as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4573cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4574protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004575is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004576argument defaults to 0 and has the same meaning as for send(). If\n\
4577address is supplied and not None, it sets a destination address for\n\
4578the message. The return value is the number of bytes of non-ancillary\n\
4579data sent.");
4580#endif /* CMSG_LEN */
4581
Christian Heimesdffa3942016-09-05 23:54:41 +02004582#ifdef HAVE_SOCKADDR_ALG
4583static PyObject*
4584sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4585{
4586 PyObject *retval = NULL;
4587
4588 Py_ssize_t i, ndatabufs = 0;
4589 Py_buffer *databufs = NULL;
4590 PyObject *data_arg = NULL;
4591
4592 Py_buffer iv = {NULL, NULL};
4593
4594 PyObject *opobj = NULL;
4595 int op = -1;
4596
4597 PyObject *assoclenobj = NULL;
4598 int assoclen = -1;
4599
4600 unsigned int *uiptr;
4601 int flags = 0;
4602
4603 struct msghdr msg;
4604 struct cmsghdr *header = NULL;
4605 struct af_alg_iv *alg_iv = NULL;
4606 struct sock_sendmsg ctx;
4607 Py_ssize_t controllen;
4608 void *controlbuf = NULL;
4609 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4610
4611 if (self->sock_family != AF_ALG) {
4612 PyErr_SetString(PyExc_OSError,
4613 "algset is only supported for AF_ALG");
4614 return NULL;
4615 }
4616
4617 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4618 "|O$O!y*O!i:sendmsg_afalg", keywords,
4619 &data_arg,
4620 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004621 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004622 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004623 }
4624
4625 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004626
4627 /* op is a required, keyword-only argument >= 0 */
4628 if (opobj != NULL) {
4629 op = _PyLong_AsInt(opobj);
4630 }
4631 if (op < 0) {
4632 /* override exception from _PyLong_AsInt() */
4633 PyErr_SetString(PyExc_TypeError,
4634 "Invalid or missing argument 'op'");
4635 goto finally;
4636 }
4637 /* assoclen is optional but must be >= 0 */
4638 if (assoclenobj != NULL) {
4639 assoclen = _PyLong_AsInt(assoclenobj);
4640 if (assoclen == -1 && PyErr_Occurred()) {
4641 goto finally;
4642 }
4643 if (assoclen < 0) {
4644 PyErr_SetString(PyExc_TypeError,
4645 "assoclen must be positive");
4646 goto finally;
4647 }
4648 }
4649
4650 controllen = CMSG_SPACE(4);
4651 if (iv.buf != NULL) {
4652 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4653 }
4654 if (assoclen >= 0) {
4655 controllen += CMSG_SPACE(4);
4656 }
4657
4658 controlbuf = PyMem_Malloc(controllen);
4659 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004660 PyErr_NoMemory();
4661 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004662 }
4663 memset(controlbuf, 0, controllen);
4664
Christian Heimesdffa3942016-09-05 23:54:41 +02004665 msg.msg_controllen = controllen;
4666 msg.msg_control = controlbuf;
4667
4668 /* Fill in an iovec for each message part, and save the Py_buffer
4669 structs to release afterwards. */
4670 if (data_arg != NULL) {
4671 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4672 goto finally;
4673 }
4674 }
4675
4676 /* set operation to encrypt or decrypt */
4677 header = CMSG_FIRSTHDR(&msg);
4678 if (header == NULL) {
4679 PyErr_SetString(PyExc_RuntimeError,
4680 "unexpected NULL result from CMSG_FIRSTHDR");
4681 goto finally;
4682 }
4683 header->cmsg_level = SOL_ALG;
4684 header->cmsg_type = ALG_SET_OP;
4685 header->cmsg_len = CMSG_LEN(4);
4686 uiptr = (void*)CMSG_DATA(header);
4687 *uiptr = (unsigned int)op;
4688
4689 /* set initialization vector */
4690 if (iv.buf != NULL) {
4691 header = CMSG_NXTHDR(&msg, header);
4692 if (header == NULL) {
4693 PyErr_SetString(PyExc_RuntimeError,
4694 "unexpected NULL result from CMSG_NXTHDR(iv)");
4695 goto finally;
4696 }
4697 header->cmsg_level = SOL_ALG;
4698 header->cmsg_type = ALG_SET_IV;
4699 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4700 alg_iv = (void*)CMSG_DATA(header);
4701 alg_iv->ivlen = iv.len;
4702 memcpy(alg_iv->iv, iv.buf, iv.len);
4703 }
4704
4705 /* set length of associated data for AEAD */
4706 if (assoclen >= 0) {
4707 header = CMSG_NXTHDR(&msg, header);
4708 if (header == NULL) {
4709 PyErr_SetString(PyExc_RuntimeError,
4710 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4711 goto finally;
4712 }
4713 header->cmsg_level = SOL_ALG;
4714 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4715 header->cmsg_len = CMSG_LEN(4);
4716 uiptr = (void*)CMSG_DATA(header);
4717 *uiptr = (unsigned int)assoclen;
4718 }
4719
4720 ctx.msg = &msg;
4721 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004722 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004723 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004724 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004725
4726 retval = PyLong_FromSsize_t(ctx.result);
4727
4728 finally:
4729 PyMem_Free(controlbuf);
4730 if (iv.buf != NULL) {
4731 PyBuffer_Release(&iv);
4732 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004733 PyMem_Free(msg.msg_iov);
4734 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004735 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004736 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004737 PyMem_Free(databufs);
4738 return retval;
4739}
4740
4741PyDoc_STRVAR(sendmsg_afalg_doc,
4742"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4743\n\
4744Set operation mode, IV and length of associated data for an AF_ALG\n\
4745operation socket.");
4746#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004747
Guido van Rossum30a685f1991-06-27 15:51:29 +00004748/* s.shutdown(how) method */
4749
Guido van Rossum73624e91994-10-10 17:59:00 +00004750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004751sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 int how;
4754 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004755
Serhiy Storchaka78980432013-01-15 01:12:17 +02004756 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 if (how == -1 && PyErr_Occurred())
4758 return NULL;
4759 Py_BEGIN_ALLOW_THREADS
4760 res = shutdown(s->sock_fd, how);
4761 Py_END_ALLOW_THREADS
4762 if (res < 0)
4763 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004764 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004765}
4766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004767PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004768"shutdown(flag)\n\
4769\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004770Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4771of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004772
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004773#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004774static PyObject*
4775sock_ioctl(PySocketSockObject *s, PyObject *arg)
4776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 unsigned long cmd = SIO_RCVALL;
4778 PyObject *argO;
4779 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4782 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 switch (cmd) {
4785 case SIO_RCVALL: {
4786 unsigned int option = RCVALL_ON;
4787 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4788 return NULL;
4789 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4790 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4791 return set_error();
4792 }
4793 return PyLong_FromUnsignedLong(recv); }
4794 case SIO_KEEPALIVE_VALS: {
4795 struct tcp_keepalive ka;
4796 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4797 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4798 return NULL;
4799 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4800 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4801 return set_error();
4802 }
4803 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004804#if defined(SIO_LOOPBACK_FAST_PATH)
4805 case SIO_LOOPBACK_FAST_PATH: {
4806 unsigned int option;
4807 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4808 return NULL;
4809 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4810 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4811 return set_error();
4812 }
4813 return PyLong_FromUnsignedLong(recv); }
4814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 default:
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02004816 PyErr_Format(PyExc_ValueError, "invalid ioctl command %lu", cmd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 return NULL;
4818 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004819}
4820PyDoc_STRVAR(sock_ioctl_doc,
4821"ioctl(cmd, option) -> long\n\
4822\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004823Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4824SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004825SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4826SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004827#endif
4828
4829#if defined(MS_WINDOWS)
4830static PyObject*
4831sock_share(PySocketSockObject *s, PyObject *arg)
4832{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004833 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004834 DWORD processId;
4835 int result;
4836
4837 if (!PyArg_ParseTuple(arg, "I", &processId))
4838 return NULL;
4839
4840 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004841 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004842 Py_END_ALLOW_THREADS
4843 if (result == SOCKET_ERROR)
4844 return set_error();
4845 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4846}
4847PyDoc_STRVAR(sock_share_doc,
4848"share(process_id) -> bytes\n\
4849\n\
4850Share the socket with another process. The target process id\n\
4851must be provided and the resulting bytes object passed to the target\n\
4852process. There the shared socket can be instantiated by calling\n\
4853socket.fromshare().");
4854
Christian Heimesfaf2f632008-01-06 16:59:19 +00004855
4856#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004857
4858/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004859
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004860static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4862 accept_doc},
4863 {"bind", (PyCFunction)sock_bind, METH_O,
4864 bind_doc},
4865 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004866 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 {"connect", (PyCFunction)sock_connect, METH_O,
4868 connect_doc},
4869 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4870 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004871 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4872 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4874 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004875#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 {"getpeername", (PyCFunction)sock_getpeername,
4877 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 {"getsockname", (PyCFunction)sock_getsockname,
4880 METH_NOARGS, getsockname_doc},
4881 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4882 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004883#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4885 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004886#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004887#if defined(MS_WINDOWS)
4888 {"share", (PyCFunction)sock_share, METH_VARARGS,
4889 sock_share_doc},
4890#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004891 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 listen_doc},
4893 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4894 recv_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004895 {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896 recv_into_doc},
4897 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4898 recvfrom_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004899 {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 recvfrom_into_doc},
4901 {"send", (PyCFunction)sock_send, METH_VARARGS,
4902 send_doc},
4903 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4904 sendall_doc},
4905 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4906 sendto_doc},
4907 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4908 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004909 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4910 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4912 settimeout_doc},
4913 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4914 gettimeout_doc},
4915 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4916 setsockopt_doc},
4917 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4918 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004919#ifdef CMSG_LEN
4920 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4921 recvmsg_doc},
4922 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4923 recvmsg_into_doc,},
4924 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4925 sendmsg_doc},
4926#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004927#ifdef HAVE_SOCKADDR_ALG
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004928 {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
Christian Heimesdffa3942016-09-05 23:54:41 +02004929 sendmsg_afalg_doc},
4930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004932};
4933
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004934/* SockObject members */
4935static PyMemberDef sock_memberlist[] = {
4936 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4937 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4938 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004939 {0},
4940};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004941
Victor Stinner71694d52015-03-28 01:18:54 +01004942static PyGetSetDef sock_getsetlist[] = {
4943 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4944 {NULL} /* sentinel */
4945};
4946
Guido van Rossum73624e91994-10-10 17:59:00 +00004947/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004948 First close the file description. */
4949
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004950static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004951sock_finalize(PySocketSockObject *s)
4952{
4953 SOCKET_T fd;
4954 PyObject *error_type, *error_value, *error_traceback;
4955
4956 /* Save the current exception, if any. */
4957 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4958
Victor Stinnerd3afb622016-07-22 17:47:09 +02004959 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004960 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4961 /* Spurious errors can appear at shutdown */
4962 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4963 PyErr_WriteUnraisable((PyObject *)s);
4964 }
4965 }
4966
4967 /* Only close the socket *after* logging the ResourceWarning warning
4968 to allow the logger to call socket methods like
4969 socket.getsockname(). If the socket is closed before, socket
4970 methods fails with the EBADF error. */
4971 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004972 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004973
4974 /* We do not want to retry upon EINTR: see sock_close() */
4975 Py_BEGIN_ALLOW_THREADS
4976 (void) SOCKETCLOSE(fd);
4977 Py_END_ALLOW_THREADS
4978 }
4979
4980 /* Restore the saved exception. */
4981 PyErr_Restore(error_type, error_value, error_traceback);
4982}
4983
4984static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004985sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004986{
Victor Stinner19a8e842016-03-21 16:36:48 +01004987 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4988 return;
4989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004991}
4992
Guido van Rossum30a685f1991-06-27 15:51:29 +00004993
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004994static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004995sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004996{
Victor Stinnere254e532014-07-26 14:36:55 +02004997 long sock_fd;
4998 /* On Windows, this test is needed because SOCKET_T is unsigned */
4999 if (s->sock_fd == INVALID_SOCKET) {
5000 sock_fd = -1;
5001 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005002#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02005003 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 /* this can occur on Win64, and actually there is a special
5005 ugly printf formatter for decimal pointer length integer
5006 printing, only bother if necessary*/
5007 PyErr_SetString(PyExc_OverflowError,
5008 "no printf formatter to display "
5009 "the socket descriptor in decimal");
5010 return NULL;
5011 }
Fred Drakea04eaad2000-06-30 02:46:07 +00005012#endif
Victor Stinnere254e532014-07-26 14:36:55 +02005013 else
5014 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 return PyUnicode_FromFormat(
5016 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02005017 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 s->sock_type,
5019 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005020}
5021
5022
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005023/* Create a new, uninitialized socket object. */
5024
5025static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005026sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 new = type->tp_alloc(type, 0);
5031 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02005032 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02005033 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 ((PySocketSockObject *)new)->errorhandler = &set_error;
5035 }
5036 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005037}
5038
5039
5040/* Initialize a new socket object. */
5041
Victor Stinnerdaf45552013-08-28 00:53:59 +02005042#ifdef SOCK_CLOEXEC
5043/* socket() and socketpair() fail with EINVAL on Linux kernel older
5044 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
5045static int sock_cloexec_works = -1;
5046#endif
5047
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005048/*ARGSUSED*/
5049static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00005050sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 PySocketSockObject *s = (PySocketSockObject *)self;
5053 PyObject *fdobj = NULL;
5054 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005055 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02005057#ifndef MS_WINDOWS
5058#ifdef SOCK_CLOEXEC
5059 int *atomic_flag_works = &sock_cloexec_works;
5060#else
5061 int *atomic_flag_works = NULL;
5062#endif
5063#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 if (!PyArg_ParseTupleAndKeywords(args, kwds,
5066 "|iiiO:socket", keywords,
5067 &family, &type, &proto, &fdobj))
5068 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005069
Steve Dowerb82e17e2019-05-23 08:45:22 -07005070#ifdef MS_WINDOWS
5071 /* In this case, we don't use the family, type and proto args */
Miss Islington (bot)6a0ee602020-03-31 04:57:06 -07005072 if (fdobj == NULL || fdobj == Py_None)
Steve Dowerb82e17e2019-05-23 08:45:22 -07005073#endif
5074 {
5075 if (PySys_Audit("socket.__new__", "Oiii",
5076 s, family, type, proto) < 0) {
5077 return -1;
5078 }
5079 }
5080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005082#ifdef MS_WINDOWS
5083 /* recreate a socket that was duplicated */
5084 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005085 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005086 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
5087 PyErr_Format(PyExc_ValueError,
5088 "socket descriptor string has wrong size, "
5089 "should be %zu bytes.", sizeof(info));
5090 return -1;
5091 }
5092 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
Steve Dowerb82e17e2019-05-23 08:45:22 -07005093
Miss Islington (bot)6a0ee602020-03-31 04:57:06 -07005094 if (PySys_Audit("socket.__new__", "Oiii", s,
5095 info.iAddressFamily, info.iSocketType,
5096 info.iProtocol) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07005097 return -1;
5098 }
5099
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005100 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005101 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005102 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
5103 Py_END_ALLOW_THREADS
5104 if (fd == INVALID_SOCKET) {
5105 set_error();
5106 return -1;
5107 }
5108 family = info.iAddressFamily;
5109 type = info.iSocketType;
5110 proto = info.iProtocol;
5111 }
5112 else
5113#endif
5114 {
Dima Tisneke9912702018-12-17 22:07:55 +09005115
5116 if (PyFloat_Check(fdobj)) {
5117 PyErr_SetString(PyExc_TypeError,
5118 "integer argument expected, got float");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005119 return -1;
5120 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01005121
Dima Tisneke9912702018-12-17 22:07:55 +09005122 fd = PyLong_AsSocket_t(fdobj);
5123 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5124 return -1;
Christian Heimesb6e43af2018-01-29 22:37:58 +01005125#ifdef MS_WINDOWS
Dima Tisneke9912702018-12-17 22:07:55 +09005126 if (fd == INVALID_SOCKET) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005127#else
Dima Tisneke9912702018-12-17 22:07:55 +09005128 if (fd < 0) {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005129#endif
Dima Tisneke9912702018-12-17 22:07:55 +09005130 PyErr_SetString(PyExc_ValueError, "negative file descriptor");
5131 return -1;
5132 }
5133
5134 /* validate that passed file descriptor is valid and a socket. */
5135 sock_addr_t addrbuf;
5136 socklen_t addrlen = sizeof(sock_addr_t);
5137
5138 memset(&addrbuf, 0, addrlen);
5139 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
5140 if (family == -1) {
5141 family = SAS2SA(&addrbuf)->sa_family;
5142 }
5143 } else {
5144#ifdef MS_WINDOWS
5145 /* getsockname() on an unbound socket is an error on Windows.
5146 Invalid descriptor and not a socket is same error code.
5147 Error out if family must be resolved, or bad descriptor. */
5148 if (family == -1 || CHECK_ERRNO(ENOTSOCK)) {
5149#else
5150 /* getsockname() is not supported for SOL_ALG on Linux. */
5151 if (family == -1 || CHECK_ERRNO(EBADF) || CHECK_ERRNO(ENOTSOCK)) {
5152#endif
5153 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005154 return -1;
5155 }
5156 }
5157#ifdef SO_TYPE
5158 if (type == -1) {
5159 int tmp;
5160 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005161 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5162 (void *)&tmp, &slen) == 0)
5163 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005164 type = tmp;
5165 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005166 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005167 return -1;
5168 }
5169 }
5170#else
5171 type = SOCK_STREAM;
5172#endif
5173#ifdef SO_PROTOCOL
5174 if (proto == -1) {
5175 int tmp;
5176 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005177 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5178 (void *)&tmp, &slen) == 0)
5179 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005180 proto = tmp;
5181 } else {
Dima Tisneke9912702018-12-17 22:07:55 +09005182 set_error();
Christian Heimesb6e43af2018-01-29 22:37:58 +01005183 return -1;
5184 }
5185 }
5186#else
5187 proto = 0;
5188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 }
5190 }
5191 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005192 /* No fd, default to AF_INET and SOCK_STREAM */
5193 if (family == -1) {
5194 family = AF_INET;
5195 }
5196 if (type == -1) {
5197 type = SOCK_STREAM;
5198 }
5199 if (proto == -1) {
5200 proto = 0;
5201 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005202#ifdef MS_WINDOWS
5203 /* Windows implementation */
5204#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5205#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5206#endif
5207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005209 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005210 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005211 NULL, 0,
5212 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5213 if (fd == INVALID_SOCKET) {
5214 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5215 support_wsa_no_inherit = 0;
5216 fd = socket(family, type, proto);
5217 }
5218 }
5219 else {
5220 fd = socket(family, type, proto);
5221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005224 if (fd == INVALID_SOCKET) {
5225 set_error();
5226 return -1;
5227 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005228
5229 if (!support_wsa_no_inherit) {
5230 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5231 closesocket(fd);
5232 PyErr_SetFromWindowsErr(0);
5233 return -1;
5234 }
5235 }
5236#else
5237 /* UNIX */
5238 Py_BEGIN_ALLOW_THREADS
5239#ifdef SOCK_CLOEXEC
5240 if (sock_cloexec_works != 0) {
5241 fd = socket(family, type | SOCK_CLOEXEC, proto);
5242 if (sock_cloexec_works == -1) {
5243 if (fd >= 0) {
5244 sock_cloexec_works = 1;
5245 }
5246 else if (errno == EINVAL) {
5247 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5248 sock_cloexec_works = 0;
5249 fd = socket(family, type, proto);
5250 }
5251 }
5252 }
5253 else
5254#endif
5255 {
5256 fd = socket(family, type, proto);
5257 }
5258 Py_END_ALLOW_THREADS
5259
5260 if (fd == INVALID_SOCKET) {
5261 set_error();
5262 return -1;
5263 }
5264
5265 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5266 SOCKETCLOSE(fd);
5267 return -1;
5268 }
5269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005271 if (init_sockobject(s, fd, family, type, proto) == -1) {
5272 SOCKETCLOSE(fd);
5273 return -1;
5274 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005277
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005278}
5279
5280
Guido van Rossumb6775db1994-08-01 11:34:53 +00005281/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005282
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005283static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5285 "_socket.socket", /* tp_name */
5286 sizeof(PySocketSockObject), /* tp_basicsize */
5287 0, /* tp_itemsize */
5288 (destructor)sock_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005289 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 0, /* tp_getattr */
5291 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005292 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 (reprfunc)sock_repr, /* tp_repr */
5294 0, /* tp_as_number */
5295 0, /* tp_as_sequence */
5296 0, /* tp_as_mapping */
5297 0, /* tp_hash */
5298 0, /* tp_call */
5299 0, /* tp_str */
5300 PyObject_GenericGetAttr, /* tp_getattro */
5301 0, /* tp_setattro */
5302 0, /* tp_as_buffer */
Antoine Pitrouada319b2019-05-29 22:12:38 +02005303 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 sock_doc, /* tp_doc */
5305 0, /* tp_traverse */
5306 0, /* tp_clear */
5307 0, /* tp_richcompare */
5308 0, /* tp_weaklistoffset */
5309 0, /* tp_iter */
5310 0, /* tp_iternext */
5311 sock_methods, /* tp_methods */
5312 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005313 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 0, /* tp_base */
5315 0, /* tp_dict */
5316 0, /* tp_descr_get */
5317 0, /* tp_descr_set */
5318 0, /* tp_dictoffset */
5319 sock_initobj, /* tp_init */
5320 PyType_GenericAlloc, /* tp_alloc */
5321 sock_new, /* tp_new */
5322 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005323 0, /* tp_is_gc */
5324 0, /* tp_bases */
5325 0, /* tp_mro */
5326 0, /* tp_cache */
5327 0, /* tp_subclasses */
5328 0, /* tp_weaklist */
5329 0, /* tp_del */
5330 0, /* tp_version_tag */
5331 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005332};
5333
Guido van Rossum30a685f1991-06-27 15:51:29 +00005334
Guido van Rossum81194471991-07-27 21:42:02 +00005335/* Python interface to gethostname(). */
5336
5337/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005338static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005339socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005340{
Steve Dowerb82e17e2019-05-23 08:45:22 -07005341 if (PySys_Audit("socket.gethostname", NULL) < 0) {
5342 return NULL;
5343 }
5344
Martin v. Löwis72f48422010-10-29 18:20:08 +00005345#ifdef MS_WINDOWS
5346 /* Don't use winsock's gethostname, as this returns the ANSI
5347 version of the hostname, whereas we need a Unicode string.
5348 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005349 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005350 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005351 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005352 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005353
5354 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005355 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005356
5357 if (GetLastError() != ERROR_MORE_DATA)
5358 return PyErr_SetFromWindowsErr(0);
5359
5360 if (size == 0)
5361 return PyUnicode_New(0, 0);
5362
5363 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5364 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005365 name = PyMem_New(wchar_t, size);
5366 if (!name) {
5367 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005368 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005369 }
Victor Stinner74168972011-11-17 01:11:36 +01005370 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5371 name,
5372 &size))
5373 {
5374 PyMem_Free(name);
5375 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005376 }
Victor Stinner74168972011-11-17 01:11:36 +01005377
5378 result = PyUnicode_FromWideChar(name, size);
5379 PyMem_Free(name);
5380 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005381#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 char buf[1024];
5383 int res;
5384 Py_BEGIN_ALLOW_THREADS
5385 res = gethostname(buf, (int) sizeof buf - 1);
5386 Py_END_ALLOW_THREADS
5387 if (res < 0)
5388 return set_error();
5389 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005390 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005391#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005392}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005394PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005395"gethostname() -> string\n\
5396\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005397Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005398
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005399#ifdef HAVE_SETHOSTNAME
5400PyDoc_STRVAR(sethostname_doc,
5401"sethostname(name)\n\n\
5402Sets the hostname to name.");
5403
5404static PyObject *
5405socket_sethostname(PyObject *self, PyObject *args)
5406{
5407 PyObject *hnobj;
5408 Py_buffer buf;
5409 int res, flag = 0;
5410
Christian Heimesd2774c72013-06-19 02:06:29 +02005411#ifdef _AIX
5412/* issue #18259, not declared in any useful header file */
5413extern int sethostname(const char *, size_t);
5414#endif
5415
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005416 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5417 PyErr_Clear();
5418 if (!PyArg_ParseTuple(args, "O&:sethostname",
5419 PyUnicode_FSConverter, &hnobj))
5420 return NULL;
5421 flag = 1;
5422 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005423
5424 if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
5425 return NULL;
5426 }
5427
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005428 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5429 if (!res) {
5430 res = sethostname(buf.buf, buf.len);
5431 PyBuffer_Release(&buf);
5432 }
5433 if (flag)
5434 Py_DECREF(hnobj);
5435 if (res)
5436 return set_error();
5437 Py_RETURN_NONE;
5438}
5439#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005440
Guido van Rossum30a685f1991-06-27 15:51:29 +00005441/* Python interface to gethostbyname(name). */
5442
5443/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005444static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005445socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005448 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005449 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005450
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005451 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005453 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5454 goto finally;
5455 }
Коренберг Марк7766b962018-02-13 00:47:42 +05005456 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005457 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005458 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005459finally:
5460 PyMem_Free(name);
5461 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005462}
5463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005464PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005465"gethostbyname(host) -> address\n\
5466\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005467Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005468
5469
Victor Stinner72400302016-01-28 15:41:01 +01005470static PyObject*
5471sock_decode_hostname(const char *name)
5472{
5473#ifdef MS_WINDOWS
5474 /* Issue #26227: gethostbyaddr() returns a string encoded
5475 * to the ANSI code page */
5476 return PyUnicode_DecodeFSDefault(name);
5477#else
5478 /* Decode from UTF-8 */
5479 return PyUnicode_FromString(name);
5480#endif
5481}
5482
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005483/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5484
5485static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005486gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 char **pch;
5489 PyObject *rtn_tuple = (PyObject *)NULL;
5490 PyObject *name_list = (PyObject *)NULL;
5491 PyObject *addr_list = (PyObject *)NULL;
5492 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005493 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 if (h == NULL) {
5496 /* Let's get real error message to return */
5497 set_herror(h_errno);
5498 return NULL;
5499 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 if (h->h_addrtype != af) {
5502 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005503 errno = EAFNOSUPPORT;
5504 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 return NULL;
5506 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 case AF_INET:
5511 if (alen < sizeof(struct sockaddr_in))
5512 return NULL;
5513 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005514
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005515#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 case AF_INET6:
5517 if (alen < sizeof(struct sockaddr_in6))
5518 return NULL;
5519 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005520#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 if ((name_list = PyList_New(0)) == NULL)
5525 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 if ((addr_list = PyList_New(0)) == NULL)
5528 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 /* SF #1511317: h_aliases can be NULL */
5531 if (h->h_aliases) {
5532 for (pch = h->h_aliases; *pch != NULL; pch++) {
5533 int status;
5534 tmp = PyUnicode_FromString(*pch);
5535 if (tmp == NULL)
5536 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 status = PyList_Append(name_list, tmp);
5539 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 if (status)
5542 goto err;
5543 }
5544 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5547 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 case AF_INET:
5552 {
5553 struct sockaddr_in sin;
5554 memset(&sin, 0, sizeof(sin));
5555 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005556#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005560 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if (pch == h->h_addr_list && alen >= sizeof(sin))
5563 memcpy((char *) addr, &sin, sizeof(sin));
5564 break;
5565 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005566
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005567#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 case AF_INET6:
5569 {
5570 struct sockaddr_in6 sin6;
5571 memset(&sin6, 0, sizeof(sin6));
5572 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005573#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005577 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5580 memcpy((char *) addr, &sin6, sizeof(sin6));
5581 break;
5582 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005586 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 "unsupported address family");
5588 return NULL;
5589 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 if (tmp == NULL)
5592 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 status = PyList_Append(addr_list, tmp);
5595 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 if (status)
5598 goto err;
5599 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005600
Victor Stinner72400302016-01-28 15:41:01 +01005601 name = sock_decode_hostname(h->h_name);
5602 if (name == NULL)
5603 goto err;
5604 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005605
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005606 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 Py_XDECREF(name_list);
5608 Py_XDECREF(addr_list);
5609 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005610}
5611
5612
5613/* Python interface to gethostbyname_ex(name). */
5614
5615/*ARGSUSED*/
5616static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005617socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 char *name;
5620 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005621 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005623 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005624#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005626#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005628#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 char buf[16384];
5630 int buf_len = (sizeof buf) - 1;
5631 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005632#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005633#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005635#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005636#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005637
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005638 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005640 if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
5641 goto finally;
5642 }
Charles-François Natali8b759652011-12-23 16:44:51 +01005643 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005644 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005646#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005647#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005648 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005650#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005652#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 memset((void *) &data, '\0', sizeof(data));
5654 result = gethostbyname_r(name, &hp_allocated, &data);
5655 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005656#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005657#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005658#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005660#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005661 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005663#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 Py_END_ALLOW_THREADS
5665 /* Some C libraries would require addr.__ss_family instead of
5666 addr.ss_family.
5667 Therefore, we cast the sockaddr_storage into sockaddr to
5668 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005669 sa = SAS2SA(&addr);
5670 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005672#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005674#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005675finally:
5676 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005678}
5679
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005680PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005681"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5682\n\
5683Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005684for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005685
5686
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005687/* Python interface to gethostbyaddr(IP). */
5688
5689/*ARGSUSED*/
5690static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005691socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005692{
Charles-François Natali8b759652011-12-23 16:44:51 +01005693 sock_addr_t addr;
5694 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 char *ip_num;
5696 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005697 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005698#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005700#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005702#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 /* glibcs up to 2.10 assume that the buf argument to
5704 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5705 does not ensure. The attribute below instructs the compiler
5706 to maintain this alignment. */
5707 char buf[16384] Py_ALIGNED(8);
5708 int buf_len = (sizeof buf) - 1;
5709 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005710#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005711#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005713#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005714#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005715 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 int al;
5717 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005718
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005719 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005721 if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
5722 goto finally;
5723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 af = AF_UNSPEC;
5725 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005726 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 af = sa->sa_family;
5728 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005729 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 switch (af) {
5731 case AF_INET:
5732 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5733 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5734 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005735#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 case AF_INET6:
5737 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5738 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5739 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005742 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005743 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744 }
5745 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005746#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005747#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005748 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 &hp_allocated, buf, buf_len,
5750 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005751#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 h = gethostbyaddr_r(ap, al, af,
5753 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005754#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 memset((void *) &data, '\0', sizeof(data));
5756 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5757 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005758#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005759#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005760#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005762#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005763 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005765#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005767 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005768#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005770#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005771finally:
5772 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005774}
5775
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005776PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005777"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5778\n\
5779Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005780for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005781
Guido van Rossum30a685f1991-06-27 15:51:29 +00005782
5783/* Python interface to getservbyname(name).
5784 This only returns the port number, since the other info is already
5785 known or not useful (like the list of aliases). */
5786
5787/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005788static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005789socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005790{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005791 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 struct servent *sp;
5793 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5794 return NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -07005795
5796 if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
5797 return NULL;
5798 }
5799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 Py_BEGIN_ALLOW_THREADS
5801 sp = getservbyname(name, proto);
5802 Py_END_ALLOW_THREADS
5803 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005804 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 return NULL;
5806 }
5807 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005808}
5809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005810PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005811"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005812\n\
5813Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005814The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5815otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005816
Guido van Rossum30a685f1991-06-27 15:51:29 +00005817
Barry Warsaw11b91a02004-06-28 00:50:43 +00005818/* Python interface to getservbyport(port).
5819 This only returns the service name, since the other info is already
5820 known or not useful (like the list of aliases). */
5821
5822/*ARGSUSED*/
5823static PyObject *
5824socket_getservbyport(PyObject *self, PyObject *args)
5825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005827 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 struct servent *sp;
5829 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5830 return NULL;
5831 if (port < 0 || port > 0xffff) {
5832 PyErr_SetString(
5833 PyExc_OverflowError,
5834 "getservbyport: port must be 0-65535.");
5835 return NULL;
5836 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07005837
5838 if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
5839 return NULL;
5840 }
5841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 Py_BEGIN_ALLOW_THREADS
5843 sp = getservbyport(htons((short)port), proto);
5844 Py_END_ALLOW_THREADS
5845 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005846 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 return NULL;
5848 }
5849 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005850}
5851
5852PyDoc_STRVAR(getservbyport_doc,
5853"getservbyport(port[, protocolname]) -> string\n\
5854\n\
5855Return the service name from a port number and protocol name.\n\
5856The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5857otherwise any protocol will match.");
5858
Guido van Rossum3901d851996-12-19 16:35:04 +00005859/* Python interface to getprotobyname(name).
5860 This only returns the protocol number, since the other info is
5861 already known or not useful (like the list of aliases). */
5862
5863/*ARGSUSED*/
5864static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005865socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005866{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005867 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 struct protoent *sp;
5869 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5870 return NULL;
5871 Py_BEGIN_ALLOW_THREADS
5872 sp = getprotobyname(name);
5873 Py_END_ALLOW_THREADS
5874 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 return NULL;
5877 }
5878 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005879}
5880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005881PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005882"getprotobyname(name) -> integer\n\
5883\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005884Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005885
Christian Heimesd0e31b92018-01-27 09:54:13 +01005886static PyObject *
5887socket_close(PyObject *self, PyObject *fdobj)
5888{
5889 SOCKET_T fd;
5890 int res;
5891
5892 fd = PyLong_AsSocket_t(fdobj);
5893 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5894 return NULL;
5895 Py_BEGIN_ALLOW_THREADS
5896 res = SOCKETCLOSE(fd);
5897 Py_END_ALLOW_THREADS
5898 /* bpo-30319: The peer can already have closed the connection.
5899 Python ignores ECONNRESET on close(). */
5900 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5901 return set_error();
5902 }
5903 Py_RETURN_NONE;
5904}
5905
5906PyDoc_STRVAR(close_doc,
5907"close(integer) -> None\n\
5908\n\
5909Close an integer socket file descriptor. This is like os.close(), but for\n\
5910sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005911
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005912#ifndef NO_DUP
5913/* dup() function for socket fds */
5914
5915static PyObject *
5916socket_dup(PyObject *self, PyObject *fdobj)
5917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 SOCKET_T fd, newfd;
5919 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005920#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005921 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005922#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 fd = PyLong_AsSocket_t(fdobj);
5925 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5926 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005927
Victor Stinnerdaf45552013-08-28 00:53:59 +02005928#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005929 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005930 return set_error();
5931
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005932 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005933 FROM_PROTOCOL_INFO,
5934 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 if (newfd == INVALID_SOCKET)
5936 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005937
Victor Stinnerdaf45552013-08-28 00:53:59 +02005938 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5939 closesocket(newfd);
5940 PyErr_SetFromWindowsErr(0);
5941 return NULL;
5942 }
5943#else
5944 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5945 newfd = _Py_dup(fd);
5946 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005947 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005948#endif
5949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 newfdobj = PyLong_FromSocket_t(newfd);
5951 if (newfdobj == NULL)
5952 SOCKETCLOSE(newfd);
5953 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005954}
5955
5956PyDoc_STRVAR(dup_doc,
5957"dup(integer) -> integer\n\
5958\n\
5959Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5960sockets; on some platforms os.dup() won't work for socket file descriptors.");
5961#endif
5962
5963
Dave Cole331708b2004-08-09 04:51:41 +00005964#ifdef HAVE_SOCKETPAIR
5965/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005966 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005967 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005968
5969/*ARGSUSED*/
5970static PyObject *
5971socket_socketpair(PyObject *self, PyObject *args)
5972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 PySocketSockObject *s0 = NULL, *s1 = NULL;
5974 SOCKET_T sv[2];
5975 int family, type = SOCK_STREAM, proto = 0;
5976 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005977#ifdef SOCK_CLOEXEC
5978 int *atomic_flag_works = &sock_cloexec_works;
5979#else
5980 int *atomic_flag_works = NULL;
5981#endif
5982 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005983
5984#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5990 &family, &type, &proto))
5991 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005994 Py_BEGIN_ALLOW_THREADS
5995#ifdef SOCK_CLOEXEC
5996 if (sock_cloexec_works != 0) {
5997 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5998 if (sock_cloexec_works == -1) {
5999 if (ret >= 0) {
6000 sock_cloexec_works = 1;
6001 }
6002 else if (errno == EINVAL) {
6003 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
6004 sock_cloexec_works = 0;
6005 ret = socketpair(family, type, proto, sv);
6006 }
6007 }
6008 }
6009 else
6010#endif
6011 {
6012 ret = socketpair(family, type, proto, sv);
6013 }
6014 Py_END_ALLOW_THREADS
6015
6016 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006018
6019 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
6020 goto finally;
6021 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
6022 goto finally;
6023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 s0 = new_sockobject(sv[0], family, type, proto);
6025 if (s0 == NULL)
6026 goto finally;
6027 s1 = new_sockobject(sv[1], family, type, proto);
6028 if (s1 == NULL)
6029 goto finally;
6030 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00006031
6032finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 if (res == NULL) {
6034 if (s0 == NULL)
6035 SOCKETCLOSE(sv[0]);
6036 if (s1 == NULL)
6037 SOCKETCLOSE(sv[1]);
6038 }
6039 Py_XDECREF(s0);
6040 Py_XDECREF(s1);
6041 return res;
Dave Cole331708b2004-08-09 04:51:41 +00006042}
6043
6044PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02006045"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00006046\n\
6047Create a pair of socket objects from the sockets returned by the platform\n\
6048socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00006049The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00006050AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00006051
6052#endif /* HAVE_SOCKETPAIR */
6053
6054
Guido van Rossum006bf911996-06-12 04:04:55 +00006055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006056socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006057{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006058 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006059
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006060 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 return NULL;
6062 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006063 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006065 "ntohs: can't convert negative Python int to C "
6066 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 return NULL;
6068 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006069 if (x > 0xffff) {
6070 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6071 "ntohs: Python int too large to convert to C "
6072 "16-bit unsigned integer (The silent truncation "
6073 "is deprecated)",
6074 1)) {
6075 return NULL;
6076 }
6077 }
6078 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006079}
6080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006081PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006082"ntohs(integer) -> integer\n\
6083\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006084Convert a 16-bit unsigned integer from network to host byte order.\n\
6085Note that in case the received integer does not fit in 16-bit unsigned\n\
6086integer, but does fit in a positive C int, it is silently truncated to\n\
608716-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006088However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006089exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006090
6091
Guido van Rossum006bf911996-06-12 04:04:55 +00006092static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006093socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 if (PyLong_Check(arg)) {
6098 x = PyLong_AsUnsignedLong(arg);
6099 if (x == (unsigned long) -1 && PyErr_Occurred())
6100 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006101#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 {
6103 unsigned long y;
6104 /* only want the trailing 32 bits */
6105 y = x & 0xFFFFFFFFUL;
6106 if (y ^ x)
6107 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006108 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 x = y;
6110 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 }
6113 else
6114 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006115 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006118}
6119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006120PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006121"ntohl(integer) -> integer\n\
6122\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006123Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006124
6125
Guido van Rossum006bf911996-06-12 04:04:55 +00006126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006127socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00006128{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006129 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006130
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006131 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 return NULL;
6133 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006134 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006136 "htons: can't convert negative Python int to C "
6137 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 return NULL;
6139 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006140 if (x > 0xffff) {
6141 if (PyErr_WarnEx(PyExc_DeprecationWarning,
6142 "htons: Python int too large to convert to C "
6143 "16-bit unsigned integer (The silent truncation "
6144 "is deprecated)",
6145 1)) {
6146 return NULL;
6147 }
6148 }
6149 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006150}
6151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006152PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006153"htons(integer) -> integer\n\
6154\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006155Convert a 16-bit unsigned integer from host to network byte order.\n\
6156Note that in case the received integer does not fit in 16-bit unsigned\n\
6157integer, but does fit in a positive C int, it is silently truncated to\n\
615816-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08006159However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03006160exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006161
6162
Guido van Rossum006bf911996-06-12 04:04:55 +00006163static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006164socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00006165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00006167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 if (PyLong_Check(arg)) {
6169 x = PyLong_AsUnsignedLong(arg);
6170 if (x == (unsigned long) -1 && PyErr_Occurred())
6171 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006172#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 {
6174 unsigned long y;
6175 /* only want the trailing 32 bits */
6176 y = x & 0xFFFFFFFFUL;
6177 if (y ^ x)
6178 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006179 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 x = y;
6181 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183 }
6184 else
6185 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006186 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 Py_TYPE(arg)->tp_name);
6188 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006189}
6190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006191PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006192"htonl(integer) -> integer\n\
6193\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006194Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006195
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006196/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006198PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006199"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006200\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006201Convert 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 +00006202binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006203
6204static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006205socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006206{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006207#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006209#endif
6210
6211#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006212#if (SIZEOF_INT != 4)
6213#error "Not sure if in_addr_t exists and int is not 32-bits."
6214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 /* Have to use inet_addr() instead */
6216 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006217#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006218 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6221 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006222
Tim Peters1df9fdd2003-02-13 03:13:40 +00006223
6224#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006225
6226#ifdef USE_INET_ATON_WEAKLINK
6227 if (inet_aton != NULL) {
6228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 if (inet_aton(ip_addr, &buf))
6230 return PyBytes_FromStringAndSize((char *)(&buf),
6231 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006232
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006233 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 "illegal IP address string passed to inet_aton");
6235 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006236
Thomas Wouters477c8d52006-05-27 19:21:47 +00006237#ifdef USE_INET_ATON_WEAKLINK
6238 } else {
6239#endif
6240
6241#endif
6242
6243#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* special-case this address as inet_addr might return INADDR_NONE
6246 * for this */
6247 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006248 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006250
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006251 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006255 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 "illegal IP address string passed to inet_aton");
6257 return NULL;
6258 }
6259 }
6260 return PyBytes_FromStringAndSize((char *) &packed_addr,
6261 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006262
6263#ifdef USE_INET_ATON_WEAKLINK
6264 }
6265#endif
6266
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006267#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006268}
6269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006270PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006271"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006272\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006273Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006274
6275static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006276socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006277{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006278 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006280
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006281 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 return NULL;
6283 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006284
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006285 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006286 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006288 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289 return NULL;
6290 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006291
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006292 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6293 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006294
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006295 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006297}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006298
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006299#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006300
6301PyDoc_STRVAR(inet_pton_doc,
6302"inet_pton(af, ip) -> packed IP address string\n\
6303\n\
6304Convert an IP address from string format to a packed string suitable\n\
6305for use with low-level network functions.");
6306
6307static PyObject *
6308socket_inet_pton(PyObject *self, PyObject *args)
6309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006311 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006313#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006314 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6319 return NULL;
6320 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006321
Martin v. Löwis04697e82004-06-02 12:35:29 +00006322#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006324 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 "can't use AF_INET6, IPv6 is disabled");
6326 return NULL;
6327 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006328#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 retval = inet_pton(af, ip, packed);
6331 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006332 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333 return NULL;
6334 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006335 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 "illegal IP address string passed to inet_pton");
6337 return NULL;
6338 } else if (af == AF_INET) {
6339 return PyBytes_FromStringAndSize(packed,
6340 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006341#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 } else if (af == AF_INET6) {
6343 return PyBytes_FromStringAndSize(packed,
6344 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006347 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348 return NULL;
6349 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006350}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006351
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006352PyDoc_STRVAR(inet_ntop_doc,
6353"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6354\n\
6355Convert a packed IP address of the given family to string format.");
6356
6357static PyObject *
6358socket_inet_ntop(PyObject *self, PyObject *args)
6359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006361 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006363#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006364 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006365#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006366 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006367#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006368
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006369 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 return NULL;
6371 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006374 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375 PyErr_SetString(PyExc_ValueError,
6376 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006377 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 return NULL;
6379 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006380#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006382 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 PyErr_SetString(PyExc_ValueError,
6384 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006385 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386 return NULL;
6387 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389 } else {
6390 PyErr_Format(PyExc_ValueError,
6391 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006392 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 return NULL;
6394 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006395
Коренберг Марк7766b962018-02-13 00:47:42 +05006396 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006397 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6398 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006400 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 return NULL;
6402 } else {
6403 return PyUnicode_FromString(retval);
6404 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006405}
6406
6407#endif /* HAVE_INET_PTON */
6408
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006409/* Python interface to getaddrinfo(host, port). */
6410
6411/*ARGSUSED*/
6412static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006413socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006414{
Victor Stinner77af1722011-05-26 14:05:59 +02006415 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006416 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 struct addrinfo hints, *res;
6418 struct addrinfo *res0 = NULL;
6419 PyObject *hobj = NULL;
6420 PyObject *pobj = (PyObject *)NULL;
6421 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006422 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 int family, socktype, protocol, flags;
6424 int error;
6425 PyObject *all = (PyObject *)NULL;
6426 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006427
Georg Brandl6083a4b2013-10-14 06:51:46 +02006428 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006430 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006431 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432 &protocol, &flags)) {
6433 return NULL;
6434 }
6435 if (hobj == Py_None) {
6436 hptr = NULL;
6437 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006438 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 if (!idna)
6440 return NULL;
6441 assert(PyBytes_Check(idna));
6442 hptr = PyBytes_AS_STRING(idna);
6443 } else if (PyBytes_Check(hobj)) {
6444 hptr = PyBytes_AsString(hobj);
6445 } else {
6446 PyErr_SetString(PyExc_TypeError,
6447 "getaddrinfo() argument 1 must be string or None");
6448 return NULL;
6449 }
6450 if (PyLong_CheckExact(pobj)) {
6451 long value = PyLong_AsLong(pobj);
6452 if (value == -1 && PyErr_Occurred())
6453 goto err;
6454 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6455 pptr = pbuf;
6456 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006457 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006458 if (pptr == NULL)
6459 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006461 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462 } else if (pobj == Py_None) {
6463 pptr = (char *)NULL;
6464 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006465 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 goto err;
6467 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006468#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006469 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006470 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006471 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6472 * This workaround avoids a segfault in libsystem.
6473 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006474 pptr = "00";
6475 }
6476#endif
Steve Dowerb82e17e2019-05-23 08:45:22 -07006477
6478 if (PySys_Audit("socket.getaddrinfo", "OOiii",
6479 hobj, pobj, family, socktype, protocol) < 0) {
6480 return NULL;
6481 }
6482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 memset(&hints, 0, sizeof(hints));
6484 hints.ai_family = family;
6485 hints.ai_socktype = socktype;
6486 hints.ai_protocol = protocol;
6487 hints.ai_flags = flags;
6488 Py_BEGIN_ALLOW_THREADS
6489 ACQUIRE_GETADDRINFO_LOCK
6490 error = getaddrinfo(hptr, pptr, &hints, &res0);
6491 Py_END_ALLOW_THREADS
6492 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6493 if (error) {
6494 set_gaierror(error);
6495 goto err;
6496 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006497
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006498 all = PyList_New(0);
6499 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500 goto err;
6501 for (res = res0; res; res = res->ai_next) {
6502 PyObject *single;
6503 PyObject *addr =
6504 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6505 if (addr == NULL)
6506 goto err;
6507 single = Py_BuildValue("iiisO", res->ai_family,
6508 res->ai_socktype, res->ai_protocol,
6509 res->ai_canonname ? res->ai_canonname : "",
6510 addr);
6511 Py_DECREF(addr);
6512 if (single == NULL)
6513 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006514
Zackery Spytz4c596d52018-11-14 15:39:01 -07006515 if (PyList_Append(all, single)) {
6516 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517 goto err;
Zackery Spytz4c596d52018-11-14 15:39:01 -07006518 }
6519 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 }
6521 Py_XDECREF(idna);
6522 if (res0)
6523 freeaddrinfo(res0);
6524 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006525 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526 Py_XDECREF(all);
6527 Py_XDECREF(idna);
6528 if (res0)
6529 freeaddrinfo(res0);
6530 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006531}
6532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006533PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006534"getaddrinfo(host, port [, family, type, proto, flags])\n\
6535 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006536\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006537Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006538
6539/* Python interface to getnameinfo(sa, flags). */
6540
6541/*ARGSUSED*/
6542static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006543socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 PyObject *sa = (PyObject *)NULL;
6546 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006547 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006548 int port;
6549 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6551 struct addrinfo hints, *res = NULL;
6552 int error;
6553 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006554 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 flags = flowinfo = scope_id = 0;
6557 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6558 return NULL;
6559 if (!PyTuple_Check(sa)) {
6560 PyErr_SetString(PyExc_TypeError,
6561 "getnameinfo() argument 1 must be a tuple");
6562 return NULL;
6563 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006564 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006566 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006568 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006569 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006570 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006571 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006572 return NULL;
6573 }
Steve Dowerb82e17e2019-05-23 08:45:22 -07006574
6575 if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
6576 return NULL;
6577 }
6578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6580 memset(&hints, 0, sizeof(hints));
6581 hints.ai_family = AF_UNSPEC;
6582 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006583 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 Py_BEGIN_ALLOW_THREADS
6585 ACQUIRE_GETADDRINFO_LOCK
6586 error = getaddrinfo(hostp, pbuf, &hints, &res);
6587 Py_END_ALLOW_THREADS
6588 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6589 if (error) {
6590 set_gaierror(error);
6591 goto fail;
6592 }
6593 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006594 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 "sockaddr resolved to multiple addresses");
6596 goto fail;
6597 }
6598 switch (res->ai_family) {
6599 case AF_INET:
6600 {
6601 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006602 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 "IPv4 sockaddr must be 2 tuple");
6604 goto fail;
6605 }
6606 break;
6607 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006608#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 case AF_INET6:
6610 {
6611 struct sockaddr_in6 *sin6;
6612 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006613 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 sin6->sin6_scope_id = scope_id;
6615 break;
6616 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006619 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6621 if (error) {
6622 set_gaierror(error);
6623 goto fail;
6624 }
Victor Stinner72400302016-01-28 15:41:01 +01006625
6626 name = sock_decode_hostname(hbuf);
6627 if (name == NULL)
6628 goto fail;
6629 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006630
6631fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 if (res)
6633 freeaddrinfo(res);
6634 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006635}
6636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006637PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006638"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006639\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006640Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006641
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006642
6643/* Python API to getting and setting the default timeout value. */
6644
6645static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306646socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006647{
Victor Stinner71694d52015-03-28 01:18:54 +01006648 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006649 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 }
Victor Stinner71694d52015-03-28 01:18:54 +01006651 else {
6652 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6653 return PyFloat_FromDouble(seconds);
6654 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006655}
6656
6657PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006658"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006659\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006660Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006661A value of None indicates that new socket objects have no timeout.\n\
6662When the socket module is first imported, the default is None.");
6663
6664static PyObject *
6665socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6666{
Victor Stinner71694d52015-03-28 01:18:54 +01006667 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006668
Victor Stinner71694d52015-03-28 01:18:54 +01006669 if (socket_parse_timeout(&timeout, arg) < 0)
6670 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006673
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006674 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006675}
6676
6677PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006678"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006679\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006680Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006681A value of None indicates that new socket objects have no timeout.\n\
6682When the socket module is first imported, the default is None.");
6683
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006684#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006685/* Python API for getting interface indices and names */
6686
6687static PyObject *
6688socket_if_nameindex(PyObject *self, PyObject *arg)
6689{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006690 PyObject *list = PyList_New(0);
6691 if (list == NULL) {
6692 return NULL;
6693 }
6694#ifdef MS_WINDOWS
6695 PMIB_IF_TABLE2 tbl;
6696 int ret;
6697 if ((ret = GetIfTable2Ex(MibIfTableRaw, &tbl)) != NO_ERROR) {
6698 Py_DECREF(list);
6699 // ret is used instead of GetLastError()
6700 return PyErr_SetFromWindowsErr(ret);
6701 }
6702 for (ULONG i = 0; i < tbl->NumEntries; ++i) {
6703 MIB_IF_ROW2 r = tbl->Table[i];
6704 WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1];
6705 if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf,
6706 Py_ARRAY_LENGTH(buf)))) {
6707 Py_DECREF(list);
6708 FreeMibTable(tbl);
6709 // ret is used instead of GetLastError()
6710 return PyErr_SetFromWindowsErr(ret);
6711 }
6712 PyObject *tuple = Py_BuildValue("Iu", r.InterfaceIndex, buf);
6713 if (tuple == NULL || PyList_Append(list, tuple) == -1) {
6714 Py_XDECREF(tuple);
6715 Py_DECREF(list);
6716 FreeMibTable(tbl);
6717 return NULL;
6718 }
6719 Py_DECREF(tuple);
6720 }
6721 FreeMibTable(tbl);
6722 return list;
6723#else
Charles-François Natali60713592011-05-20 16:55:06 +02006724 int i;
6725 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006726
Charles-François Natali60713592011-05-20 16:55:06 +02006727 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006728 if (ni == NULL) {
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006729 Py_DECREF(list);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006730 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006731 return NULL;
6732 }
6733
Gregory P. Smithb474e672018-12-30 17:05:36 -08006734#ifdef _Py_MEMORY_SANITIZER
6735 __msan_unpoison(ni, sizeof(ni));
6736 __msan_unpoison(&ni[0], sizeof(ni[0]));
6737#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006738 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
Gregory P. Smithb474e672018-12-30 17:05:36 -08006739#ifdef _Py_MEMORY_SANITIZER
6740 /* This one isn't the end sentinel, the next one must exist. */
6741 __msan_unpoison(&ni[i+1], sizeof(ni[0]));
6742 /* Otherwise Py_BuildValue internals are flagged by MSan when
6743 they access the not-msan-tracked if_name string data. */
6744 {
6745 char *to_sanitize = ni[i].if_name;
6746 do {
6747 __msan_unpoison(to_sanitize, 1);
6748 } while (*to_sanitize++ != '\0');
6749 }
6750#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006751 PyObject *ni_tuple = Py_BuildValue("IO&",
6752 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006753
6754 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6755 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006756 Py_DECREF(list);
6757 if_freenameindex(ni);
6758 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006759 }
6760 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006761 }
6762
6763 if_freenameindex(ni);
6764 return list;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006765#endif
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006766}
6767
6768PyDoc_STRVAR(if_nameindex_doc,
6769"if_nameindex()\n\
6770\n\
6771Returns a list of network interface information (index, name) tuples.");
6772
Charles-François Natali60713592011-05-20 16:55:06 +02006773static PyObject *
6774socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006775{
Charles-François Natali60713592011-05-20 16:55:06 +02006776 PyObject *oname;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006777#ifdef MS_WINDOWS
6778 NET_IFINDEX index;
6779#else
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006780 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006781#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006782 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6783 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006784 return NULL;
6785
Charles-François Natali60713592011-05-20 16:55:06 +02006786 index = if_nametoindex(PyBytes_AS_STRING(oname));
6787 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006788 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006789 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006790 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006791 return NULL;
6792 }
6793
6794 return PyLong_FromUnsignedLong(index);
6795}
6796
6797PyDoc_STRVAR(if_nametoindex_doc,
6798"if_nametoindex(if_name)\n\
6799\n\
6800Returns the interface index corresponding to the interface name if_name.");
6801
Charles-François Natali60713592011-05-20 16:55:06 +02006802static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006803socket_if_indextoname(PyObject *self, PyObject *arg)
6804{
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006805#ifdef MS_WINDOWS
6806 NET_IFINDEX index;
6807#else
Charles-François Natali60713592011-05-20 16:55:06 +02006808 unsigned long index;
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006809#endif
Charles-François Natali60713592011-05-20 16:55:06 +02006810 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006811
Charles-François Natali60713592011-05-20 16:55:06 +02006812 index = PyLong_AsUnsignedLong(arg);
6813 if (index == (unsigned long) -1)
6814 return NULL;
6815
6816 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006817 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006818 return NULL;
6819 }
6820
Charles-François Natali60713592011-05-20 16:55:06 +02006821 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006822}
6823
6824PyDoc_STRVAR(if_indextoname_doc,
6825"if_indextoname(if_index)\n\
6826\n\
6827Returns the interface name corresponding to the interface index if_index.");
6828
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006829#endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006830
6831
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006832#ifdef CMSG_LEN
6833/* Python interface to CMSG_LEN(length). */
6834
6835static PyObject *
6836socket_CMSG_LEN(PyObject *self, PyObject *args)
6837{
6838 Py_ssize_t length;
6839 size_t result;
6840
6841 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6842 return NULL;
6843 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6844 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6845 return NULL;
6846 }
6847 return PyLong_FromSize_t(result);
6848}
6849
6850PyDoc_STRVAR(CMSG_LEN_doc,
6851"CMSG_LEN(length) -> control message length\n\
6852\n\
6853Return the total length, without trailing padding, of an ancillary\n\
6854data item with associated data of the given length. This value can\n\
6855often be used as the buffer size for recvmsg() to receive a single\n\
6856item of ancillary data, but RFC 3542 requires portable applications to\n\
6857use CMSG_SPACE() and thus include space for padding, even when the\n\
6858item will be the last in the buffer. Raises OverflowError if length\n\
6859is outside the permissible range of values.");
6860
6861
6862#ifdef CMSG_SPACE
6863/* Python interface to CMSG_SPACE(length). */
6864
6865static PyObject *
6866socket_CMSG_SPACE(PyObject *self, PyObject *args)
6867{
6868 Py_ssize_t length;
6869 size_t result;
6870
6871 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6872 return NULL;
6873 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6874 PyErr_SetString(PyExc_OverflowError,
6875 "CMSG_SPACE() argument out of range");
6876 return NULL;
6877 }
6878 return PyLong_FromSize_t(result);
6879}
6880
6881PyDoc_STRVAR(CMSG_SPACE_doc,
6882"CMSG_SPACE(length) -> buffer size\n\
6883\n\
6884Return the buffer size needed for recvmsg() to receive an ancillary\n\
6885data item with associated data of the given length, along with any\n\
6886trailing padding. The buffer space needed to receive multiple items\n\
6887is the sum of the CMSG_SPACE() values for their associated data\n\
6888lengths. Raises OverflowError if length is outside the permissible\n\
6889range of values.");
6890#endif /* CMSG_SPACE */
6891#endif /* CMSG_LEN */
6892
6893
Guido van Rossum30a685f1991-06-27 15:51:29 +00006894/* List of functions exported by this module. */
6895
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006896static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897 {"gethostbyname", socket_gethostbyname,
6898 METH_VARARGS, gethostbyname_doc},
6899 {"gethostbyname_ex", socket_gethostbyname_ex,
6900 METH_VARARGS, ghbn_ex_doc},
6901 {"gethostbyaddr", socket_gethostbyaddr,
6902 METH_VARARGS, gethostbyaddr_doc},
6903 {"gethostname", socket_gethostname,
6904 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006905#ifdef HAVE_SETHOSTNAME
6906 {"sethostname", socket_sethostname,
6907 METH_VARARGS, sethostname_doc},
6908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909 {"getservbyname", socket_getservbyname,
6910 METH_VARARGS, getservbyname_doc},
6911 {"getservbyport", socket_getservbyport,
6912 METH_VARARGS, getservbyport_doc},
6913 {"getprotobyname", socket_getprotobyname,
6914 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006915 {"close", socket_close,
6916 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006917#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006918 {"dup", socket_dup,
6919 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006920#endif
Dave Cole331708b2004-08-09 04:51:41 +00006921#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922 {"socketpair", socket_socketpair,
6923 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925 {"ntohs", socket_ntohs,
6926 METH_VARARGS, ntohs_doc},
6927 {"ntohl", socket_ntohl,
6928 METH_O, ntohl_doc},
6929 {"htons", socket_htons,
6930 METH_VARARGS, htons_doc},
6931 {"htonl", socket_htonl,
6932 METH_O, htonl_doc},
6933 {"inet_aton", socket_inet_aton,
6934 METH_VARARGS, inet_aton_doc},
6935 {"inet_ntoa", socket_inet_ntoa,
6936 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006937#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938 {"inet_pton", socket_inet_pton,
6939 METH_VARARGS, inet_pton_doc},
6940 {"inet_ntop", socket_inet_ntop,
6941 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006942#endif
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006943 {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo,
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006944 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 {"getnameinfo", socket_getnameinfo,
6946 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306947 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 METH_NOARGS, getdefaulttimeout_doc},
6949 {"setdefaulttimeout", socket_setdefaulttimeout,
6950 METH_O, setdefaulttimeout_doc},
Zackery Spytz8f96c9f2019-05-29 15:02:37 -06006951#if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006952 {"if_nameindex", socket_if_nameindex,
6953 METH_NOARGS, if_nameindex_doc},
6954 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006955 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006956 {"if_indextoname", socket_if_indextoname,
6957 METH_O, if_indextoname_doc},
6958#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006959#ifdef CMSG_LEN
6960 {"CMSG_LEN", socket_CMSG_LEN,
6961 METH_VARARGS, CMSG_LEN_doc},
6962#ifdef CMSG_SPACE
6963 {"CMSG_SPACE", socket_CMSG_SPACE,
6964 METH_VARARGS, CMSG_SPACE_doc},
6965#endif
6966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006968};
6969
Guido van Rossum30a685f1991-06-27 15:51:29 +00006970
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006971#ifdef MS_WINDOWS
6972#define OS_INIT_DEFINED
6973
6974/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006975
6976static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006977os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006980}
6981
6982static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006983os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 WSADATA WSAData;
6986 int ret;
6987 ret = WSAStartup(0x0101, &WSAData);
6988 switch (ret) {
6989 case 0: /* No error */
6990 Py_AtExit(os_cleanup);
6991 return 1; /* Success */
6992 case WSASYSNOTREADY:
6993 PyErr_SetString(PyExc_ImportError,
6994 "WSAStartup failed: network not ready");
6995 break;
6996 case WSAVERNOTSUPPORTED:
6997 case WSAEINVAL:
6998 PyErr_SetString(
6999 PyExc_ImportError,
7000 "WSAStartup failed: requested version not supported");
7001 break;
7002 default:
7003 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
7004 break;
7005 }
7006 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007007}
7008
Guido van Rossum8d665e61996-06-26 18:22:49 +00007009#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00007010
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007011
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007012
7013#ifndef OS_INIT_DEFINED
7014static int
7015os_init(void)
7016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007018}
7019#endif
7020
7021
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007022/* C API table - always add new things to the end for binary
7023 compatibility. */
7024static
7025PySocketModule_APIObject PySocketModuleAPI =
7026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007027 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007028 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007030};
7031
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007032
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007033/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007034
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007035 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007036 "socket.py" which implements some additional functionality.
7037 The import of "_socket" may fail with an ImportError exception if
7038 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02007039 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00007040 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007041*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007043PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00007044"Implementation module for socket operations.\n\
7045\n\
7046See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00007047
Martin v. Löwis1a214512008-06-11 05:26:20 +00007048static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049 PyModuleDef_HEAD_INIT,
7050 PySocket_MODULE_NAME,
7051 socket_doc,
7052 -1,
7053 socket_methods,
7054 NULL,
7055 NULL,
7056 NULL,
7057 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007058};
7059
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007060PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007061PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00007064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065 if (!os_init())
7066 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007067
Victor Stinnerdaf45552013-08-28 00:53:59 +02007068#ifdef MS_WINDOWS
7069 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08007070 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02007071 }
7072#endif
7073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007074 Py_TYPE(&sock_type) = &PyType_Type;
7075 m = PyModule_Create(&socketmodule);
7076 if (m == NULL)
7077 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007078
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007079 Py_INCREF(PyExc_OSError);
7080 PySocketModuleAPI.error = PyExc_OSError;
7081 Py_INCREF(PyExc_OSError);
7082 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007084 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 if (socket_herror == NULL)
7086 return NULL;
7087 Py_INCREF(socket_herror);
7088 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007089 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 NULL);
7091 if (socket_gaierror == NULL)
7092 return NULL;
7093 Py_INCREF(socket_gaierror);
7094 PyModule_AddObject(m, "gaierror", socket_gaierror);
7095 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02007096 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097 if (socket_timeout == NULL)
7098 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00007099 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 Py_INCREF(socket_timeout);
7101 PyModule_AddObject(m, "timeout", socket_timeout);
7102 Py_INCREF((PyObject *)&sock_type);
7103 if (PyModule_AddObject(m, "SocketType",
7104 (PyObject *)&sock_type) != 0)
7105 return NULL;
7106 Py_INCREF((PyObject *)&sock_type);
7107 if (PyModule_AddObject(m, "socket",
7108 (PyObject *)&sock_type) != 0)
7109 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00007110
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007111#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007113#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116 Py_INCREF(has_ipv6);
7117 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 /* Export C API */
7120 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
7121 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
7122 ) != 0)
7123 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00007126#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00007128#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00007130#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00007132#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007133#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007134 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007136#endif
7137#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00007139#endif
7140#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007143#endif
7144#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007147#endif
7148#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007151#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007152#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007153 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007155#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007156#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00007159#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007160#ifdef HAVE_SOCKADDR_ALG
7161 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
7162#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007163#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007166#endif
7167#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00007169#endif
7170#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007173#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007174#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007177#endif
7178#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007179 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007181#endif
7182#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007185#endif
7186#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007189#endif
7190#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, AF_NETLINK);
7193 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007194#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007196#endif
7197#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007199#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
7201 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007202#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007204#endif
7205#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00007207#endif
Neal Norwitz65851662006-01-16 04:31:40 +00007208#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00007210#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007211#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007213#endif
7214#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007216#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00007218#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00007220#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007221#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007223#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007224#ifdef NETLINK_CRYPTO
7225 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
7226#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007227#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04007228
Bjorn Anderssonbb816512018-09-26 06:47:52 -07007229#ifdef AF_QIPCRTR
7230 /* Qualcomm IPCROUTER */
7231 PyModule_AddIntMacro(m, AF_QIPCRTR);
7232#endif
7233
caaveryeffc12f2017-09-06 18:18:10 -04007234#ifdef AF_VSOCK
7235 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
7236 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
7237 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
7238 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
7239 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
7240 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
7241 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
7242 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
7243 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
7244#endif
7245
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007246#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007249#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007250#ifdef AF_LINK
7251 PyModule_AddIntMacro(m, AF_LINK);
7252#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007253#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007256#endif
7257#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007260#endif
7261#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007264#endif
7265#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007268#endif
7269#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007272#endif
7273#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007275 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007276#endif
7277#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007280#endif
7281#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007284#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007285
Hye-Shik Chang81268602004-02-02 06:05:24 +00007286#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007287 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7288 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7289 PyModule_AddIntMacro(m, BTPROTO_HCI);
7290 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007291#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007292 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007293#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007294#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007295#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007296 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007297#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007298 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7299 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007300#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7303 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007304#endif
7305
Charles-François Natali47413c12011-10-06 19:47:44 +02007306#ifdef AF_CAN
7307 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007309#endif
7310#ifdef PF_CAN
7311 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007313#endif
7314
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007315/* Reliable Datagram Sockets */
7316#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007318#endif
7319#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007321#endif
7322
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007323/* Kernel event messages */
7324#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007326#endif
7327#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007329#endif
7330
Antoine Pitroub156a462010-10-27 20:13:57 +00007331#ifdef AF_PACKET
7332 PyModule_AddIntMacro(m, AF_PACKET);
7333#endif
7334#ifdef PF_PACKET
7335 PyModule_AddIntMacro(m, PF_PACKET);
7336#endif
7337#ifdef PACKET_HOST
7338 PyModule_AddIntMacro(m, PACKET_HOST);
7339#endif
7340#ifdef PACKET_BROADCAST
7341 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7342#endif
7343#ifdef PACKET_MULTICAST
7344 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7345#endif
7346#ifdef PACKET_OTHERHOST
7347 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7348#endif
7349#ifdef PACKET_OUTGOING
7350 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7351#endif
7352#ifdef PACKET_LOOPBACK
7353 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7354#endif
7355#ifdef PACKET_FASTROUTE
7356 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007357#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007358
Christian Heimes043d6f62008-01-07 17:19:16 +00007359#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007362 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007363 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7364 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7365 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007366
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7368 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7369 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, SOL_TIPC);
7373 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7374 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7375 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7376 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007377
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7379 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7380 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7381 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7385 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007386#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007387 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007389#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7391 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7392 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7393 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7394 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7395 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007396#endif
7397
Christian Heimesdffa3942016-09-05 23:54:41 +02007398#ifdef HAVE_SOCKADDR_ALG
7399 /* Socket options */
7400 PyModule_AddIntMacro(m, ALG_SET_KEY);
7401 PyModule_AddIntMacro(m, ALG_SET_IV);
7402 PyModule_AddIntMacro(m, ALG_SET_OP);
7403 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7404 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7405 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7406
7407 /* Operations */
7408 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7409 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7410 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7411 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7412#endif
7413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007414 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, SOCK_STREAM);
7416 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007417/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007418#ifdef SOCK_RAW
7419 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007420 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007421#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007423#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007425#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007426#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007428#endif
7429#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007431#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007433#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007436#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007441#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007442#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007444#endif
7445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007446#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007458#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007463#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007464#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007465#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007467#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007495#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007496#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007498#endif
7499#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007501#endif
7502#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007504#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007505#ifdef SO_PASSSEC
7506 PyModule_AddIntMacro(m, SO_PASSSEC);
7507#endif
7508#ifdef SO_PEERSEC
7509 PyModule_AddIntMacro(m, SO_PEERSEC);
7510#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007511#ifdef SO_BINDTODEVICE
7512 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7513#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007514#ifdef SO_PRIORITY
7515 PyModule_AddIntMacro(m, SO_PRIORITY);
7516#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007517#ifdef SO_MARK
7518 PyModule_AddIntMacro(m, SO_MARK);
7519#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007520#ifdef SO_DOMAIN
7521 PyModule_AddIntMacro(m, SO_DOMAIN);
7522#endif
7523#ifdef SO_PROTOCOL
7524 PyModule_AddIntMacro(m, SO_PROTOCOL);
7525#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007527 /* Maximum number of connections for "listen" */
7528#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007530#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007532#endif
7533
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007534 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007535#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007537#endif
7538#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007540#endif
7541#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007543#endif
7544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007545 /* Flags for send, recv */
7546#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007570#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007576#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007578#endif
7579#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007581#endif
7582#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007584#endif
7585#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007587#endif
7588#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007590#endif
7591#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007593#endif
7594#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007596#endif
7597#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007599#endif
7600#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007602#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007603#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007605#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607 /* Protocol level and numbers, usable for [gs]etsockopt */
7608#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007611#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007613#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007614 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007616#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007619#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007622#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007628#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007631#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007634 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007636#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007638#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007640#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007641#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007643#endif
7644#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7646 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007647#endif
7648#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7650 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7651 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007652
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7654 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7655 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007656#ifdef CAN_ISOTP
7657 PyModule_AddIntMacro(m, CAN_ISOTP);
7658#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007659#endif
7660#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007661 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7662 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7663 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7664 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007665#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007666#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7667 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7668#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007669#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007670 PyModule_AddIntMacro(m, CAN_BCM);
Miss Islington (bot)d8b914a2019-07-31 02:10:38 -07007671
7672 /* BCM opcodes */
Charles-François Natali773e42d2013-02-05 19:42:01 +01007673 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7674 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7675 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7676 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7677 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7678 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7679 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7680 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7681 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7682 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7683 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7684 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
Miss Islington (bot)d8b914a2019-07-31 02:10:38 -07007685
7686 /* BCM flags */
7687 PyModule_AddIntConstant(m, "CAN_BCM_SETTIMER", SETTIMER);
7688 PyModule_AddIntConstant(m, "CAN_BCM_STARTTIMER", STARTTIMER);
7689 PyModule_AddIntConstant(m, "CAN_BCM_TX_COUNTEVT", TX_COUNTEVT);
7690 PyModule_AddIntConstant(m, "CAN_BCM_TX_ANNOUNCE", TX_ANNOUNCE);
7691 PyModule_AddIntConstant(m, "CAN_BCM_TX_CP_CAN_ID", TX_CP_CAN_ID);
7692 PyModule_AddIntConstant(m, "CAN_BCM_RX_FILTER_ID", RX_FILTER_ID);
7693 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHECK_DLC", RX_CHECK_DLC);
7694 PyModule_AddIntConstant(m, "CAN_BCM_RX_NO_AUTOTIMER", RX_NO_AUTOTIMER);
7695 PyModule_AddIntConstant(m, "CAN_BCM_RX_ANNOUNCE_RESUME", RX_ANNOUNCE_RESUME);
7696 PyModule_AddIntConstant(m, "CAN_BCM_TX_RESET_MULTI_IDX", TX_RESET_MULTI_IDX);
7697 PyModule_AddIntConstant(m, "CAN_BCM_RX_RTR_FRAME", RX_RTR_FRAME);
7698#ifdef CAN_FD_FRAME
7699 /* CAN_FD_FRAME was only introduced in the 4.8.x kernel series */
7700 PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME);
7701#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007702#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007703#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007705#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007706#ifdef HAVE_SOCKADDR_ALG
7707 PyModule_AddIntMacro(m, SOL_ALG);
7708#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007709#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007711#endif
7712#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007714#endif
7715#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007716 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007717#endif
7718#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007719 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007720#endif
7721#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007722 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007723#endif
7724#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007725 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007728 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007729#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007730 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007732#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007737#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007738 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007740#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007741 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007743#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007744 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007745#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007746#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007747 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007749#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007750 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007752#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007753 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007755#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007756 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007758 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007760#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007761 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007763#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007764 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007767 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007768#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007769 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007771#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007772 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007774#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007775 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007777#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007778 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007780#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007781 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007783#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007784 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007786#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007787 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007789#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007790 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007792#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007793 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007795#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007796 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007798#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007799 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007801#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007802 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007804#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007805 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007807#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007808 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007810#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007813#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007816#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007822#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007825#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007827#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007828#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007831#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007833#endif
7834/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007835#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007836 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007837#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007838 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007840#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007842#endif
7843
Giampaolo Rodola3eca28c2019-03-28 15:20:30 +01007844#ifdef MS_WINDOWS
7845 PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
7846 PyModule_AddIntMacro(m, IPPROTO_ST);
7847 PyModule_AddIntMacro(m, IPPROTO_CBT);
7848 PyModule_AddIntMacro(m, IPPROTO_IGP);
7849 PyModule_AddIntMacro(m, IPPROTO_RDP);
7850 PyModule_AddIntMacro(m, IPPROTO_PGM);
7851 PyModule_AddIntMacro(m, IPPROTO_L2TP);
7852 PyModule_AddIntMacro(m, IPPROTO_SCTP);
7853#endif
7854
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007855#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007857#endif
7858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007859 /* Some port configuration */
7860#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007861 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007862#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007863 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007865#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007866 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007867#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007868 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007869#endif
7870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007871 /* Some reserved IP v.4 addresses */
7872#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007874#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007875 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007877#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007878 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007879#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007880 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007882#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007884#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007885 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007887#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007889#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007890 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007892#ifdef INADDR_ALLHOSTS_GROUP
7893 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7894 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007895#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007896 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007898#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007899 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007900#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007901 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007903#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007905#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007906 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007907#endif
7908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007909 /* IPv4 [gs]etsockopt options */
7910#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007911 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007913#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007914 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007916#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007917 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007919#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007920 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007922#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007923 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007925#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007926 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007928#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007929 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007932 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007934#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007935 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007937#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007938 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007940#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007941 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007943#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007944 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007946#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007947 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007949#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007950 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007952#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007953 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007955#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007956 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007957#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007958#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007959 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007960#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007962 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7963#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007964 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007967 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007969#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007970 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007972#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007973 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007975#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007976 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007979 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007981 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007982#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007983 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007985 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007986#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007987 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007988#endif
7989#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007990 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007991#endif
7992#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007993 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007994#endif
7995#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007996 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007997#endif
7998#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007999 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008000#endif
8001#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008002 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008003#endif
8004#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008005 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008006#endif
8007#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008008 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008009#endif
8010#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008012#endif
8013#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008014 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008015#endif
8016#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008017 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008018#endif
8019#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008020 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008021#endif
8022#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008023 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008024#endif
8025#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008026 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008027#endif
8028#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008029 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008030#endif
8031#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008032 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008033#endif
8034#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008035 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008036#endif
8037#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008038 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008039#endif
8040#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008041 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008042#endif
8043#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008044 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008045#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00008046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008047 /* TCP options */
8048#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008049 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00008050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008051#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008052 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00008053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008054#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008055 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008057#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008058 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008060#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008061 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008063#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008064 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008066#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008067 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008069#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008070 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008072#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008073 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008075#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008076 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008078#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008079 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008081#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008082 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00008083#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05008084#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008085 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05008086#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01008087#ifdef TCP_CONGESTION
8088 PyModule_AddIntMacro(m, TCP_CONGESTION);
8089#endif
8090#ifdef TCP_USER_TIMEOUT
8091 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
8092#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07008093#ifdef TCP_NOTSENT_LOWAT
8094 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
8095#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00008096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008097 /* IPX options */
8098#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008099 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00008100#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008101
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008102/* Reliable Datagram Sockets */
8103#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008104 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008105#endif
8106#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008107 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008108#endif
8109#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008110 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008111#endif
8112#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008113 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008114#endif
8115#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008116 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008117#endif
8118#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008119 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008120#endif
8121#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008122 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008123#endif
8124#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008125 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008126#endif
8127#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008128 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008129#endif
8130#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008131 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008132#endif
8133#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008134 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008135#endif
8136#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008137 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01008138#endif
8139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008140 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008141#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008142 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008143#endif
8144#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008145 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008146#endif
8147#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008148 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008149#endif
8150#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008151 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008152#endif
8153#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008154 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008155#endif
8156#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008157 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008158#endif
8159#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008160 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008161#endif
8162#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008163 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008164#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008165#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008166 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008167#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008168#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008169 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008170#endif
8171#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008172 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008173#endif
8174#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008175 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008176#endif
8177#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008178 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008179#endif
8180#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008181 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008182#endif
8183#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008184 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008185#endif
8186#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008187 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008188#endif
8189#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008190 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008191#endif
8192#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008193 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008194#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00008195#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008196 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00008197#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008198#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008199 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008200#endif
8201#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008202 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008203#endif
8204#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008205 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008206#endif
8207#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008208 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008209#endif
8210#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008211 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008212#endif
8213#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008214 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008215#endif
8216#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008217 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008218#endif
8219#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008220 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008221#endif
8222#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008223 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008224#endif
8225#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008226 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008227#endif
8228#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008229 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008230#endif
8231#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008232 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008233#endif
8234#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008235 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008236#endif
8237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008238 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008239#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008240 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008241#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008242 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008243#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008244 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008245#endif
8246#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008247 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008248#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008249 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008250#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008251 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008252#endif
8253#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008254 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008255#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008256 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008257#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008258 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00008259#endif
8260
Christian Heimesfaf2f632008-01-06 16:59:19 +00008261#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008262 {
Steve Dowerea93ac02016-06-17 12:52:18 -07008263 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
8264#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008265 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07008266#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008267 };
Steve Dowerea93ac02016-06-17 12:52:18 -07008268 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
8269#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03008270 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07008271#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03008272 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008273 int i;
Victor Stinner63941882011-09-29 00:42:28 +02008274 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008275 PyObject *tmp;
8276 tmp = PyLong_FromUnsignedLong(codes[i]);
8277 if (tmp == NULL)
8278 return NULL;
8279 PyModule_AddObject(m, names[i], tmp);
8280 }
8281 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008282 PyModule_AddIntMacro(m, RCVALL_OFF);
8283 PyModule_AddIntMacro(m, RCVALL_ON);
8284 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008285#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008286 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008287#endif
8288#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008289 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008290#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008291#endif /* _MSTCPIP_ */
8292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008293 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008294#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008295 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008296#endif
animalize19e7d482018-02-27 02:10:36 +08008297
8298#ifdef MS_WINDOWS
8299 /* remove some flags on older version Windows during run-time */
8300 remove_unusable_flags(m);
8301#endif
8302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008303 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008304}