blob: adaefad556ca72e619fdec6c327d5374cea593b1 [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
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 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.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Christian Heimesb6e43af2018-01-29 22:37:58 +0100105"socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
106socket(family=-1, type=-1, proto=-1, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000107\n\
108Open a socket of the given type. The family argument specifies the\n\
109address family; it defaults to AF_INET. The type argument specifies\n\
110whether this is a stream (SOCK_STREAM, this is the default)\n\
111or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
112specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200113The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114\n\
Christian Heimesb6e43af2018-01-29 22:37:58 +0100115When a fileno is passed in, family, type and proto are auto-detected,\n\
116unless they are explicitly set.\n\
117\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000118A socket object represents one endpoint of a network connection.\n\
119\n\
120Methods of socket objects (keyword arguments not allowed):\n\
121\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000122_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000123bind(addr) -- bind the socket to a local address\n\
124close() -- close the socket\n\
125connect(addr) -- connect the socket to a remote address\n\
126connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200127dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000128fileno() -- return underlying file descriptor\n\
129getpeername() -- return remote address [*]\n\
130getsockname() -- return local address\n\
131getsockopt(level, optname[, buflen]) -- get socket options\n\
132gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100133listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000134recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000135recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000136recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000137recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000138 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000139sendall(data[, flags]) -- send all data\n\
140send(data[, flags]) -- send data, may not send all of it\n\
141sendto(data[, flags], addr) -- send data to a given address\n\
142setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Yury Selivanovf11b4602018-01-28 17:27:38 -0500143getblocking() -- return True if socket is blocking, False if non-blocking\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200144setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145settimeout(None | float) -- set or clear the timeout\n\
146shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700147if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700148if_nametoindex(name) -- return the corresponding interface index\n\
149if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000151 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000152
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000153/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000154 I hope some day someone can clean this up please... */
155
Guido van Rossum9376b741999-09-15 22:01:40 +0000156/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
157 script doesn't get this right, so we hardcode some platform checks below.
158 On the other hand, not all Linux versions agree, so there the settings
159 computed by the configure script are needed! */
160
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700161#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R_3_ARG
163# undef HAVE_GETHOSTBYNAME_R_5_ARG
164# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000165#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000166
Victor Stinner710d27e2011-08-23 10:57:32 +0200167#if defined(__OpenBSD__)
168# include <sys/uio.h>
169#endif
170
Stefan Krah1f9eb872016-05-22 17:35:34 +0200171#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000173#endif
174
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000176# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define HAVE_GETHOSTBYNAME_R_3_ARG
178# elif defined(__sun) || defined(__sgi)
179# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700180# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000181/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000182# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
183# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# else
185# undef HAVE_GETHOSTBYNAME_R
186# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000187#endif
188
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200189#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000191#endif
192
Ned Deilye1d4e582016-02-23 22:05:29 +1100193/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000194#ifdef HAVE_SYS_PARAM_H
195#include <sys/param.h>
196#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000197/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100198 (this includes the getaddrinfo emulation) protect access with a lock.
199
200 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
201 a mix of code including an unsafe implementation from an old BSD's
202 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
203 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100205
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
207 http://www.openbsd.org/plus54.html
208
209 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
210
211http://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 +1100212 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200213#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100214 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000215 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100216 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
217 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100218 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000219#define USE_GETADDRINFO_LOCK
220#endif
221
222#ifdef USE_GETADDRINFO_LOCK
223#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
224#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
225#else
226#define ACQUIRE_GETADDRINFO_LOCK
227#define RELEASE_GETADDRINFO_LOCK
228#endif
229
230#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000232#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000233
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000234
Serhiy Storchakad3187152017-11-09 18:00:38 +0200235#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__)
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100236# include <sys/ioctl.h>
237#endif
238
239
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000240#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241/* make sure that the reentrant (gethostbyaddr_r etc)
242 functions are declared correctly if compiling with
243 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244
Thomas Wouters477c8d52006-05-27 19:21:47 +0000245/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000247#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000248#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000249
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000250#undef _XOPEN_SOURCE
251#include <sys/socket.h>
252#include <sys/types.h>
253#include <netinet/in.h>
254#ifdef _SS_ALIGNSIZE
255#define HAVE_GETADDRINFO 1
256#define HAVE_GETNAMEINFO 1
257#endif
258
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000259#define HAVE_INET_PTON
260#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000261#endif
262
Benjamin Peterson06930632017-09-04 16:36:05 -0700263/* Solaris fails to define this variable at all. */
264#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000265#define INET_ADDRSTRLEN 16
266#endif
267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000270#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700273#ifdef HAVE_SYS_SOCKET_H
274#include <sys/socket.h>
275#endif
276
277#ifdef HAVE_NET_IF_H
278#include <net/if.h>
279#endif
280
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000281/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000283#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284
285/* Addressing includes */
286
Guido van Rossum6f489d91996-06-28 20:15:15 +0000287#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
289/* Non-MS WINDOWS includes */
290# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000291# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000292
Guido van Rossum9376b741999-09-15 22:01:40 +0000293/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000295
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000298#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301# ifdef HAVE_FCNTL_H
302# include <fcntl.h>
303# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304
Steve Dower65e4cb12014-11-22 12:54:57 -0800305/* Provides the IsWindows7SP1OrGreater() function */
Erik Janssense6a47552018-08-16 08:40:50 +0200306#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800307
animalize19e7d482018-02-27 02:10:36 +0800308/* remove some flags on older version Windows during run-time.
309 https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
310typedef struct {
311 DWORD build_number; /* available starting with this Win10 BuildNumber */
312 const char flag_name[20];
313} FlagRuntimeInfo;
314
315/* IMPORTANT: make sure the list ordered by descending build_number */
316static FlagRuntimeInfo win_runtime_flags[] = {
317 /* available starting with Windows 10 1709 */
318 {16299, "TCP_KEEPIDLE"},
319 {16299, "TCP_KEEPINTVL"},
320 /* available starting with Windows 10 1703 */
321 {15063, "TCP_KEEPCNT"},
322 /* available starting with Windows 10 1607 */
323 {14393, "TCP_FASTOPEN"}
324};
325
326static void
327remove_unusable_flags(PyObject *m)
328{
329 PyObject *dict;
330 OSVERSIONINFOEX info;
331 DWORDLONG dwlConditionMask;
332
333 dict = PyModule_GetDict(m);
334 if (dict == NULL) {
335 return;
336 }
337
338 /* set to Windows 10, except BuildNumber. */
339 memset(&info, 0, sizeof(info));
340 info.dwOSVersionInfoSize = sizeof(info);
341 info.dwMajorVersion = 10;
342 info.dwMinorVersion = 0;
343
344 /* set Condition Mask */
345 dwlConditionMask = 0;
346 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
347 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
348 VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
349
350 for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
351 info.dwBuildNumber = win_runtime_flags[i].build_number;
352 /* greater than or equal to the specified version?
353 Compatibility Mode will not cheat VerifyVersionInfo(...) */
354 if (VerifyVersionInfo(
355 &info,
356 VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
357 dwlConditionMask)) {
358 break;
359 }
360 else {
361 if (PyDict_GetItemString(
362 dict,
363 win_runtime_flags[i].flag_name) != NULL) {
364 PyDict_DelItemString(
365 dict,
366 win_runtime_flags[i].flag_name);
367 }
368 }
369 }
370}
371
Jeremy Hylton22308652001-02-02 03:23:09 +0000372#endif
373
Skip Montanaro7befb992004-02-10 16:50:21 +0000374#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000375
Neal Norwitz39d22e52002-11-02 19:55:21 +0000376#ifndef O_NONBLOCK
377# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000378#endif
379
Trent Micka708d6e2004-09-07 17:48:26 +0000380/* include Python's addrinfo.h unless it causes trouble */
381#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
382 /* Do not include addinfo.h on some newer IRIX versions.
383 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
384 * for example, but not by 6.5.10.
385 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000386#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000387 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
388 * EAI_* constants are defined in (the already included) ws2tcpip.h.
389 */
390#else
391# include "addrinfo.h"
392#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000393
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000394#ifdef __APPLE__
395/* On OS X, getaddrinfo returns no error indication of lookup
396 failure, so we must use the emulation instead of the libinfo
397 implementation. Unfortunately, performing an autoconf test
398 for this bug would require DNS access for the machine performing
399 the configuration, which is not acceptable. Therefore, we
400 determine the bug just by checking for __APPLE__. If this bug
401 gets ever fixed, perhaps checking for sys/version.h would be
402 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000403#ifndef HAVE_GETNAMEINFO
luzpaza5293b42017-11-05 07:37:50 -0600404/* This bug seems to be fixed in Jaguar. The easiest way I could
Jack Jansen84262fb2002-07-02 14:40:42 +0000405 Find to check for Jaguar is that it has getnameinfo(), which
406 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000407#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000408#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409
410#ifdef HAVE_INET_ATON
411#define USE_INET_ATON_WEAKLINK
412#endif
413
Jack Jansen84262fb2002-07-02 14:40:42 +0000414#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000415
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000416/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000417#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000418/* avoid clashes with the C library definition of the symbol. */
419#define getaddrinfo fake_getaddrinfo
420#define gai_strerror fake_gai_strerror
421#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000422#include "getaddrinfo.c"
423#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000424#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000425#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000426#include "getnameinfo.c"
427#endif
428
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000429#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000430#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000431#endif
432
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000433#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000434#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000435#define EAFNOSUPPORT WSAEAFNOSUPPORT
436#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000438
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000439#ifndef SOCKETCLOSE
440#define SOCKETCLOSE close
441#endif
442
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000443#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000444#define USE_BLUETOOTH 1
445#if defined(__FreeBSD__)
446#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
447#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000448#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000449#define SOL_HCI SOL_HCI_RAW
450#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000451#define sockaddr_l2 sockaddr_l2cap
452#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000454#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
455#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000456#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000457#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458#define sockaddr_l2 sockaddr_bt
459#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000460#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000462#define SOL_HCI BTPROTO_HCI
463#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
465#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000466#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000468#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000469#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
470#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000471#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000472#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
473#endif
474#endif
475
Charles-François Natali8b759652011-12-23 16:44:51 +0100476/* Convert "sock_addr_t *" to "struct sockaddr *". */
477#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000478
Martin v. Löwise9416172003-05-03 10:12:45 +0000479/*
480 * Constants for getnameinfo()
481 */
482#if !defined(NI_MAXHOST)
483#define NI_MAXHOST 1025
484#endif
485#if !defined(NI_MAXSERV)
486#define NI_MAXSERV 32
487#endif
488
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000489#ifndef INVALID_SOCKET /* MS defines this */
490#define INVALID_SOCKET (-1)
491#endif
492
Charles-François Natali0cc86852013-09-13 19:53:08 +0200493#ifndef INADDR_NONE
494#define INADDR_NONE (-1)
495#endif
496
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000497/* XXX There's a problem here: *static* functions are not supposed to have
498 a Py prefix (or use CapitalizedWords). Later... */
499
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500/* Global variable holding the exception type for errors detected
501 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000502static PyObject *socket_herror;
503static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000504static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000505
Tim Peters643a7fc2002-02-17 04:13:21 +0000506/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000507 The sock_type variable contains pointers to various functions,
508 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000509 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000510static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000511
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000512#if defined(HAVE_POLL_H)
513#include <poll.h>
514#elif defined(HAVE_SYS_POLL_H)
515#include <sys/poll.h>
516#endif
517
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000518/* Largest value to try to store in a socklen_t (used when handling
519 ancillary data). POSIX requires socklen_t to hold at least
520 (2**31)-1 and recommends against storing larger values, but
521 socklen_t was originally int in the BSD interface, so to be on the
522 safe side we use the smaller of (2**31)-1 and INT_MAX. */
523#if INT_MAX > 0x7fffffff
524#define SOCKLEN_T_LIMIT 0x7fffffff
525#else
526#define SOCKLEN_T_LIMIT INT_MAX
527#endif
528
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200529#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000530/* Instead of select(), we'll use poll() since poll() works on any fd. */
531#define IS_SELECTABLE(s) 1
532/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000533#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200534/* If there's no timeout left, we don't have to call select, so it's a safe,
535 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100536#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000537#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000538
539static PyObject*
540select_error(void)
541{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200542 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000544}
545
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000546#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000547#ifndef WSAEAGAIN
548#define WSAEAGAIN WSAEWOULDBLOCK
549#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000550#define CHECK_ERRNO(expected) \
551 (WSAGetLastError() == WSA ## expected)
552#else
553#define CHECK_ERRNO(expected) \
554 (errno == expected)
555#endif
556
Victor Stinnerdaf45552013-08-28 00:53:59 +0200557#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200558# define GET_SOCK_ERROR WSAGetLastError()
559# define SET_SOCK_ERROR(err) WSASetLastError(err)
560# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
561# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
562#else
563# define GET_SOCK_ERROR errno
564# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
565# define SOCK_TIMEOUT_ERR EWOULDBLOCK
566# define SOCK_INPROGRESS_ERR EINPROGRESS
567#endif
568
Erik Janssens874809e2018-09-05 08:29:42 +0200569#ifdef _MSC_VER
570# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
571#else
572# define SUPPRESS_DEPRECATED_CALL
573#endif
Victor Stinner81c41db2015-04-02 11:50:57 +0200574
575#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200576/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
577static int support_wsa_no_inherit = -1;
578#endif
579
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580/* Convenience function to raise an error according to errno
581 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582
Guido van Rossum73624e91994-10-10 17:59:00 +0000583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000584set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000586#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 int err_no = WSAGetLastError();
588 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
589 recognizes the error codes used by both GetLastError() and
590 WSAGetLastError */
591 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200592 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000593#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000594
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200595 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596}
597
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000600set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000603
604#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (v != NULL) {
610 PyErr_SetObject(socket_herror, v);
611 Py_DECREF(v);
612 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000615}
616
617
618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000619set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622
Martin v. Löwis272cb402002-03-01 08:31:07 +0000623#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* EAI_SYSTEM is not available on Windows XP. */
625 if (error == EAI_SYSTEM)
626 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000627#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000629#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000631#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 if (v != NULL) {
635 PyErr_SetObject(socket_gaierror, v);
636 Py_DECREF(v);
637 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640}
641
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000642/* Function to perform the setting of socket blocking mode
643 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644static int
645internal_setblocking(PySocketSockObject *s, int block)
646{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400647 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200648#ifdef MS_WINDOWS
649 u_long arg;
650#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100651#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100652 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100653 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000654#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100658#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200660 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400661 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200664 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400665 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100667 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 else
Victor Stinner9a954832013-12-04 00:41:24 +0100669 new_delay_flag = delay_flag | O_NONBLOCK;
670 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200671 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400672 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100673#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000674#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200675 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200676 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400677 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400679
680 result = 0;
681
682 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684
Yury Selivanovfa22b292016-10-18 16:03:52 -0400685 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200686#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400687 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200688#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400689 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200690#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400691 }
692
693 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000694}
695
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000696static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200697internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
698 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100701#ifdef HAVE_POLL
702 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200703 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100704#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200705 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200706 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100707#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000708
Victor Stinnerb7df3142015-03-27 22:59:32 +0100709 /* must be called with the GIL held */
710 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100711
Victor Stinner416f2e62015-03-31 13:56:29 +0200712 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200713 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200716 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 /* Prefer poll, if available, since you can poll() any fd
720 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000721#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100722 pollfd.fd = s->sock_fd;
723 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200724 if (connect) {
725 /* On Windows, the socket becomes writable on connection success,
726 but a connection failure is notified as an error. On POSIX, the
727 socket becomes writable on connection success or on connection
728 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200729 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000731
Victor Stinner71694d52015-03-28 01:18:54 +0100732 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200733 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200734 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000735
Victor Stinner71694d52015-03-28 01:18:54 +0100736 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200737 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100738 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000739#else
Victor Stinnerced11742015-04-09 10:27:25 +0200740 if (interval >= 0) {
741 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
742 tvp = &tv;
743 }
744 else
745 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000746
Victor Stinner71694d52015-03-28 01:18:54 +0100747 FD_ZERO(&fds);
748 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200749 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200750 if (connect) {
751 /* On Windows, the socket becomes writable on connection success,
752 but a connection failure is notified as an error. On POSIX, the
753 socket becomes writable on connection success or on connection
754 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200755 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200756 }
Victor Stinner71694d52015-03-28 01:18:54 +0100757
758 /* See if the socket is ready */
759 Py_BEGIN_ALLOW_THREADS;
760 if (writing)
761 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200762 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100763 else
764 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200765 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100766 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000767#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (n < 0)
770 return -1;
771 if (n == 0)
772 return 1;
773 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000774}
775
Victor Stinner31bf2d52015-04-01 21:57:09 +0200776/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000777
Victor Stinner81c41db2015-04-02 11:50:57 +0200778 On error, raise an exception and return -1 if err is set, or fill err and
779 return -1 otherwise. If a signal was received and the signal handler raised
780 an exception, return -1, and set err to -1 if err is set.
781
782 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100783
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784 If the socket has a timeout, wait until the socket is ready before calling
785 the function: wait until the socket is writable if writing is nonzero, wait
786 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100787
Victor Stinner81c41db2015-04-02 11:50:57 +0200788 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200789 the function, except if the signal handler raised an exception (PEP 475).
790
791 When the function is retried, recompute the timeout using a monotonic clock.
792
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 sock_call_ex() must be called with the GIL held. The socket function is
794 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200796sock_call_ex(PySocketSockObject *s,
797 int writing,
798 int (*sock_func) (PySocketSockObject *s, void *data),
799 void *data,
800 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200801 int *err,
802 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803{
Victor Stinner8912d142015-04-06 23:16:34 +0200804 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 _PyTime_t deadline = 0;
806 int deadline_initialized = 0;
807 int res;
808
809 /* sock_call() must be called with the GIL held. */
810 assert(PyGILState_Check());
811
812 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200814 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 /* For connect(), poll even for blocking socket. The connection
816 runs asynchronously. */
817 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200819 _PyTime_t interval;
820
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 if (deadline_initialized) {
822 /* recompute the timeout */
823 interval = deadline - _PyTime_GetMonotonicClock();
824 }
825 else {
826 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200827 deadline = _PyTime_GetMonotonicClock() + timeout;
828 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830
Victor Stinner10550cd2015-04-03 13:22:27 +0200831 if (interval >= 0)
832 res = internal_select(s, writing, interval, connect);
833 else
834 res = 1;
835 }
836 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200837 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200838 }
839
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 if (err)
842 *err = GET_SOCK_ERROR;
843
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 if (CHECK_ERRNO(EINTR)) {
845 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200846 if (PyErr_CheckSignals()) {
847 if (err)
848 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200849 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200850 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200851
852 /* retry select() */
853 continue;
854 }
855
856 /* select() failed */
857 s->errorhandler();
858 return -1;
859 }
860
861 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200862 if (err)
863 *err = SOCK_TIMEOUT_ERR;
864 else
865 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200866 return -1;
867 }
868
869 /* the socket is ready */
870 }
871
Victor Stinner81c41db2015-04-02 11:50:57 +0200872 /* inner loop to retry sock_func() when sock_func() is interrupted
873 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200874 while (1) {
875 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200876 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200877 Py_END_ALLOW_THREADS
878
879 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200880 /* sock_func() succeeded */
881 if (err)
882 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200883 return 0;
884 }
885
Victor Stinner81c41db2015-04-02 11:50:57 +0200886 if (err)
887 *err = GET_SOCK_ERROR;
888
Victor Stinner31bf2d52015-04-01 21:57:09 +0200889 if (!CHECK_ERRNO(EINTR))
890 break;
891
Victor Stinner81c41db2015-04-02 11:50:57 +0200892 /* sock_func() was interrupted by a signal */
893 if (PyErr_CheckSignals()) {
894 if (err)
895 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200896 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200897 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200898
Victor Stinner81c41db2015-04-02 11:50:57 +0200899 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200900 }
901
902 if (s->sock_timeout > 0
903 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200904 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200905
906 For example, select() could indicate a socket is ready for
907 reading, but the data then discarded by the OS because of a
908 wrong checksum.
909
910 Loop on select() to recheck for socket readyness. */
911 continue;
912 }
913
Victor Stinner81c41db2015-04-02 11:50:57 +0200914 /* sock_func() failed */
915 if (!err)
916 s->errorhandler();
917 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000918 return -1;
919 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200920}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000921
Victor Stinner81c41db2015-04-02 11:50:57 +0200922static int
923sock_call(PySocketSockObject *s,
924 int writing,
925 int (*func) (PySocketSockObject *s, void *data),
926 void *data)
927{
Victor Stinner8912d142015-04-06 23:16:34 +0200928 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200929}
930
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000931
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000932/* Initialize a new socket object. */
933
Victor Stinner88ed6402015-04-09 10:23:12 +0200934/* Default timeout for new sockets */
935static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000936
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200937static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000938init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 s->sock_fd = fd;
942 s->sock_family = family;
Yury Selivanov98181422017-12-18 20:02:54 -0500943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 s->sock_type = type;
Yury Selivanov98181422017-12-18 20:02:54 -0500945
946 /* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
947 on some OSes as part of socket.type. We want to reset them here,
948 to make socket.type be set to the same value on all platforms.
949 Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
950 not portable.
951 */
952#ifdef SOCK_NONBLOCK
953 s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
954#endif
955#ifdef SOCK_CLOEXEC
956 s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
957#endif
958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000962#ifdef SOCK_NONBLOCK
963 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100964 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000965 else
966#endif
967 {
968 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200969 if (defaulttimeout >= 0) {
970 if (internal_setblocking(s, 0) == -1) {
971 return -1;
972 }
973 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000974 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200975 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000976}
977
978
Guido van Rossum30a685f1991-06-27 15:51:29 +0000979/* Create a new socket object.
980 This just creates the object and initializes it.
981 If the creation fails, return NULL and set an exception (implicit
982 in NEWOBJ()). */
983
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000985new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 PySocketSockObject *s;
988 s = (PySocketSockObject *)
989 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200990 if (s == NULL)
991 return NULL;
992 if (init_sockobject(s, fd, family, type, proto) == -1) {
993 Py_DECREF(s);
994 return NULL;
995 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000997}
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Guido van Rossum48a680c2001-03-02 06:34:14 +00001000/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +00001001 thread to be in gethostbyname or getaddrinfo */
1002#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +02001003static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001004#endif
1005
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007/* Convert a string specifying a host name or one of a few symbolic
1008 names to a numeric IP address. This usually calls gethostbyname()
1009 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001010 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011 an error occurred; then an exception is raised. */
1012
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001014setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 struct addrinfo hints, *res;
1017 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
1020 if (name[0] == '\0') {
1021 int siz;
1022 memset(&hints, 0, sizeof(hints));
1023 hints.ai_family = af;
1024 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
1025 hints.ai_flags = AI_PASSIVE;
1026 Py_BEGIN_ALLOW_THREADS
1027 ACQUIRE_GETADDRINFO_LOCK
1028 error = getaddrinfo(NULL, "0", &hints, &res);
1029 Py_END_ALLOW_THREADS
1030 /* We assume that those thread-unsafe getaddrinfo() versions
1031 *are* safe regarding their return value, ie. that a
1032 subsequent call to getaddrinfo() does not destroy the
1033 outcome of the first call. */
1034 RELEASE_GETADDRINFO_LOCK
1035 if (error) {
1036 set_gaierror(error);
1037 return -1;
1038 }
1039 switch (res->ai_family) {
1040 case AF_INET:
1041 siz = 4;
1042 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001043#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 case AF_INET6:
1045 siz = 16;
1046 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 default:
1049 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001050 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 "unsupported address family");
1052 return -1;
1053 }
1054 if (res->ai_next) {
1055 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 "wildcard resolved to multiple address");
1058 return -1;
1059 }
1060 if (res->ai_addrlen < addr_ret_size)
1061 addr_ret_size = res->ai_addrlen;
1062 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1063 freeaddrinfo(res);
1064 return siz;
1065 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001066 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001067 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001068 if (strcmp(name, "255.255.255.255") == 0 ||
1069 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 struct sockaddr_in *sin;
1071 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001072 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 "address family mismatched");
1074 return -1;
1075 }
1076 sin = (struct sockaddr_in *)addr_ret;
1077 memset((void *) sin, '\0', sizeof(*sin));
1078 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001079#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 sin->sin_addr.s_addr = INADDR_BROADCAST;
1083 return sizeof(sin->sin_addr);
1084 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001085
1086 /* avoid a name resolution in case of numeric address */
1087#ifdef HAVE_INET_PTON
1088 /* check for an IPv4 address */
1089 if (af == AF_UNSPEC || af == AF_INET) {
1090 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1091 memset(sin, 0, sizeof(*sin));
1092 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1093 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001094#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001095 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001096#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001097 return 4;
1098 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001100#ifdef ENABLE_IPV6
1101 /* check for an IPv6 address - if the address contains a scope ID, we
1102 * fallback to getaddrinfo(), which can handle translation from interface
1103 * name to interface index */
1104 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1105 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1106 memset(sin, 0, sizeof(*sin));
1107 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1108 sin->sin6_family = AF_INET6;
1109#ifdef HAVE_SOCKADDR_SA_LEN
1110 sin->sin6_len = sizeof(*sin);
1111#endif
1112 return 16;
1113 }
1114 }
1115#endif /* ENABLE_IPV6 */
1116#else /* HAVE_INET_PTON */
1117 /* check for an IPv4 address */
1118 if (af == AF_INET || af == AF_UNSPEC) {
1119 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1120 memset(sin, 0, sizeof(*sin));
1121 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1122 sin->sin_family = AF_INET;
1123#ifdef HAVE_SOCKADDR_SA_LEN
1124 sin->sin_len = sizeof(*sin);
1125#endif
1126 return 4;
1127 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001128 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001129#endif /* HAVE_INET_PTON */
1130
1131 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 memset(&hints, 0, sizeof(hints));
1133 hints.ai_family = af;
1134 Py_BEGIN_ALLOW_THREADS
1135 ACQUIRE_GETADDRINFO_LOCK
1136 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001137#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 if (error == EAI_NONAME && af == AF_UNSPEC) {
1139 /* On Tru64 V5.1, numeric-to-addr conversion fails
1140 if no address family is given. Assume IPv4 for now.*/
1141 hints.ai_family = AF_INET;
1142 error = getaddrinfo(name, NULL, &hints, &res);
1143 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 Py_END_ALLOW_THREADS
1146 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1147 if (error) {
1148 set_gaierror(error);
1149 return -1;
1150 }
1151 if (res->ai_addrlen < addr_ret_size)
1152 addr_ret_size = res->ai_addrlen;
1153 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1154 freeaddrinfo(res);
1155 switch (addr_ret->sa_family) {
1156 case AF_INET:
1157 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001158#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 case AF_INET6:
1160 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001163 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return -1;
1165 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001166}
1167
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168
Коренберг Марк7766b962018-02-13 00:47:42 +05001169/* Convert IPv4 sockaddr to a Python str. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
Guido van Rossum73624e91994-10-10 17:59:00 +00001171static PyObject *
Коренберг Марк7766b962018-02-13 00:47:42 +05001172make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173{
Коренберг Марк7766b962018-02-13 00:47:42 +05001174 char buf[INET_ADDRSTRLEN];
1175 if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
1176 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 return NULL;
1178 }
1179 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180}
1181
Коренберг Марк7766b962018-02-13 00:47:42 +05001182#ifdef ENABLE_IPV6
1183/* Convert IPv6 sockaddr to a Python str. */
1184
1185static PyObject *
1186make_ipv6_addr(const struct sockaddr_in6 *addr)
1187{
1188 char buf[INET6_ADDRSTRLEN];
1189 if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
1190 PyErr_SetFromErrno(PyExc_OSError);
1191 return NULL;
1192 }
1193 return PyUnicode_FromString(buf);
1194}
1195#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001196
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001197#ifdef USE_BLUETOOTH
1198/* Convert a string representation of a Bluetooth address into a numeric
1199 address. Returns the length (6), or raises an exception and returns -1 if
1200 an error occurred. */
1201
1202static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001203setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 unsigned int b0, b1, b2, b3, b4, b5;
1206 char ch;
1207 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1210 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1211 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1212 bdaddr->b[0] = b0;
1213 bdaddr->b[1] = b1;
1214 bdaddr->b[2] = b2;
1215 bdaddr->b[3] = b3;
1216 bdaddr->b[4] = b4;
1217 bdaddr->b[5] = b5;
1218 return 6;
1219 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001220 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 return -1;
1222 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001223}
1224
1225/* Create a string representation of the Bluetooth address. This is always a
1226 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1227 value (zero padded if necessary). */
1228
1229static PyObject *
1230makebdaddr(bdaddr_t *bdaddr)
1231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1235 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1236 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1237 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001238}
1239#endif
1240
1241
Guido van Rossum30a685f1991-06-27 15:51:29 +00001242/* Create an object representing the given socket address,
1243 suitable for passing it back to bind(), connect() etc.
1244 The family field of the sockaddr structure is inspected
1245 to determine what kind of address it really is. */
1246
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001248static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001249makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 if (addrlen == 0) {
1252 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001253 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case AF_INET:
1259 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001260 const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
1261 PyObject *addrobj = make_ipv4_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 PyObject *ret = NULL;
1263 if (addrobj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1265 Py_DECREF(addrobj);
1266 }
1267 return ret;
1268 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001269
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001270#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 case AF_UNIX:
1272 {
1273 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001274#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001275 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1276 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1277 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 }
1279 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001280#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 {
1282 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001283 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 }
1285 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001286#endif /* AF_UNIX */
1287
Martin v. Löwis11017b12006-01-14 18:12:57 +00001288#if defined(AF_NETLINK)
1289 case AF_NETLINK:
1290 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1292 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001293 }
1294#endif /* AF_NETLINK */
1295
caaveryeffc12f2017-09-06 18:18:10 -04001296#if defined(AF_VSOCK)
1297 case AF_VSOCK:
1298 {
1299 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1300 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1301 }
1302#endif /* AF_VSOCK */
1303
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001304#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_INET6:
1306 {
Коренберг Марк7766b962018-02-13 00:47:42 +05001307 const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
1308 PyObject *addrobj = make_ipv6_addr(a);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 PyObject *ret = NULL;
1310 if (addrobj) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001311 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 addrobj,
1313 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001314 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 a->sin6_scope_id);
1316 Py_DECREF(addrobj);
1317 }
1318 return ret;
1319 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001320#endif /* ENABLE_IPV6 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001321
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001322#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 case AF_BLUETOOTH:
1324 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 case BTPROTO_L2CAP:
1327 {
1328 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1329 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1330 PyObject *ret = NULL;
1331 if (addrobj) {
1332 ret = Py_BuildValue("Oi",
1333 addrobj,
1334 _BT_L2_MEMB(a, psm));
1335 Py_DECREF(addrobj);
1336 }
1337 return ret;
1338 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 case BTPROTO_RFCOMM:
1341 {
1342 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1343 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1344 PyObject *ret = NULL;
1345 if (addrobj) {
1346 ret = Py_BuildValue("Oi",
1347 addrobj,
1348 _BT_RC_MEMB(a, channel));
1349 Py_DECREF(addrobj);
1350 }
1351 return ret;
1352 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 case BTPROTO_HCI:
1355 {
1356 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001357#if defined(__NetBSD__) || defined(__DragonFly__)
1358 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
Serhiy Storchakad3187152017-11-09 18:00:38 +02001359#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyObject *ret = NULL;
1361 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1362 return ret;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001363#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001365
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001366#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 case BTPROTO_SCO:
1368 {
1369 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1370 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1371 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001372#endif /* !__FreeBSD__ */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 default:
1375 PyErr_SetString(PyExc_ValueError,
1376 "Unknown Bluetooth protocol");
1377 return NULL;
1378 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001379#endif /* USE_BLUETOOTH */
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001380
Antoine Pitroub156a462010-10-27 20:13:57 +00001381#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 case AF_PACKET:
1383 {
1384 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001385 const char *ifname = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 struct ifreq ifr;
1387 /* need to look up interface name give index */
1388 if (a->sll_ifindex) {
1389 ifr.ifr_ifindex = a->sll_ifindex;
1390 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1391 ifname = ifr.ifr_name;
1392 }
1393 return Py_BuildValue("shbhy#",
1394 ifname,
1395 ntohs(a->sll_protocol),
1396 a->sll_pkttype,
1397 a->sll_hatype,
1398 a->sll_addr,
1399 a->sll_halen);
1400 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001401#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFNAME */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001402
Christian Heimes043d6f62008-01-07 17:19:16 +00001403#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 case AF_TIPC:
1405 {
1406 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1407 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1408 return Py_BuildValue("IIIII",
1409 a->addrtype,
1410 a->addr.nameseq.type,
1411 a->addr.nameseq.lower,
1412 a->addr.nameseq.upper,
1413 a->scope);
1414 } else if (a->addrtype == TIPC_ADDR_NAME) {
1415 return Py_BuildValue("IIIII",
1416 a->addrtype,
1417 a->addr.name.name.type,
1418 a->addr.name.name.instance,
1419 a->addr.name.name.instance,
1420 a->scope);
1421 } else if (a->addrtype == TIPC_ADDR_ID) {
1422 return Py_BuildValue("IIIII",
1423 a->addrtype,
1424 a->addr.id.node,
1425 a->addr.id.ref,
1426 0,
1427 a->scope);
1428 } else {
1429 PyErr_SetString(PyExc_ValueError,
1430 "Invalid address type");
1431 return NULL;
1432 }
1433 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001434#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001435
Serhiy Storchakad3187152017-11-09 18:00:38 +02001436#if defined(AF_CAN) && defined(SIOCGIFNAME)
Charles-François Natali47413c12011-10-06 19:47:44 +02001437 case AF_CAN:
1438 {
1439 struct sockaddr_can *a = (struct sockaddr_can *)addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001440 const char *ifname = "";
Charles-François Natali47413c12011-10-06 19:47:44 +02001441 struct ifreq ifr;
1442 /* need to look up interface name given index */
1443 if (a->can_ifindex) {
1444 ifr.ifr_ifindex = a->can_ifindex;
1445 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1446 ifname = ifr.ifr_name;
1447 }
1448
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001449 switch (proto) {
1450#ifdef CAN_ISOTP
1451 case CAN_ISOTP:
1452 {
1453 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1454 ifname,
1455 a->can_addr.tp.rx_id,
1456 a->can_addr.tp.tx_id);
1457 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001458#endif /* CAN_ISOTP */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001459 default:
1460 {
1461 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1462 ifname);
1463 }
1464 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001465 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001466#endif /* AF_CAN && SIOCGIFNAME */
Charles-François Natali47413c12011-10-06 19:47:44 +02001467
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001468#ifdef PF_SYSTEM
1469 case PF_SYSTEM:
1470 switch(proto) {
1471#ifdef SYSPROTO_CONTROL
1472 case SYSPROTO_CONTROL:
1473 {
1474 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1475 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1476 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001477#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001478 default:
1479 PyErr_SetString(PyExc_ValueError,
1480 "Invalid address type");
1481 return 0;
1482 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001483#endif /* PF_SYSTEM */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001484
Christian Heimesdffa3942016-09-05 23:54:41 +02001485#ifdef HAVE_SOCKADDR_ALG
1486 case AF_ALG:
1487 {
1488 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1489 return Py_BuildValue("s#s#HH",
1490 a->salg_type,
1491 strnlen((const char*)a->salg_type,
1492 sizeof(a->salg_type)),
1493 a->salg_name,
1494 strnlen((const char*)a->salg_name,
1495 sizeof(a->salg_name)),
1496 a->salg_feat,
1497 a->salg_mask);
1498 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001499#endif /* HAVE_SOCKADDR_ALG */
Christian Heimesdffa3942016-09-05 23:54:41 +02001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 default:
1504 /* If we don't know the address family, don't raise an
1505 exception -- return it as an (int, bytes) tuple. */
1506 return Py_BuildValue("iy#",
1507 addr->sa_family,
1508 addr->sa_data,
1509 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001512}
1513
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001514/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1515 (in particular, numeric IP addresses). */
1516struct maybe_idna {
1517 PyObject *obj;
1518 char *buf;
1519};
1520
1521static void
1522idna_cleanup(struct maybe_idna *data)
1523{
1524 Py_CLEAR(data->obj);
1525}
1526
1527static int
1528idna_converter(PyObject *obj, struct maybe_idna *data)
1529{
1530 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001531 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001532 if (obj == NULL) {
1533 idna_cleanup(data);
1534 return 1;
1535 }
1536 data->obj = NULL;
1537 len = -1;
1538 if (PyBytes_Check(obj)) {
1539 data->buf = PyBytes_AsString(obj);
1540 len = PyBytes_Size(obj);
1541 }
1542 else if (PyByteArray_Check(obj)) {
1543 data->buf = PyByteArray_AsString(obj);
1544 len = PyByteArray_Size(obj);
1545 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001546 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001547 if (PyUnicode_READY(obj) == -1) {
1548 return 0;
1549 }
1550 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001551 data->buf = PyUnicode_DATA(obj);
1552 len = PyUnicode_GET_LENGTH(obj);
1553 }
1554 else {
1555 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1556 if (!obj2) {
1557 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1558 return 0;
1559 }
1560 assert(PyBytes_Check(obj2));
1561 data->obj = obj2;
1562 data->buf = PyBytes_AS_STRING(obj2);
1563 len = PyBytes_GET_SIZE(obj2);
1564 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 }
1566 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001567 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1568 obj->ob_type->tp_name);
1569 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001570 }
1571 if (strlen(data->buf) != len) {
1572 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001573 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001574 return 0;
1575 }
1576 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001577}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001578
1579/* Parse a socket address argument according to the socket object's
1580 address family. Return 1 if the address was in the proper format,
1581 0 of not. The address is returned through addr_ret, its length
1582 through len_ret. */
1583
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001585getsockaddrarg(PySocketSockObject *s, PyObject *args,
Oren Milman735171e2018-09-11 19:51:29 +03001586 struct sockaddr *addr_ret, int *len_ret, const char *caller)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001589
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001590#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 case AF_UNIX:
1592 {
1593 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001594 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001595 int retval = 0;
1596
1597 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1598 allow embedded nulls on Linux. */
1599 if (PyUnicode_Check(args)) {
1600 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1601 return 0;
1602 }
1603 else
1604 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001605 if (!PyArg_Parse(args, "y*", &path)) {
1606 Py_DECREF(args);
1607 return retval;
1608 }
1609 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001612#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001613 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001615 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001616 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001618 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 }
1620 }
1621 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001622#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 {
1624 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001625 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001626 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001628 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001630 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 }
1632 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 memcpy(addr->sun_path, path.buf, path.len);
1634 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001635 retval = 1;
1636 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001637 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001638 Py_DECREF(args);
1639 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001642
Martin v. Löwis11017b12006-01-14 18:12:57 +00001643#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 case AF_NETLINK:
1645 {
1646 struct sockaddr_nl* addr;
1647 int pid, groups;
1648 addr = (struct sockaddr_nl *)addr_ret;
1649 if (!PyTuple_Check(args)) {
1650 PyErr_Format(
1651 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001652 "%s(): AF_NETLINK address must be tuple, not %.500s",
1653 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 return 0;
1655 }
Oren Milman735171e2018-09-11 19:51:29 +03001656 if (!PyArg_ParseTuple(args,
1657 "II;AF_NETLINK address must be a pair "
1658 "(pid, groups)",
1659 &pid, &groups))
1660 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001662 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 addr->nl_family = AF_NETLINK;
1664 addr->nl_pid = pid;
1665 addr->nl_groups = groups;
1666 *len_ret = sizeof(*addr);
1667 return 1;
1668 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001669#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001670
caaveryeffc12f2017-09-06 18:18:10 -04001671#if defined(AF_VSOCK)
1672 case AF_VSOCK:
1673 {
1674 struct sockaddr_vm* addr;
1675 int port, cid;
1676 addr = (struct sockaddr_vm *)addr_ret;
1677 memset(addr, 0, sizeof(struct sockaddr_vm));
1678 if (!PyTuple_Check(args)) {
1679 PyErr_Format(
1680 PyExc_TypeError,
1681 "getsockaddrarg: "
1682 "AF_VSOCK address must be tuple, not %.500s",
1683 Py_TYPE(args)->tp_name);
1684 return 0;
1685 }
1686 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1687 return 0;
1688 addr->svm_family = s->sock_family;
1689 addr->svm_port = port;
1690 addr->svm_cid = cid;
1691 *len_ret = sizeof(*addr);
1692 return 1;
1693 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001694#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001695
1696
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001697#ifdef AF_RDS
1698 case AF_RDS:
1699 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001700#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 case AF_INET:
1703 {
1704 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001705 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 int port, result;
1707 if (!PyTuple_Check(args)) {
1708 PyErr_Format(
1709 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001710 "%s(): AF_INET address must be tuple, not %.500s",
1711 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 return 0;
1713 }
Oren Milman735171e2018-09-11 19:51:29 +03001714 if (!PyArg_ParseTuple(args,
1715 "O&i;AF_INET address must be a pair "
1716 "(host, port)",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001717 idna_converter, &host, &port))
Oren Milman735171e2018-09-11 19:51:29 +03001718 {
1719 assert(PyErr_Occurred());
1720 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1721 PyErr_Format(PyExc_OverflowError,
1722 "%s(): port must be 0-65535.", caller);
1723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001727 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001729 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 if (result < 0)
1731 return 0;
1732 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001733 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001735 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 return 0;
1737 }
1738 addr->sin_family = AF_INET;
1739 addr->sin_port = htons((short)port);
1740 *len_ret = sizeof *addr;
1741 return 1;
1742 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001743
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001744#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 case AF_INET6:
1746 {
1747 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001748 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001749 int port, result;
1750 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 flowinfo = scope_id = 0;
1752 if (!PyTuple_Check(args)) {
1753 PyErr_Format(
1754 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001755 "%s(): AF_INET6 address must be tuple, not %.500s",
1756 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 return 0;
1758 }
Oren Milman735171e2018-09-11 19:51:29 +03001759 if (!PyArg_ParseTuple(args,
1760 "O&i|II;AF_INET6 address must be a tuple "
1761 "(host, port[, flowinfo[, scopeid]])",
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001762 idna_converter, &host, &port, &flowinfo,
Oren Milman735171e2018-09-11 19:51:29 +03001763 &scope_id))
1764 {
1765 assert(PyErr_Occurred());
1766 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1767 PyErr_Format(PyExc_OverflowError,
1768 "%s(): port must be 0-65535.", caller);
1769 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return 0;
1771 }
1772 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001773 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001775 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 if (result < 0)
1777 return 0;
1778 if (port < 0 || port > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001779 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001781 "%s(): port must be 0-65535.", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 return 0;
1783 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001784 if (flowinfo > 0xfffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001785 PyErr_Format(
Charles-François Natali366999a2012-01-02 15:47:29 +01001786 PyExc_OverflowError,
Oren Milman735171e2018-09-11 19:51:29 +03001787 "%s(): flowinfo must be 0-1048575.", caller);
Charles-François Natali366999a2012-01-02 15:47:29 +01001788 return 0;
1789 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 addr->sin6_family = s->sock_family;
1791 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001792 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 addr->sin6_scope_id = scope_id;
1794 *len_ret = sizeof *addr;
1795 return 1;
1796 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001797#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001798
Hye-Shik Chang81268602004-02-02 06:05:24 +00001799#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 case AF_BLUETOOTH:
1801 {
1802 switch (s->sock_proto) {
1803 case BTPROTO_L2CAP:
1804 {
1805 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001806 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 addr = (struct sockaddr_l2 *)addr_ret;
1809 memset(addr, 0, sizeof(struct sockaddr_l2));
1810 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1811 if (!PyArg_ParseTuple(args, "si", &straddr,
1812 &_BT_L2_MEMB(addr, psm))) {
Oren Milman735171e2018-09-11 19:51:29 +03001813 PyErr_Format(PyExc_OSError,
1814 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 return 0;
1816 }
1817 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1818 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 *len_ret = sizeof *addr;
1821 return 1;
1822 }
1823 case BTPROTO_RFCOMM:
1824 {
1825 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001826 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 addr = (struct sockaddr_rc *)addr_ret;
1829 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1830 if (!PyArg_ParseTuple(args, "si", &straddr,
1831 &_BT_RC_MEMB(addr, channel))) {
Oren Milman735171e2018-09-11 19:51:29 +03001832 PyErr_Format(PyExc_OSError,
1833 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 return 0;
1835 }
1836 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1837 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 *len_ret = sizeof *addr;
1840 return 1;
1841 }
1842 case BTPROTO_HCI:
1843 {
1844 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001845#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001846 const char *straddr;
1847 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1848 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001849 PyErr_Format(PyExc_OSError, "%s: "
1850 "wrong format", caller);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001851 return 0;
1852 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001853 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001854 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1855 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001856#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1858 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Oren Milman735171e2018-09-11 19:51:29 +03001859 PyErr_Format(PyExc_OSError,
1860 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 return 0;
1862 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001863#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 *len_ret = sizeof *addr;
1865 return 1;
1866 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001867#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 case BTPROTO_SCO:
1869 {
1870 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001871 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 addr = (struct sockaddr_sco *)addr_ret;
1874 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1875 if (!PyBytes_Check(args)) {
Oren Milman735171e2018-09-11 19:51:29 +03001876 PyErr_Format(PyExc_OSError,
1877 "%s(): wrong format", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 return 0;
1879 }
1880 straddr = PyBytes_AS_STRING(args);
1881 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1882 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 *len_ret = sizeof *addr;
1885 return 1;
1886 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001887#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 default:
Oren Milman735171e2018-09-11 19:51:29 +03001889 PyErr_Format(PyExc_OSError,
1890 "%s(): unknown Bluetooth protocol", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 return 0;
1892 }
1893 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001894#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001895
Antoine Pitroub156a462010-10-27 20:13:57 +00001896#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 case AF_PACKET:
1898 {
1899 struct sockaddr_ll* addr;
1900 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001901 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 int protoNumber;
1903 int hatype = 0;
Cheryl Sabella731ff682018-09-11 20:32:15 -04001904 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001905 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 if (!PyTuple_Check(args)) {
1908 PyErr_Format(
1909 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001910 "%s(): AF_PACKET address must be tuple, not %.500s",
1911 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 return 0;
1913 }
Oren Milman735171e2018-09-11 19:51:29 +03001914 /* XXX: improve the default error message according to the
1915 documentation of AF_PACKET, which would be added as part
1916 of bpo-25041. */
1917 if (!PyArg_ParseTuple(args,
1918 "si|iiy*;AF_PACKET address must be a tuple of "
1919 "two to five elements",
1920 &interfaceName, &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001921 &haddr))
Oren Milman735171e2018-09-11 19:51:29 +03001922 {
1923 assert(PyErr_Occurred());
1924 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1925 PyErr_Format(PyExc_OverflowError,
1926 "%s(): address argument out of range", caller);
1927 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001929 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1931 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1932 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1933 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001934 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 return 0;
1936 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001937 if (haddr.buf && haddr.len > 8) {
1938 PyErr_SetString(PyExc_ValueError,
1939 "Hardware address must be 8 bytes or less");
1940 PyBuffer_Release(&haddr);
1941 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 }
1943 if (protoNumber < 0 || protoNumber > 0xffff) {
Oren Milman735171e2018-09-11 19:51:29 +03001944 PyErr_Format(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 PyExc_OverflowError,
Cheryl Sabella731ff682018-09-11 20:32:15 -04001946 "%s(): proto must be 0-65535.", caller);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001947 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return 0;
1949 }
1950 addr = (struct sockaddr_ll*)addr_ret;
1951 addr->sll_family = AF_PACKET;
1952 addr->sll_protocol = htons((short)protoNumber);
1953 addr->sll_ifindex = ifr.ifr_ifindex;
1954 addr->sll_pkttype = pkttype;
1955 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001956 if (haddr.buf) {
1957 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1958 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001960 else
1961 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001963 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 return 1;
1965 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001966#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001967
Christian Heimes043d6f62008-01-07 17:19:16 +00001968#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 case AF_TIPC:
1970 {
1971 unsigned int atype, v1, v2, v3;
1972 unsigned int scope = TIPC_CLUSTER_SCOPE;
1973 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (!PyTuple_Check(args)) {
1976 PyErr_Format(
1977 PyExc_TypeError,
Oren Milman735171e2018-09-11 19:51:29 +03001978 "%s(): AF_TIPC address must be tuple, not %.500s",
1979 caller, Py_TYPE(args)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 return 0;
1981 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 if (!PyArg_ParseTuple(args,
Oren Milman735171e2018-09-11 19:51:29 +03001984 "IIII|I;AF_TIPC address must be a tuple "
1985 "(addr_type, v1, v2, v3[, scope])",
1986 &atype, &v1, &v2, &v3, &scope))
1987 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03001989 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 addr = (struct sockaddr_tipc *) addr_ret;
1992 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 addr->family = AF_TIPC;
1995 addr->scope = scope;
1996 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 if (atype == TIPC_ADDR_NAMESEQ) {
1999 addr->addr.nameseq.type = v1;
2000 addr->addr.nameseq.lower = v2;
2001 addr->addr.nameseq.upper = v3;
2002 } else if (atype == TIPC_ADDR_NAME) {
2003 addr->addr.name.name.type = v1;
2004 addr->addr.name.name.instance = v2;
2005 } else if (atype == TIPC_ADDR_ID) {
2006 addr->addr.id.node = v1;
2007 addr->addr.id.ref = v2;
2008 } else {
2009 /* Shouldn't happen */
2010 PyErr_SetString(PyExc_TypeError, "Invalid address type");
2011 return 0;
2012 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 return 1;
2017 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002018#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002019
Serhiy Storchakad3187152017-11-09 18:00:38 +02002020#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02002021 case AF_CAN:
2022 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02002023#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02002024 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01002025 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002026#endif
2027#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01002028 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02002029#endif
2030#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02002031 {
2032 struct sockaddr_can *addr;
2033 PyObject *interfaceName;
2034 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002035 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002036 addr = (struct sockaddr_can *)addr_ret;
2037
Oren Milman735171e2018-09-11 19:51:29 +03002038 if (!PyTuple_Check(args)) {
2039 PyErr_Format(PyExc_TypeError,
2040 "%s(): AF_CAN address must be tuple, not %.500s",
2041 caller, Py_TYPE(args)->tp_name);
Charles-François Natali47413c12011-10-06 19:47:44 +02002042 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002043 }
2044 if (!PyArg_ParseTuple(args,
2045 "O&;AF_CAN address must be a tuple "
2046 "(interface, )",
2047 PyUnicode_FSConverter, &interfaceName))
2048 {
2049 return 0;
2050 }
Charles-François Natali47413c12011-10-06 19:47:44 +02002051
2052 len = PyBytes_GET_SIZE(interfaceName);
2053
2054 if (len == 0) {
2055 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002056 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002057 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2058 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002059 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2060 s->errorhandler();
2061 Py_DECREF(interfaceName);
2062 return 0;
2063 }
2064 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002065 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002066 "AF_CAN interface name too long");
2067 Py_DECREF(interfaceName);
2068 return 0;
2069 }
2070
2071 addr->can_family = AF_CAN;
2072 addr->can_ifindex = ifr.ifr_ifindex;
2073
2074 *len_ret = sizeof(*addr);
2075 Py_DECREF(interfaceName);
2076 return 1;
2077 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002078#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002079
2080#ifdef CAN_ISOTP
2081 case CAN_ISOTP:
2082 {
2083 struct sockaddr_can *addr;
2084 PyObject *interfaceName;
2085 struct ifreq ifr;
2086 Py_ssize_t len;
2087 unsigned long int rx_id, tx_id;
2088
2089 addr = (struct sockaddr_can *)addr_ret;
2090
2091 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2092 &interfaceName,
2093 &rx_id,
2094 &tx_id))
2095 return 0;
2096
2097 len = PyBytes_GET_SIZE(interfaceName);
2098
2099 if (len == 0) {
2100 ifr.ifr_ifindex = 0;
2101 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2102 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2103 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2104 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2105 s->errorhandler();
2106 Py_DECREF(interfaceName);
2107 return 0;
2108 }
2109 } else {
2110 PyErr_SetString(PyExc_OSError,
2111 "AF_CAN interface name too long");
2112 Py_DECREF(interfaceName);
2113 return 0;
2114 }
2115
2116 addr->can_family = AF_CAN;
2117 addr->can_ifindex = ifr.ifr_ifindex;
2118 addr->can_addr.tp.rx_id = rx_id;
2119 addr->can_addr.tp.tx_id = tx_id;
2120
2121 *len_ret = sizeof(*addr);
2122 Py_DECREF(interfaceName);
2123 return 1;
2124 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002125#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002126 default:
Oren Milman735171e2018-09-11 19:51:29 +03002127 PyErr_Format(PyExc_OSError,
2128 "%s(): unsupported CAN protocol", caller);
Charles-François Natali47413c12011-10-06 19:47:44 +02002129 return 0;
2130 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002131#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002132
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002133#ifdef PF_SYSTEM
2134 case PF_SYSTEM:
2135 switch (s->sock_proto) {
2136#ifdef SYSPROTO_CONTROL
2137 case SYSPROTO_CONTROL:
2138 {
2139 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002140
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002141 addr = (struct sockaddr_ctl *)addr_ret;
2142 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002143 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002144
2145 if (PyUnicode_Check(args)) {
2146 struct ctl_info info;
2147 PyObject *ctl_name;
2148
2149 if (!PyArg_Parse(args, "O&",
2150 PyUnicode_FSConverter, &ctl_name)) {
2151 return 0;
2152 }
2153
Victor Stinnerf50e1872015-03-20 11:32:24 +01002154 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002155 PyErr_SetString(PyExc_ValueError,
2156 "provided string is too long");
2157 Py_DECREF(ctl_name);
2158 return 0;
2159 }
2160 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2161 sizeof(info.ctl_name));
2162 Py_DECREF(ctl_name);
2163
2164 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2165 PyErr_SetString(PyExc_OSError,
2166 "cannot find kernel control with provided name");
2167 return 0;
2168 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002169
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002170 addr->sc_id = info.ctl_id;
2171 addr->sc_unit = 0;
2172 } else if (!PyArg_ParseTuple(args, "II",
2173 &(addr->sc_id), &(addr->sc_unit))) {
Oren Milman735171e2018-09-11 19:51:29 +03002174 PyErr_Format(PyExc_TypeError,
2175 "%s(): PF_SYSTEM address must be a str or "
2176 "a pair (id, unit)", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002177 return 0;
2178 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002179
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002180 *len_ret = sizeof(*addr);
2181 return 1;
2182 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002183#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002184 default:
Oren Milman735171e2018-09-11 19:51:29 +03002185 PyErr_Format(PyExc_OSError,
2186 "%s(): unsupported PF_SYSTEM protocol", caller);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002187 return 0;
2188 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002189#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002190#ifdef HAVE_SOCKADDR_ALG
2191 case AF_ALG:
2192 {
2193 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002194 const char *type;
2195 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002196 sa = (struct sockaddr_alg *)addr_ret;
2197
2198 memset(sa, 0, sizeof(*sa));
2199 sa->salg_family = AF_ALG;
2200
Oren Milman735171e2018-09-11 19:51:29 +03002201 if (!PyTuple_Check(args)) {
2202 PyErr_Format(PyExc_TypeError,
2203 "%s(): AF_ALG address must be tuple, not %.500s",
2204 caller, Py_TYPE(args)->tp_name);
Christian Heimesdffa3942016-09-05 23:54:41 +02002205 return 0;
Oren Milman735171e2018-09-11 19:51:29 +03002206 }
2207 if (!PyArg_ParseTuple(args,
2208 "ss|HH;AF_ALG address must be a tuple "
2209 "(type, name[, feat[, mask]])",
2210 &type, &name, &sa->salg_feat, &sa->salg_mask))
2211 {
2212 return 0;
2213 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002214 /* sockaddr_alg has fixed-sized char arrays for type and name */
2215 if (strlen(type) > sizeof(sa->salg_type)) {
2216 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2217 return 0;
2218 }
2219 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2220 if (strlen(name) > sizeof(sa->salg_name)) {
2221 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2222 return 0;
2223 }
2224 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2225
2226 *len_ret = sizeof(*sa);
2227 return 1;
2228 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002229#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 default:
Oren Milman735171e2018-09-11 19:51:29 +03002234 PyErr_Format(PyExc_OSError, "%s(): bad family", caller);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002238}
2239
Guido van Rossum30a685f1991-06-27 15:51:29 +00002240
Guido van Rossum48a680c2001-03-02 06:34:14 +00002241/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002242 Return 1 if the family is known, 0 otherwise. The length is returned
2243 through len_ret. */
2244
2245static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002246getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002249
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002250#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 case AF_UNIX:
2252 {
2253 *len_ret = sizeof (struct sockaddr_un);
2254 return 1;
2255 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002256#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002257
Martin v. Löwis11017b12006-01-14 18:12:57 +00002258#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002259 case AF_NETLINK:
2260 {
2261 *len_ret = sizeof (struct sockaddr_nl);
2262 return 1;
2263 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002264#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002265
caaveryeffc12f2017-09-06 18:18:10 -04002266#if defined(AF_VSOCK)
2267 case AF_VSOCK:
2268 {
2269 *len_ret = sizeof (struct sockaddr_vm);
2270 return 1;
2271 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002272#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002273
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002274#ifdef AF_RDS
2275 case AF_RDS:
2276 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002277#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 case AF_INET:
2280 {
2281 *len_ret = sizeof (struct sockaddr_in);
2282 return 1;
2283 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002284
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002285#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 case AF_INET6:
2287 {
2288 *len_ret = sizeof (struct sockaddr_in6);
2289 return 1;
2290 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002291#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002292
Hye-Shik Chang81268602004-02-02 06:05:24 +00002293#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 case AF_BLUETOOTH:
2295 {
2296 switch(s->sock_proto)
2297 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 case BTPROTO_L2CAP:
2300 *len_ret = sizeof (struct sockaddr_l2);
2301 return 1;
2302 case BTPROTO_RFCOMM:
2303 *len_ret = sizeof (struct sockaddr_rc);
2304 return 1;
2305 case BTPROTO_HCI:
2306 *len_ret = sizeof (struct sockaddr_hci);
2307 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002308#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 case BTPROTO_SCO:
2310 *len_ret = sizeof (struct sockaddr_sco);
2311 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002312#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002314 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 "unknown BT protocol");
2316 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 }
2319 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002320#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002321
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002322#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 case AF_PACKET:
2324 {
2325 *len_ret = sizeof (struct sockaddr_ll);
2326 return 1;
2327 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002328#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002329
Christian Heimes043d6f62008-01-07 17:19:16 +00002330#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 case AF_TIPC:
2332 {
2333 *len_ret = sizeof (struct sockaddr_tipc);
2334 return 1;
2335 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002336#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002337
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002338#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002339 case AF_CAN:
2340 {
2341 *len_ret = sizeof (struct sockaddr_can);
2342 return 1;
2343 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002344#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002345
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002346#ifdef PF_SYSTEM
2347 case PF_SYSTEM:
2348 switch(s->sock_proto) {
2349#ifdef SYSPROTO_CONTROL
2350 case SYSPROTO_CONTROL:
2351 *len_ret = sizeof (struct sockaddr_ctl);
2352 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002353#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002354 default:
2355 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2356 "unknown PF_SYSTEM protocol");
2357 return 0;
2358 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002359#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002360#ifdef HAVE_SOCKADDR_ALG
2361 case AF_ALG:
2362 {
2363 *len_ret = sizeof (struct sockaddr_alg);
2364 return 1;
2365 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002366#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002371 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002375}
2376
2377
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002378/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2379 Currently, these methods are only compiled if the RFC 2292/3542
2380 CMSG_LEN() macro is available. Older systems seem to have used
2381 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2382 it may be possible to define CMSG_LEN() that way if it's not
2383 provided. Some architectures might need extra padding after the
2384 cmsghdr, however, and CMSG_LEN() would have to take account of
2385 this. */
2386#ifdef CMSG_LEN
2387/* If length is in range, set *result to CMSG_LEN(length) and return
2388 true; otherwise, return false. */
2389static int
2390get_CMSG_LEN(size_t length, size_t *result)
2391{
2392 size_t tmp;
2393
2394 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2395 return 0;
2396 tmp = CMSG_LEN(length);
2397 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2398 return 0;
2399 *result = tmp;
2400 return 1;
2401}
2402
2403#ifdef CMSG_SPACE
2404/* If length is in range, set *result to CMSG_SPACE(length) and return
2405 true; otherwise, return false. */
2406static int
2407get_CMSG_SPACE(size_t length, size_t *result)
2408{
2409 size_t tmp;
2410
2411 /* Use CMSG_SPACE(1) here in order to take account of the padding
2412 necessary before *and* after the data. */
2413 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2414 return 0;
2415 tmp = CMSG_SPACE(length);
2416 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2417 return 0;
2418 *result = tmp;
2419 return 1;
2420}
2421#endif
2422
2423/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2424 pointer in msg->msg_control with at least "space" bytes after it,
2425 and its cmsg_len member inside the buffer. */
2426static int
2427cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2428{
2429 size_t cmsg_offset;
2430 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2431 sizeof(cmsgh->cmsg_len));
2432
Charles-François Natali466517d2011-08-28 18:23:43 +02002433 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002434 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002435 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002436 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2437 annoying under OS X as it's unsigned there and so it triggers a
2438 tautological comparison warning under Clang when compared against 0.
2439 Since the check is valid on other platforms, silence the warning under
2440 Clang. */
2441 #ifdef __clang__
2442 #pragma clang diagnostic push
2443 #pragma clang diagnostic ignored "-Wtautological-compare"
2444 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002445 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002446 #pragma GCC diagnostic push
2447 #pragma GCC diagnostic ignored "-Wtype-limits"
2448 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002449 if (msg->msg_controllen < 0)
2450 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002451 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002452 #pragma GCC diagnostic pop
2453 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002454 #ifdef __clang__
2455 #pragma clang diagnostic pop
2456 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002457 if (space < cmsg_len_end)
2458 space = cmsg_len_end;
2459 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2460 return (cmsg_offset <= (size_t)-1 - space &&
2461 cmsg_offset + space <= msg->msg_controllen);
2462}
2463
2464/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2465 *space to number of bytes following it in the buffer and return
2466 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2467 msg->msg_controllen are valid. */
2468static int
2469get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2470{
2471 size_t data_offset;
2472 char *data_ptr;
2473
2474 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2475 return 0;
2476 data_offset = data_ptr - (char *)msg->msg_control;
2477 if (data_offset > msg->msg_controllen)
2478 return 0;
2479 *space = msg->msg_controllen - data_offset;
2480 return 1;
2481}
2482
2483/* If cmsgh is invalid or not contained in the buffer pointed to by
2484 msg->msg_control, return -1. If cmsgh is valid and its associated
2485 data is entirely contained in the buffer, set *data_len to the
2486 length of the associated data and return 0. If only part of the
2487 associated data is contained in the buffer but cmsgh is otherwise
2488 valid, set *data_len to the length contained in the buffer and
2489 return 1. */
2490static int
2491get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2492{
2493 size_t space, cmsg_data_len;
2494
2495 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2496 cmsgh->cmsg_len < CMSG_LEN(0))
2497 return -1;
2498 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2499 if (!get_cmsg_data_space(msg, cmsgh, &space))
2500 return -1;
2501 if (space >= cmsg_data_len) {
2502 *data_len = cmsg_data_len;
2503 return 0;
2504 }
2505 *data_len = space;
2506 return 1;
2507}
2508#endif /* CMSG_LEN */
2509
2510
Victor Stinner31bf2d52015-04-01 21:57:09 +02002511struct sock_accept {
2512 socklen_t *addrlen;
2513 sock_addr_t *addrbuf;
2514 SOCKET_T result;
2515};
2516
2517#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2518/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2519static int accept4_works = -1;
2520#endif
2521
2522static int
2523sock_accept_impl(PySocketSockObject *s, void *data)
2524{
2525 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002526 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2527 socklen_t *paddrlen = ctx->addrlen;
2528#ifdef HAVE_SOCKADDR_ALG
2529 /* AF_ALG does not support accept() with addr and raises
2530 * ECONNABORTED instead. */
2531 if (s->sock_family == AF_ALG) {
2532 addr = NULL;
2533 paddrlen = NULL;
2534 *ctx->addrlen = 0;
2535 }
2536#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002537
2538#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2539 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002540 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002541 SOCK_CLOEXEC);
2542 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2543 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2544 accept4_works = (errno != ENOSYS);
2545 }
2546 }
2547 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002548 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002549#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002550 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002551#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002552
2553#ifdef MS_WINDOWS
2554 return (ctx->result != INVALID_SOCKET);
2555#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002556 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002557#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002558}
2559
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002560/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002561
Guido van Rossum73624e91994-10-10 17:59:00 +00002562static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302563sock_accept(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002566 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 socklen_t addrlen;
2568 PyObject *sock = NULL;
2569 PyObject *addr = NULL;
2570 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002571 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 if (!getsockaddrlen(s, &addrlen))
2574 return NULL;
2575 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 if (!IS_SELECTABLE(s))
2578 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002579
Victor Stinner31bf2d52015-04-01 21:57:09 +02002580 ctx.addrlen = &addrlen;
2581 ctx.addrbuf = &addrbuf;
2582 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002584 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002585
Victor Stinnerdaf45552013-08-28 00:53:59 +02002586#ifdef MS_WINDOWS
2587 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2588 PyErr_SetFromWindowsErr(0);
2589 SOCKETCLOSE(newfd);
2590 goto finally;
2591 }
2592#else
2593
2594#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2595 if (!accept4_works)
2596#endif
2597 {
2598 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2599 SOCKETCLOSE(newfd);
2600 goto finally;
2601 }
2602 }
2603#endif
2604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 sock = PyLong_FromSocket_t(newfd);
2606 if (sock == NULL) {
2607 SOCKETCLOSE(newfd);
2608 goto finally;
2609 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2612 addrlen, s->sock_proto);
2613 if (addr == NULL)
2614 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002617
Guido van Rossum67f7a382002-06-06 21:08:16 +00002618finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 Py_XDECREF(sock);
2620 Py_XDECREF(addr);
2621 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002622}
2623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002624PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002625"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002626\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002627Wait for an incoming connection. Return a new socket file descriptor\n\
2628representing the connection, and the address of the client.\n\
2629For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002630
Guido van Rossum11ba0942002-06-13 15:07:44 +00002631/* s.setblocking(flag) method. Argument:
2632 False -- non-blocking mode; same as settimeout(0)
2633 True -- blocking mode; same as settimeout(None)
2634*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002635
Guido van Rossum73624e91994-10-10 17:59:00 +00002636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002637sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002638{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002639 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 block = PyLong_AsLong(arg);
2642 if (block == -1 && PyErr_Occurred())
2643 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002644
Victor Stinner9001d802015-04-06 23:06:01 +02002645 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002646 if (internal_setblocking(s, block) == -1) {
2647 return NULL;
2648 }
2649 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002650}
Guido van Rossume4485b01994-09-07 14:32:49 +00002651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002652PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002653"setblocking(flag)\n\
2654\n\
2655Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002656setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002657setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002658
Yury Selivanovf11b4602018-01-28 17:27:38 -05002659/* s.getblocking() method.
2660 Returns True if socket is in blocking mode,
2661 False if it is in non-blocking mode.
2662*/
2663static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302664sock_getblocking(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Yury Selivanovf11b4602018-01-28 17:27:38 -05002665{
2666 if (s->sock_timeout) {
2667 Py_RETURN_TRUE;
2668 }
2669 else {
2670 Py_RETURN_FALSE;
2671 }
2672}
2673
2674PyDoc_STRVAR(getblocking_doc,
2675"getblocking()\n\
2676\n\
2677Returns True if socket is in blocking mode, or False if it\n\
2678is in non-blocking mode.");
2679
Victor Stinner71694d52015-03-28 01:18:54 +01002680static int
2681socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2682{
2683#ifdef MS_WINDOWS
2684 struct timeval tv;
2685#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002686#ifndef HAVE_POLL
2687 _PyTime_t ms;
2688#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002689 int overflow = 0;
2690
2691 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002692 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002693 return 0;
2694 }
2695
Victor Stinner869e1772015-03-30 03:49:14 +02002696 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002697 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002698 return -1;
2699
2700 if (*timeout < 0) {
2701 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2702 return -1;
2703 }
2704
2705#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002706 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002707#endif
2708#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002709 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002710 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002711#endif
2712 if (overflow) {
2713 PyErr_SetString(PyExc_OverflowError,
2714 "timeout doesn't fit into C timeval");
2715 return -1;
2716 }
2717
2718 return 0;
2719}
2720
Guido van Rossum11ba0942002-06-13 15:07:44 +00002721/* s.settimeout(timeout) method. Argument:
2722 None -- no timeout, blocking mode; same as setblocking(True)
2723 0.0 -- non-blocking mode; same as setblocking(False)
2724 > 0 -- timeout mode; operations time out after timeout seconds
2725 < 0 -- illegal; raises an exception
2726*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002727static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002728sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729{
Victor Stinner71694d52015-03-28 01:18:54 +01002730 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002731
Victor Stinner71694d52015-03-28 01:18:54 +01002732 if (socket_parse_timeout(&timeout, arg) < 0)
2733 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002736
2737 int block = timeout < 0;
2738 /* Blocking mode for a Python socket object means that operations
2739 like :meth:`recv` or :meth:`sendall` will block the execution of
2740 the current thread until they are complete or aborted with a
2741 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2742 the underlying FD is in a blocking mode. When timeout is a positive
2743 number, the FD is in a non-blocking mode, and socket ops are
2744 implemented with a `select()` call.
2745
2746 When timeout is 0.0, the FD is in a non-blocking mode.
2747
2748 This table summarizes all states in which the socket object and
2749 its underlying FD can be:
2750
2751 ==================== ===================== ==============
2752 `gettimeout()` `getblocking()` FD
2753 ==================== ===================== ==============
2754 ``None`` ``True`` blocking
2755 ``0.0`` ``False`` non-blocking
2756 ``> 0`` ``True`` non-blocking
2757 */
2758
2759 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002760 return NULL;
2761 }
2762 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002763}
2764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002765PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002766"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002767\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002768Set a timeout on socket operations. 'timeout' can be a float,\n\
2769giving in seconds, or None. Setting a timeout of None disables\n\
2770the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002771Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002772
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002773/* s.gettimeout() method.
2774 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002775static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302776sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum67f7a382002-06-06 21:08:16 +00002777{
Victor Stinner71694d52015-03-28 01:18:54 +01002778 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002779 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 }
Victor Stinner71694d52015-03-28 01:18:54 +01002781 else {
2782 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2783 return PyFloat_FromDouble(seconds);
2784 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002785}
2786
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002787PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002788"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002789\n\
oldkaa0735f2018-02-02 16:52:55 +08002790Returns the timeout in seconds (float) associated with socket\n\
2791operations. A timeout of None indicates that timeouts on socket\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002792operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002793
Guido van Rossumaee08791992-09-08 09:05:33 +00002794/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002795 With an integer third argument, sets an integer optval with optlen=4.
2796 With None as third argument and an integer fourth argument, set
2797 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002798 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002799 use optional built-in module 'struct' to encode the string.
2800*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002801
Guido van Rossum73624e91994-10-10 17:59:00 +00002802static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002803sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 int level;
2806 int optname;
2807 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002808 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002810 unsigned int optlen;
2811 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002812
caaveryeffc12f2017-09-06 18:18:10 -04002813#ifdef AF_VSOCK
2814 if (s->sock_family == AF_VSOCK) {
2815 uint64_t vflag; // Must be set width of 64 bits
2816 /* setsockopt(level, opt, flag) */
2817 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2818 &level, &optname, &vflag)) {
2819 // level should always be set to AF_VSOCK
2820 res = setsockopt(s->sock_fd, level, optname,
2821 (void*)&vflag, sizeof vflag);
2822 goto done;
2823 }
2824 return NULL;
2825 }
2826#endif
2827
Christian Heimesdffa3942016-09-05 23:54:41 +02002828 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 if (PyArg_ParseTuple(args, "iii:setsockopt",
2830 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002831 res = setsockopt(s->sock_fd, level, optname,
2832 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002833 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002835
2836 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002837 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002838 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2839 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2840 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002841 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002842 NULL, (socklen_t)optlen);
2843 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002845
2846 PyErr_Clear();
2847 /* setsockopt(level, opt, buffer) */
2848 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2849 &level, &optname, &optval))
2850 return NULL;
2851
2852#ifdef MS_WINDOWS
2853 if (optval.len > INT_MAX) {
2854 PyBuffer_Release(&optval);
2855 PyErr_Format(PyExc_OverflowError,
2856 "socket option is larger than %i bytes",
2857 INT_MAX);
2858 return NULL;
2859 }
2860 res = setsockopt(s->sock_fd, level, optname,
2861 optval.buf, (int)optval.len);
2862#else
2863 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2864#endif
2865 PyBuffer_Release(&optval);
2866
2867done:
Victor Stinnercc739322016-03-23 21:35:29 +01002868 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002870 }
2871
2872 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002873}
2874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002875PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002876"setsockopt(level, option, value: int)\n\
2877setsockopt(level, option, value: buffer)\n\
2878setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002879\n\
2880Set a socket option. See the Unix manual for level and option.\n\
oldkaa0735f2018-02-02 16:52:55 +08002881The value argument can either be an integer, a string buffer, or\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002882None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002883
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002884
Guido van Rossumaee08791992-09-08 09:05:33 +00002885/* s.getsockopt() method.
2886 With two arguments, retrieves an integer option.
2887 With a third integer argument, retrieves a string buffer of that size;
2888 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002889
Guido van Rossum73624e91994-10-10 17:59:00 +00002890static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002891sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 int level;
2894 int optname;
2895 int res;
2896 PyObject *buf;
2897 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002898 int flag = 0;
2899 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2902 &level, &optname, &buflen))
2903 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002906#ifdef AF_VSOCK
2907 if (s->sock_family == AF_VSOCK) {
2908 uint64_t vflag = 0; // Must be set width of 64 bits
2909 flagsize = sizeof vflag;
2910 res = getsockopt(s->sock_fd, level, optname,
2911 (void *)&vflag, &flagsize);
2912 if (res < 0)
2913 return s->errorhandler();
2914 return PyLong_FromUnsignedLong(vflag);
2915 }
2916#endif
2917 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 res = getsockopt(s->sock_fd, level, optname,
2919 (void *)&flag, &flagsize);
2920 if (res < 0)
2921 return s->errorhandler();
2922 return PyLong_FromLong(flag);
2923 }
caaveryeffc12f2017-09-06 18:18:10 -04002924#ifdef AF_VSOCK
2925 if (s->sock_family == AF_VSOCK) {
2926 PyErr_SetString(PyExc_OSError,
2927 "getsockopt string buffer not allowed");
2928 return NULL;
2929 }
2930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002932 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 "getsockopt buflen out of range");
2934 return NULL;
2935 }
2936 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2937 if (buf == NULL)
2938 return NULL;
2939 res = getsockopt(s->sock_fd, level, optname,
2940 (void *)PyBytes_AS_STRING(buf), &buflen);
2941 if (res < 0) {
2942 Py_DECREF(buf);
2943 return s->errorhandler();
2944 }
2945 _PyBytes_Resize(&buf, buflen);
2946 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002947}
2948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002949PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002950"getsockopt(level, option[, buffersize]) -> value\n\
2951\n\
2952Get a socket option. See the Unix manual for level and option.\n\
2953If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002954string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002955
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002956
Fred Drake728819a2000-07-01 03:40:12 +00002957/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002958
Guido van Rossum73624e91994-10-10 17:59:00 +00002959static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002960sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 sock_addr_t addrbuf;
2963 int addrlen;
2964 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002965
Oren Milman735171e2018-09-11 19:51:29 +03002966 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03002968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 Py_BEGIN_ALLOW_THREADS
2970 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2971 Py_END_ALLOW_THREADS
2972 if (res < 0)
2973 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002974 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002975}
2976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002977PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002978"bind(address)\n\
2979\n\
2980Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002981pair (host, port); the host must refer to the local host. For raw packet\n\
Cheryl Sabella731ff682018-09-11 20:32:15 -04002982sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002983
Guido van Rossum30a685f1991-06-27 15:51:29 +00002984
2985/* s.close() method.
2986 Set the file descriptor to -1 so operations tried subsequently
2987 will surely fail. */
2988
Guido van Rossum73624e91994-10-10 17:59:00 +00002989static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302990sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002993 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002994
Victor Stinner19a8e842016-03-21 16:36:48 +01002995 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002996 if (fd != INVALID_SOCKET) {
2997 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002998
2999 /* We do not want to retry upon EINTR: see
3000 http://lwn.net/Articles/576478/ and
3001 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
3002 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003003 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00003004 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02003006 /* bpo-30319: The peer can already have closed the connection.
3007 Python ignores ECONNRESET on close(). */
3008 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00003009 return s->errorhandler();
3010 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003012 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003013}
3014
Christian Heimesd0e31b92018-01-27 09:54:13 +01003015PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003016"close()\n\
3017\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003019
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003020static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303021sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003022{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003023 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02003024 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003025 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003026}
3027
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003028PyDoc_STRVAR(detach_doc,
3029"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003030\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08003031Close the socket object without closing the underlying file descriptor.\n\
3032The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003033can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00003034
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003035static int
Victor Stinner81c41db2015-04-02 11:50:57 +02003036sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003037{
Victor Stinner81c41db2015-04-02 11:50:57 +02003038 int err;
3039 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02003040
Victor Stinner81c41db2015-04-02 11:50:57 +02003041 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
3042 /* getsockopt() failed */
3043 return 0;
3044 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003045
Victor Stinner81c41db2015-04-02 11:50:57 +02003046 if (err == EISCONN)
3047 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02003048 if (err != 0) {
3049 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3050 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003051 return 0;
3052 }
3053 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003054}
3055
3056static int
3057internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3058 int raise)
3059{
3060 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003061
3062 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003064 Py_END_ALLOW_THREADS
3065
Victor Stinner70a46f62015-03-31 22:03:59 +02003066 if (!res) {
3067 /* connect() succeeded, the socket is connected */
3068 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003070
Victor Stinner81c41db2015-04-02 11:50:57 +02003071 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003072
Victor Stinner81c41db2015-04-02 11:50:57 +02003073 /* save error, PyErr_CheckSignals() can replace it */
3074 err = GET_SOCK_ERROR;
3075 if (CHECK_ERRNO(EINTR)) {
3076 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003077 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003078
3079 /* Issue #23618: when connect() fails with EINTR, the connection is
3080 running asynchronously.
3081
3082 If the socket is blocking or has a timeout, wait until the
3083 connection completes, fails or timed out using select(), and then
3084 get the connection status using getsockopt(SO_ERROR).
3085
3086 If the socket is non-blocking, raise InterruptedError. The caller is
3087 responsible to wait until the connection completes, fails or timed
3088 out (it's the case in asyncio for example). */
3089 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3090 }
3091 else {
3092 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3093 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003094 }
3095
Victor Stinner81c41db2015-04-02 11:50:57 +02003096 if (!wait_connect) {
3097 if (raise) {
3098 /* restore error, maybe replaced by PyErr_CheckSignals() */
3099 SET_SOCK_ERROR(err);
3100 s->errorhandler();
3101 return -1;
3102 }
3103 else
3104 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003105 }
3106
Victor Stinner81c41db2015-04-02 11:50:57 +02003107 if (raise) {
3108 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003109 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3110 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003111 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003112 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003113 else {
3114 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003115 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3116 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003117 return err;
3118 }
3119 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003120}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003121
Fred Drake728819a2000-07-01 03:40:12 +00003122/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003123
Guido van Rossum73624e91994-10-10 17:59:00 +00003124static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003125sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 sock_addr_t addrbuf;
3128 int addrlen;
3129 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003130
Oren Milman735171e2018-09-11 19:51:29 +03003131 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003133 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003134
Victor Stinner81c41db2015-04-02 11:50:57 +02003135 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003136 if (res < 0)
3137 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003138
Victor Stinneree699e92015-03-31 21:28:42 +02003139 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003140}
3141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003142PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003143"connect(address)\n\
3144\n\
3145Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003146is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003147
Guido van Rossum30a685f1991-06-27 15:51:29 +00003148
Fred Drake728819a2000-07-01 03:40:12 +00003149/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003150
3151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003152sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 sock_addr_t addrbuf;
3155 int addrlen;
3156 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003157
Oren Milman735171e2018-09-11 19:51:29 +03003158 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 return NULL;
Oren Milman735171e2018-09-11 19:51:29 +03003160 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003161
Victor Stinner81c41db2015-04-02 11:50:57 +02003162 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003163 if (res < 0)
3164 return NULL;
3165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003167}
3168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003169PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003170"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003171\n\
3172This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003173instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003174
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003175
Guido van Rossumed233a51992-06-23 09:07:03 +00003176/* s.fileno() method */
3177
Guido van Rossum73624e91994-10-10 17:59:00 +00003178static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303179sock_fileno(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumed233a51992-06-23 09:07:03 +00003180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003182}
3183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003184PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003185"fileno() -> integer\n\
3186\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003187Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003188
Guido van Rossumed233a51992-06-23 09:07:03 +00003189
Guido van Rossumc89705d1992-11-26 08:54:07 +00003190/* s.getsockname() method */
3191
Guido van Rossum73624e91994-10-10 17:59:00 +00003192static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303193sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 sock_addr_t addrbuf;
3196 int res;
3197 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 if (!getsockaddrlen(s, &addrlen))
3200 return NULL;
3201 memset(&addrbuf, 0, addrlen);
3202 Py_BEGIN_ALLOW_THREADS
3203 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3204 Py_END_ALLOW_THREADS
3205 if (res < 0)
3206 return s->errorhandler();
3207 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3208 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003209}
3210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003211PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003212"getsockname() -> address info\n\
3213\n\
3214Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003215info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003216
Guido van Rossumc89705d1992-11-26 08:54:07 +00003217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003219/* s.getpeername() method */
3220
Guido van Rossum73624e91994-10-10 17:59:00 +00003221static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303222sock_getpeername(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Guido van Rossumc89705d1992-11-26 08:54:07 +00003223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 sock_addr_t addrbuf;
3225 int res;
3226 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 if (!getsockaddrlen(s, &addrlen))
3229 return NULL;
3230 memset(&addrbuf, 0, addrlen);
3231 Py_BEGIN_ALLOW_THREADS
3232 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3233 Py_END_ALLOW_THREADS
3234 if (res < 0)
3235 return s->errorhandler();
3236 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3237 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003238}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003240PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003241"getpeername() -> address info\n\
3242\n\
3243Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003244info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003245
Guido van Rossumb6775db1994-08-01 11:34:53 +00003246#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003247
3248
Guido van Rossum30a685f1991-06-27 15:51:29 +00003249/* s.listen(n) method */
3250
Guido van Rossum73624e91994-10-10 17:59:00 +00003251static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003252sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003253{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003254 /* We try to choose a default backlog high enough to avoid connection drops
3255 * for common workloads, yet not too high to limit resource usage. */
3256 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003258
Charles-François Natali644b8f52014-05-22 19:45:39 +01003259 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003263 /* To avoid problems on systems that don't allow a negative backlog
3264 * (which doesn't make sense anyway) we force a minimum value of 0. */
3265 if (backlog < 0)
3266 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 res = listen(s->sock_fd, backlog);
3268 Py_END_ALLOW_THREADS
3269 if (res < 0)
3270 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003271 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003272}
3273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003274PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003275"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003276\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003277Enable a server to accept connections. If backlog is specified, it must be\n\
3278at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003279unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003280connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003281
Victor Stinner31bf2d52015-04-01 21:57:09 +02003282struct sock_recv {
3283 char *cbuf;
3284 Py_ssize_t len;
3285 int flags;
3286 Py_ssize_t result;
3287};
3288
3289static int
3290sock_recv_impl(PySocketSockObject *s, void *data)
3291{
3292 struct sock_recv *ctx = data;
3293
3294#ifdef MS_WINDOWS
3295 if (ctx->len > INT_MAX)
3296 ctx->len = INT_MAX;
3297 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3298#else
3299 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3300#endif
3301 return (ctx->result >= 0);
3302}
3303
Guido van Rossum82a5c661998-07-07 20:45:43 +00003304
Thomas Wouters477c8d52006-05-27 19:21:47 +00003305/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003306 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003307 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003308 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003309 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003310 * also possible that we return a number of bytes smaller than the request
3311 * bytes.
3312 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003313
Antoine Pitrou19467d22010-08-17 19:33:30 +00003314static Py_ssize_t
3315sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003316{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003317 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 if (!IS_SELECTABLE(s)) {
3320 select_error();
3321 return -1;
3322 }
3323 if (len == 0) {
3324 /* If 0 bytes were requested, do nothing. */
3325 return 0;
3326 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003327
Victor Stinner31bf2d52015-04-01 21:57:09 +02003328 ctx.cbuf = cbuf;
3329 ctx.len = len;
3330 ctx.flags = flags;
3331 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003333
3334 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003335}
3336
Guido van Rossum48a680c2001-03-02 06:34:14 +00003337
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003338/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003339
Guido van Rossum73624e91994-10-10 17:59:00 +00003340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003341sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003342{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003343 Py_ssize_t recvlen, outlen;
3344 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003346
Antoine Pitrou19467d22010-08-17 19:33:30 +00003347 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 if (recvlen < 0) {
3351 PyErr_SetString(PyExc_ValueError,
3352 "negative buffersize in recv");
3353 return NULL;
3354 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 /* Allocate a new string. */
3357 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3358 if (buf == NULL)
3359 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 /* Call the guts */
3362 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3363 if (outlen < 0) {
3364 /* An error occurred, release the string and return an
3365 error. */
3366 Py_DECREF(buf);
3367 return NULL;
3368 }
3369 if (outlen != recvlen) {
3370 /* We did not read as many bytes as we anticipated, resize the
3371 string if possible and be successful. */
3372 _PyBytes_Resize(&buf, outlen);
3373 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003376}
3377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003378PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003379"recv(buffersize[, flags]) -> data\n\
3380\n\
3381Receive up to buffersize bytes from the socket. For the optional flags\n\
3382argument, see the Unix manual. When no data is available, block until\n\
3383at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003385
Guido van Rossum30a685f1991-06-27 15:51:29 +00003386
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003387/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003388
Thomas Wouters477c8d52006-05-27 19:21:47 +00003389static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003390sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003393
Antoine Pitrou19467d22010-08-17 19:33:30 +00003394 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 Py_buffer pbuf;
3396 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003397 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003400 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 &pbuf, &recvlen, &flags))
3402 return NULL;
3403 buf = pbuf.buf;
3404 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 if (recvlen < 0) {
3407 PyBuffer_Release(&pbuf);
3408 PyErr_SetString(PyExc_ValueError,
3409 "negative buffersize in recv_into");
3410 return NULL;
3411 }
3412 if (recvlen == 0) {
3413 /* If nbytes was not specified, use the buffer's length */
3414 recvlen = buflen;
3415 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 /* Check if the buffer is large enough */
3418 if (buflen < recvlen) {
3419 PyBuffer_Release(&pbuf);
3420 PyErr_SetString(PyExc_ValueError,
3421 "buffer too small for requested bytes");
3422 return NULL;
3423 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 /* Call the guts */
3426 readlen = sock_recv_guts(s, buf, recvlen, flags);
3427 if (readlen < 0) {
3428 /* Return an error. */
3429 PyBuffer_Release(&pbuf);
3430 return NULL;
3431 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 PyBuffer_Release(&pbuf);
3434 /* Return the number of bytes read. Note that we do not do anything
3435 special here in the case that readlen < recvlen. */
3436 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003437}
3438
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003439PyDoc_STRVAR(recv_into_doc,
3440"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003441\n\
oldkaa0735f2018-02-02 16:52:55 +08003442A version of recv() that stores its data into a buffer rather than creating\n\
3443a new string. Receive up to buffersize bytes from the socket. If buffersize\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003444is not specified (or 0), receive up to the size available in the given buffer.\n\
3445\n\
3446See recv() for documentation about the flags.");
3447
Victor Stinner31bf2d52015-04-01 21:57:09 +02003448struct sock_recvfrom {
3449 char* cbuf;
3450 Py_ssize_t len;
3451 int flags;
3452 socklen_t *addrlen;
3453 sock_addr_t *addrbuf;
3454 Py_ssize_t result;
3455};
3456
3457static int
3458sock_recvfrom_impl(PySocketSockObject *s, void *data)
3459{
3460 struct sock_recvfrom *ctx = data;
3461
3462 memset(ctx->addrbuf, 0, *ctx->addrlen);
3463
3464#ifdef MS_WINDOWS
3465 if (ctx->len > INT_MAX)
3466 ctx->len = INT_MAX;
3467 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3468 SAS2SA(ctx->addrbuf), ctx->addrlen);
3469#else
3470 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3471 SAS2SA(ctx->addrbuf), ctx->addrlen);
3472#endif
3473 return (ctx->result >= 0);
3474}
3475
Thomas Wouters477c8d52006-05-27 19:21:47 +00003476
3477/*
Christian Heimes99170a52007-12-19 02:07:34 +00003478 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3479 * into a char buffer. If you have any inc/def ref to do to the objects that
3480 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003481 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003482 * that it is also possible that we return a number of bytes smaller than the
3483 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003484 *
3485 * 'addr' is a return value for the address object. Note that you must decref
3486 * it yourself.
3487 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003488static Py_ssize_t
3489sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003494 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 if (!getsockaddrlen(s, &addrlen))
3499 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 if (!IS_SELECTABLE(s)) {
3502 select_error();
3503 return -1;
3504 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003505
Victor Stinner31bf2d52015-04-01 21:57:09 +02003506 ctx.cbuf = cbuf;
3507 ctx.len = len;
3508 ctx.flags = flags;
3509 ctx.addrbuf = &addrbuf;
3510 ctx.addrlen = &addrlen;
3511 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003512 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003513
Victor Stinner31bf2d52015-04-01 21:57:09 +02003514 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3515 s->sock_proto);
3516 if (*addr == NULL)
3517 return -1;
3518
3519 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003520}
3521
3522/* s.recvfrom(nbytes [,flags]) method */
3523
3524static PyObject *
3525sock_recvfrom(PySocketSockObject *s, PyObject *args)
3526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 PyObject *buf = NULL;
3528 PyObject *addr = NULL;
3529 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003530 int flags = 0;
3531 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003532
Antoine Pitrou19467d22010-08-17 19:33:30 +00003533 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 if (recvlen < 0) {
3537 PyErr_SetString(PyExc_ValueError,
3538 "negative buffersize in recvfrom");
3539 return NULL;
3540 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3543 if (buf == NULL)
3544 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3547 recvlen, flags, &addr);
3548 if (outlen < 0) {
3549 goto finally;
3550 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 if (outlen != recvlen) {
3553 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003554 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003556 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 goto finally;
3558 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003561
3562finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 Py_XDECREF(buf);
3564 Py_XDECREF(addr);
3565 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003566}
3567
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003568PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003569"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3570\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003571Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003572
Thomas Wouters477c8d52006-05-27 19:21:47 +00003573
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003574/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575
3576static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003577sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003580
Antoine Pitrou19467d22010-08-17 19:33:30 +00003581 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003582 Py_buffer pbuf;
3583 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003584 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003587
Antoine Pitrou19467d22010-08-17 19:33:30 +00003588 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 kwlist, &pbuf,
3590 &recvlen, &flags))
3591 return NULL;
3592 buf = pbuf.buf;
3593 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 if (recvlen < 0) {
3596 PyBuffer_Release(&pbuf);
3597 PyErr_SetString(PyExc_ValueError,
3598 "negative buffersize in recvfrom_into");
3599 return NULL;
3600 }
3601 if (recvlen == 0) {
3602 /* If nbytes was not specified, use the buffer's length */
3603 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003604 } else if (recvlen > buflen) {
3605 PyBuffer_Release(&pbuf);
3606 PyErr_SetString(PyExc_ValueError,
3607 "nbytes is greater than the length of the buffer");
3608 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3612 if (readlen < 0) {
3613 PyBuffer_Release(&pbuf);
3614 /* Return an error */
3615 Py_XDECREF(addr);
3616 return NULL;
3617 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 PyBuffer_Release(&pbuf);
3620 /* Return the number of bytes read and the address. Note that we do
3621 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003622 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003623}
3624
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003625PyDoc_STRVAR(recvfrom_into_doc,
3626"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003627\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003628Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003629
Victor Stinner35bee932015-04-02 12:28:07 +02003630/* The sendmsg() and recvmsg[_into]() methods require a working
3631 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3632#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003633struct sock_recvmsg {
3634 struct msghdr *msg;
3635 int flags;
3636 ssize_t result;
3637};
3638
3639static int
3640sock_recvmsg_impl(PySocketSockObject *s, void *data)
3641{
3642 struct sock_recvmsg *ctx = data;
3643
3644 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3645 return (ctx->result >= 0);
3646}
3647
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003648/*
3649 * Call recvmsg() with the supplied iovec structures, flags, and
3650 * ancillary data buffer size (controllen). Returns the tuple return
3651 * value for recvmsg() or recvmsg_into(), with the first item provided
3652 * by the supplied makeval() function. makeval() will be called with
3653 * the length read and makeval_data as arguments, and must return a
3654 * new reference (which will be decrefed if there is a subsequent
3655 * error). On error, closes any file descriptors received via
3656 * SCM_RIGHTS.
3657 */
3658static PyObject *
3659sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3660 int flags, Py_ssize_t controllen,
3661 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3662{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003663 sock_addr_t addrbuf;
3664 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003665 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003666 PyObject *cmsg_list = NULL, *retval = NULL;
3667 void *controlbuf = NULL;
3668 struct cmsghdr *cmsgh;
3669 size_t cmsgdatalen = 0;
3670 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003671 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003672
3673 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3674 ignored" when the socket is connected (Linux fills them in
3675 anyway for AF_UNIX sockets at least). Normally msg_namelen
3676 seems to be set to 0 if there's no address, but try to
3677 initialize msg_name to something that won't be mistaken for a
3678 real address if that doesn't happen. */
3679 if (!getsockaddrlen(s, &addrbuflen))
3680 return NULL;
3681 memset(&addrbuf, 0, addrbuflen);
3682 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3683
3684 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3685 PyErr_SetString(PyExc_ValueError,
3686 "invalid ancillary data buffer length");
3687 return NULL;
3688 }
3689 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3690 return PyErr_NoMemory();
3691
3692 /* Make the system call. */
3693 if (!IS_SELECTABLE(s)) {
3694 select_error();
3695 goto finally;
3696 }
3697
Victor Stinner31bf2d52015-04-01 21:57:09 +02003698 msg.msg_name = SAS2SA(&addrbuf);
3699 msg.msg_namelen = addrbuflen;
3700 msg.msg_iov = iov;
3701 msg.msg_iovlen = iovlen;
3702 msg.msg_control = controlbuf;
3703 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003704
Victor Stinner31bf2d52015-04-01 21:57:09 +02003705 ctx.msg = &msg;
3706 ctx.flags = flags;
3707 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709
3710 /* Make list of (level, type, data) tuples from control messages. */
3711 if ((cmsg_list = PyList_New(0)) == NULL)
3712 goto err_closefds;
3713 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3714 implementations didn't do so. */
3715 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3716 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3717 PyObject *bytes, *tuple;
3718 int tmp;
3719
3720 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3721 if (cmsg_status != 0) {
3722 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3723 "received malformed or improperly-truncated "
3724 "ancillary data", 1) == -1)
3725 goto err_closefds;
3726 }
3727 if (cmsg_status < 0)
3728 break;
3729 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003730 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731 goto err_closefds;
3732 }
3733
3734 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3735 cmsgdatalen);
3736 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3737 (int)cmsgh->cmsg_type, bytes);
3738 if (tuple == NULL)
3739 goto err_closefds;
3740 tmp = PyList_Append(cmsg_list, tuple);
3741 Py_DECREF(tuple);
3742 if (tmp != 0)
3743 goto err_closefds;
3744
3745 if (cmsg_status != 0)
3746 break;
3747 }
3748
3749 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003750 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003751 cmsg_list,
3752 (int)msg.msg_flags,
3753 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3754 ((msg.msg_namelen > addrbuflen) ?
3755 addrbuflen : msg.msg_namelen),
3756 s->sock_proto));
3757 if (retval == NULL)
3758 goto err_closefds;
3759
3760finally:
3761 Py_XDECREF(cmsg_list);
3762 PyMem_Free(controlbuf);
3763 return retval;
3764
3765err_closefds:
3766#ifdef SCM_RIGHTS
3767 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3768 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3769 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3770 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3771 if (cmsg_status < 0)
3772 break;
3773 if (cmsgh->cmsg_level == SOL_SOCKET &&
3774 cmsgh->cmsg_type == SCM_RIGHTS) {
3775 size_t numfds;
3776 int *fdp;
3777
3778 numfds = cmsgdatalen / sizeof(int);
3779 fdp = (int *)CMSG_DATA(cmsgh);
3780 while (numfds-- > 0)
3781 close(*fdp++);
3782 }
3783 if (cmsg_status != 0)
3784 break;
3785 }
3786#endif /* SCM_RIGHTS */
3787 goto finally;
3788}
3789
3790
3791static PyObject *
3792makeval_recvmsg(ssize_t received, void *data)
3793{
3794 PyObject **buf = data;
3795
3796 if (received < PyBytes_GET_SIZE(*buf))
3797 _PyBytes_Resize(buf, received);
3798 Py_XINCREF(*buf);
3799 return *buf;
3800}
3801
3802/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3803
3804static PyObject *
3805sock_recvmsg(PySocketSockObject *s, PyObject *args)
3806{
3807 Py_ssize_t bufsize, ancbufsize = 0;
3808 int flags = 0;
3809 struct iovec iov;
3810 PyObject *buf = NULL, *retval = NULL;
3811
3812 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3813 return NULL;
3814
3815 if (bufsize < 0) {
3816 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3817 return NULL;
3818 }
3819 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3820 return NULL;
3821 iov.iov_base = PyBytes_AS_STRING(buf);
3822 iov.iov_len = bufsize;
3823
3824 /* Note that we're passing a pointer to *our pointer* to the bytes
3825 object here (&buf); makeval_recvmsg() may incref the object, or
3826 deallocate it and set our pointer to NULL. */
3827 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3828 &makeval_recvmsg, &buf);
3829 Py_XDECREF(buf);
3830 return retval;
3831}
3832
3833PyDoc_STRVAR(recvmsg_doc,
3834"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3835\n\
3836Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3837socket. The ancbufsize argument sets the size in bytes of the\n\
3838internal buffer used to receive the ancillary data; it defaults to 0,\n\
3839meaning that no ancillary data will be received. Appropriate buffer\n\
3840sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3841CMSG_LEN(), and items which do not fit into the buffer might be\n\
3842truncated or discarded. The flags argument defaults to 0 and has the\n\
3843same meaning as for recv().\n\
3844\n\
3845The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3846The data item is a bytes object holding the non-ancillary data\n\
3847received. The ancdata item is a list of zero or more tuples\n\
3848(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3849(control messages) received: cmsg_level and cmsg_type are integers\n\
3850specifying the protocol level and protocol-specific type respectively,\n\
3851and cmsg_data is a bytes object holding the associated data. The\n\
3852msg_flags item is the bitwise OR of various flags indicating\n\
3853conditions on the received message; see your system documentation for\n\
3854details. If the receiving socket is unconnected, address is the\n\
3855address of the sending socket, if available; otherwise, its value is\n\
3856unspecified.\n\
3857\n\
3858If recvmsg() raises an exception after the system call returns, it\n\
3859will first attempt to close any file descriptors received via the\n\
3860SCM_RIGHTS mechanism.");
3861
3862
3863static PyObject *
3864makeval_recvmsg_into(ssize_t received, void *data)
3865{
3866 return PyLong_FromSsize_t(received);
3867}
3868
3869/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3870
3871static PyObject *
3872sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3873{
3874 Py_ssize_t ancbufsize = 0;
3875 int flags = 0;
3876 struct iovec *iovs = NULL;
3877 Py_ssize_t i, nitems, nbufs = 0;
3878 Py_buffer *bufs = NULL;
3879 PyObject *buffers_arg, *fast, *retval = NULL;
3880
3881 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3882 &buffers_arg, &ancbufsize, &flags))
3883 return NULL;
3884
3885 if ((fast = PySequence_Fast(buffers_arg,
3886 "recvmsg_into() argument 1 must be an "
3887 "iterable")) == NULL)
3888 return NULL;
3889 nitems = PySequence_Fast_GET_SIZE(fast);
3890 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003891 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003892 goto finally;
3893 }
3894
3895 /* Fill in an iovec for each item, and save the Py_buffer
3896 structs to release afterwards. */
3897 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3898 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3899 PyErr_NoMemory();
3900 goto finally;
3901 }
3902 for (; nbufs < nitems; nbufs++) {
3903 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3904 "w*;recvmsg_into() argument 1 must be an iterable "
3905 "of single-segment read-write buffers",
3906 &bufs[nbufs]))
3907 goto finally;
3908 iovs[nbufs].iov_base = bufs[nbufs].buf;
3909 iovs[nbufs].iov_len = bufs[nbufs].len;
3910 }
3911
3912 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3913 &makeval_recvmsg_into, NULL);
3914finally:
3915 for (i = 0; i < nbufs; i++)
3916 PyBuffer_Release(&bufs[i]);
3917 PyMem_Free(bufs);
3918 PyMem_Free(iovs);
3919 Py_DECREF(fast);
3920 return retval;
3921}
3922
3923PyDoc_STRVAR(recvmsg_into_doc,
3924"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3925\n\
3926Receive normal data and ancillary data from the socket, scattering the\n\
3927non-ancillary data into a series of buffers. The buffers argument\n\
3928must be an iterable of objects that export writable buffers\n\
3929(e.g. bytearray objects); these will be filled with successive chunks\n\
3930of the non-ancillary data until it has all been written or there are\n\
3931no more buffers. The ancbufsize argument sets the size in bytes of\n\
3932the internal buffer used to receive the ancillary data; it defaults to\n\
39330, meaning that no ancillary data will be received. Appropriate\n\
3934buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3935or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3936truncated or discarded. The flags argument defaults to 0 and has the\n\
3937same meaning as for recv().\n\
3938\n\
3939The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3940The nbytes item is the total number of bytes of non-ancillary data\n\
3941written into the buffers. The ancdata item is a list of zero or more\n\
3942tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3943data (control messages) received: cmsg_level and cmsg_type are\n\
3944integers specifying the protocol level and protocol-specific type\n\
3945respectively, and cmsg_data is a bytes object holding the associated\n\
3946data. The msg_flags item is the bitwise OR of various flags\n\
3947indicating conditions on the received message; see your system\n\
3948documentation for details. If the receiving socket is unconnected,\n\
3949address is the address of the sending socket, if available; otherwise,\n\
3950its value is unspecified.\n\
3951\n\
3952If recvmsg_into() raises an exception after the system call returns,\n\
3953it will first attempt to close any file descriptors received via the\n\
3954SCM_RIGHTS mechanism.");
3955#endif /* CMSG_LEN */
3956
3957
Victor Stinner31bf2d52015-04-01 21:57:09 +02003958struct sock_send {
3959 char *buf;
3960 Py_ssize_t len;
3961 int flags;
3962 Py_ssize_t result;
3963};
3964
3965static int
3966sock_send_impl(PySocketSockObject *s, void *data)
3967{
3968 struct sock_send *ctx = data;
3969
3970#ifdef MS_WINDOWS
3971 if (ctx->len > INT_MAX)
3972 ctx->len = INT_MAX;
3973 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3974#else
3975 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3976#endif
3977 return (ctx->result >= 0);
3978}
3979
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003980/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003981
Guido van Rossum73624e91994-10-10 17:59:00 +00003982static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003983sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003984{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003985 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003987 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3990 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003992 if (!IS_SELECTABLE(s)) {
3993 PyBuffer_Release(&pbuf);
3994 return select_error();
3995 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003996 ctx.buf = pbuf.buf;
3997 ctx.len = pbuf.len;
3998 ctx.flags = flags;
3999 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004000 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004001 return NULL;
4002 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004003 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004004
4005 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00004006}
4007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004008PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004009"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004010\n\
4011Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004012argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004013sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004014
4015
4016/* s.sendall(data [,flags]) method */
4017
4018static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004019sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004022 Py_ssize_t len, n;
4023 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004025 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02004026 int has_timeout = (s->sock_timeout > 0);
4027 _PyTime_t interval = s->sock_timeout;
4028 _PyTime_t deadline = 0;
4029 int deadline_initialized = 0;
4030 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
4033 return NULL;
4034 buf = pbuf.buf;
4035 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 if (!IS_SELECTABLE(s)) {
4038 PyBuffer_Release(&pbuf);
4039 return select_error();
4040 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 do {
Victor Stinner8912d142015-04-06 23:16:34 +02004043 if (has_timeout) {
4044 if (deadline_initialized) {
4045 /* recompute the timeout */
4046 interval = deadline - _PyTime_GetMonotonicClock();
4047 }
4048 else {
4049 deadline_initialized = 1;
4050 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
4051 }
4052
4053 if (interval <= 0) {
4054 PyErr_SetString(socket_timeout, "timed out");
4055 goto done;
4056 }
4057 }
4058
Victor Stinner02f32ab2015-04-01 22:53:26 +02004059 ctx.buf = buf;
4060 ctx.len = len;
4061 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004062 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4063 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004064 n = ctx.result;
4065 assert(n >= 0);
4066
4067 buf += n;
4068 len -= n;
4069
4070 /* We must run our signal handlers before looping again.
4071 send() can return a successful partial write when it is
4072 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004073 if (PyErr_CheckSignals())
4074 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004075 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004077
Victor Stinner8912d142015-04-06 23:16:34 +02004078 Py_INCREF(Py_None);
4079 res = Py_None;
4080
4081done:
4082 PyBuffer_Release(&pbuf);
4083 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004084}
4085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004086PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004087"sendall(data[, flags])\n\
4088\n\
4089Send a data string to the socket. For the optional flags\n\
4090argument, see the Unix manual. This calls send() repeatedly\n\
4091until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004092to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004093
Guido van Rossum30a685f1991-06-27 15:51:29 +00004094
Victor Stinner31bf2d52015-04-01 21:57:09 +02004095struct sock_sendto {
4096 char *buf;
4097 Py_ssize_t len;
4098 int flags;
4099 int addrlen;
4100 sock_addr_t *addrbuf;
4101 Py_ssize_t result;
4102};
4103
4104static int
4105sock_sendto_impl(PySocketSockObject *s, void *data)
4106{
4107 struct sock_sendto *ctx = data;
4108
4109#ifdef MS_WINDOWS
4110 if (ctx->len > INT_MAX)
4111 ctx->len = INT_MAX;
4112 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4113 SAS2SA(ctx->addrbuf), ctx->addrlen);
4114#else
4115 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4116 SAS2SA(ctx->addrbuf), ctx->addrlen);
4117#endif
4118 return (ctx->result >= 0);
4119}
4120
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004121/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004122
Guido van Rossum73624e91994-10-10 17:59:00 +00004123static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004124sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 Py_buffer pbuf;
4127 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004128 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004130 int addrlen, flags;
4131 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004133 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004134 arglen = PyTuple_Size(args);
4135 switch (arglen) {
4136 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004137 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4138 return NULL;
4139 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004140 break;
4141 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004142 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4143 &pbuf, &flags, &addro)) {
4144 return NULL;
4145 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004146 break;
4147 default:
4148 PyErr_Format(PyExc_TypeError,
4149 "sendto() takes 2 or 3 arguments (%d given)",
4150 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004151 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 if (!IS_SELECTABLE(s)) {
4155 PyBuffer_Release(&pbuf);
4156 return select_error();
4157 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004158
Oren Milman735171e2018-09-11 19:51:29 +03004159 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 PyBuffer_Release(&pbuf);
4161 return NULL;
4162 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004163
Victor Stinner31bf2d52015-04-01 21:57:09 +02004164 ctx.buf = pbuf.buf;
4165 ctx.len = pbuf.len;
4166 ctx.flags = flags;
4167 ctx.addrlen = addrlen;
4168 ctx.addrbuf = &addrbuf;
4169 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004170 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 return NULL;
4172 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004173 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004174
4175 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004176}
4177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004178PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004179"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004180\n\
4181Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004182For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004183
Guido van Rossum30a685f1991-06-27 15:51:29 +00004184
Victor Stinner35bee932015-04-02 12:28:07 +02004185/* The sendmsg() and recvmsg[_into]() methods require a working
4186 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4187#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004188struct sock_sendmsg {
4189 struct msghdr *msg;
4190 int flags;
4191 ssize_t result;
4192};
4193
4194static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004195sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4196 struct msghdr *msg,
4197 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4198 Py_ssize_t ndataparts, ndatabufs = 0;
4199 int result = -1;
4200 struct iovec *iovs = NULL;
4201 PyObject *data_fast = NULL;
4202 Py_buffer *databufs = NULL;
4203
4204 /* Fill in an iovec for each message part, and save the Py_buffer
4205 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004206 data_fast = PySequence_Fast(data_arg,
4207 "sendmsg() argument 1 must be an "
4208 "iterable");
4209 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004210 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004211 }
4212
Christian Heimesdffa3942016-09-05 23:54:41 +02004213 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4214 if (ndataparts > INT_MAX) {
4215 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4216 goto finally;
4217 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004218
Christian Heimesdffa3942016-09-05 23:54:41 +02004219 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004220 if (ndataparts > 0) {
4221 iovs = PyMem_New(struct iovec, ndataparts);
4222 if (iovs == NULL) {
4223 PyErr_NoMemory();
4224 goto finally;
4225 }
4226 msg->msg_iov = iovs;
4227
4228 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004229 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004230 PyErr_NoMemory();
4231 goto finally;
4232 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004233 }
4234 for (; ndatabufs < ndataparts; ndatabufs++) {
4235 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4236 "y*;sendmsg() argument 1 must be an iterable of "
4237 "bytes-like objects",
4238 &databufs[ndatabufs]))
4239 goto finally;
4240 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4241 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4242 }
4243 result = 0;
4244 finally:
4245 *databufsout = databufs;
4246 *ndatabufsout = ndatabufs;
4247 Py_XDECREF(data_fast);
4248 return result;
4249}
4250
4251static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004252sock_sendmsg_impl(PySocketSockObject *s, void *data)
4253{
4254 struct sock_sendmsg *ctx = data;
4255
4256 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4257 return (ctx->result >= 0);
4258}
4259
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004260/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4261
4262static PyObject *
4263sock_sendmsg(PySocketSockObject *s, PyObject *args)
4264{
Christian Heimesdffa3942016-09-05 23:54:41 +02004265 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004266 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004267 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004268 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004269 struct cmsginfo {
4270 int level;
4271 int type;
4272 Py_buffer data;
4273 } *cmsgs = NULL;
4274 void *controlbuf = NULL;
4275 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004276 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004277 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004278 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004279 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004280
4281 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004282 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004283 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004284 }
4285
4286 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004287
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004288 /* Parse destination address. */
4289 if (addr_arg != NULL && addr_arg != Py_None) {
Oren Milman735171e2018-09-11 19:51:29 +03004290 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4291 "sendmsg"))
4292 {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004293 goto finally;
Oren Milman735171e2018-09-11 19:51:29 +03004294 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004295 msg.msg_name = &addrbuf;
4296 msg.msg_namelen = addrlen;
4297 }
4298
4299 /* Fill in an iovec for each message part, and save the Py_buffer
4300 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004301 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004302 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004303 }
4304
4305 if (cmsg_arg == NULL)
4306 ncmsgs = 0;
4307 else {
4308 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4309 "sendmsg() argument 2 must be an "
4310 "iterable")) == NULL)
4311 goto finally;
4312 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4313 }
4314
4315#ifndef CMSG_SPACE
4316 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004317 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004318 "sending multiple control messages is not supported "
4319 "on this system");
4320 goto finally;
4321 }
4322#endif
4323 /* Save level, type and Py_buffer for each control message,
4324 and calculate total size. */
4325 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4326 PyErr_NoMemory();
4327 goto finally;
4328 }
4329 controllen = controllen_last = 0;
4330 while (ncmsgbufs < ncmsgs) {
4331 size_t bufsize, space;
4332
4333 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4334 "(iiy*):[sendmsg() ancillary data items]",
4335 &cmsgs[ncmsgbufs].level,
4336 &cmsgs[ncmsgbufs].type,
4337 &cmsgs[ncmsgbufs].data))
4338 goto finally;
4339 bufsize = cmsgs[ncmsgbufs++].data.len;
4340
4341#ifdef CMSG_SPACE
4342 if (!get_CMSG_SPACE(bufsize, &space)) {
4343#else
4344 if (!get_CMSG_LEN(bufsize, &space)) {
4345#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004346 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004347 goto finally;
4348 }
4349 controllen += space;
4350 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004351 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004352 goto finally;
4353 }
4354 controllen_last = controllen;
4355 }
4356
4357 /* Construct ancillary data block from control message info. */
4358 if (ncmsgbufs > 0) {
4359 struct cmsghdr *cmsgh = NULL;
4360
Victor Stinner52d61e42016-09-12 11:41:58 +02004361 controlbuf = PyMem_Malloc(controllen);
4362 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004363 PyErr_NoMemory();
4364 goto finally;
4365 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004366 msg.msg_control = controlbuf;
4367
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004368 msg.msg_controllen = controllen;
4369
4370 /* Need to zero out the buffer as a workaround for glibc's
4371 CMSG_NXTHDR() implementation. After getting the pointer to
4372 the next header, it checks its (uninitialized) cmsg_len
4373 member to see if the "message" fits in the buffer, and
4374 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004375 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004376 memset(controlbuf, 0, controllen);
4377
4378 for (i = 0; i < ncmsgbufs; i++) {
4379 size_t msg_len, data_len = cmsgs[i].data.len;
4380 int enough_space = 0;
4381
4382 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4383 if (cmsgh == NULL) {
4384 PyErr_Format(PyExc_RuntimeError,
4385 "unexpected NULL result from %s()",
4386 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4387 goto finally;
4388 }
4389 if (!get_CMSG_LEN(data_len, &msg_len)) {
4390 PyErr_SetString(PyExc_RuntimeError,
4391 "item size out of range for CMSG_LEN()");
4392 goto finally;
4393 }
4394 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4395 size_t space;
4396
4397 cmsgh->cmsg_len = msg_len;
4398 if (get_cmsg_data_space(&msg, cmsgh, &space))
4399 enough_space = (space >= data_len);
4400 }
4401 if (!enough_space) {
4402 PyErr_SetString(PyExc_RuntimeError,
4403 "ancillary data does not fit in calculated "
4404 "space");
4405 goto finally;
4406 }
4407 cmsgh->cmsg_level = cmsgs[i].level;
4408 cmsgh->cmsg_type = cmsgs[i].type;
4409 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4410 }
4411 }
4412
4413 /* Make the system call. */
4414 if (!IS_SELECTABLE(s)) {
4415 select_error();
4416 goto finally;
4417 }
4418
Victor Stinner31bf2d52015-04-01 21:57:09 +02004419 ctx.msg = &msg;
4420 ctx.flags = flags;
4421 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004422 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004423
4424 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004425
4426finally:
4427 PyMem_Free(controlbuf);
4428 for (i = 0; i < ncmsgbufs; i++)
4429 PyBuffer_Release(&cmsgs[i].data);
4430 PyMem_Free(cmsgs);
4431 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004432 PyMem_Free(msg.msg_iov);
4433 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004434 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004435 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004436 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004437 return retval;
4438}
4439
4440PyDoc_STRVAR(sendmsg_doc,
4441"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4442\n\
4443Send normal and ancillary data to the socket, gathering the\n\
4444non-ancillary data from a series of buffers and concatenating it into\n\
4445a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004446data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004447The ancdata argument specifies the ancillary data (control messages)\n\
4448as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4449cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4450protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004451is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004452argument defaults to 0 and has the same meaning as for send(). If\n\
4453address is supplied and not None, it sets a destination address for\n\
4454the message. The return value is the number of bytes of non-ancillary\n\
4455data sent.");
4456#endif /* CMSG_LEN */
4457
Christian Heimesdffa3942016-09-05 23:54:41 +02004458#ifdef HAVE_SOCKADDR_ALG
4459static PyObject*
4460sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4461{
4462 PyObject *retval = NULL;
4463
4464 Py_ssize_t i, ndatabufs = 0;
4465 Py_buffer *databufs = NULL;
4466 PyObject *data_arg = NULL;
4467
4468 Py_buffer iv = {NULL, NULL};
4469
4470 PyObject *opobj = NULL;
4471 int op = -1;
4472
4473 PyObject *assoclenobj = NULL;
4474 int assoclen = -1;
4475
4476 unsigned int *uiptr;
4477 int flags = 0;
4478
4479 struct msghdr msg;
4480 struct cmsghdr *header = NULL;
4481 struct af_alg_iv *alg_iv = NULL;
4482 struct sock_sendmsg ctx;
4483 Py_ssize_t controllen;
4484 void *controlbuf = NULL;
4485 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4486
4487 if (self->sock_family != AF_ALG) {
4488 PyErr_SetString(PyExc_OSError,
4489 "algset is only supported for AF_ALG");
4490 return NULL;
4491 }
4492
4493 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4494 "|O$O!y*O!i:sendmsg_afalg", keywords,
4495 &data_arg,
4496 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004497 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004498 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004499 }
4500
4501 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004502
4503 /* op is a required, keyword-only argument >= 0 */
4504 if (opobj != NULL) {
4505 op = _PyLong_AsInt(opobj);
4506 }
4507 if (op < 0) {
4508 /* override exception from _PyLong_AsInt() */
4509 PyErr_SetString(PyExc_TypeError,
4510 "Invalid or missing argument 'op'");
4511 goto finally;
4512 }
4513 /* assoclen is optional but must be >= 0 */
4514 if (assoclenobj != NULL) {
4515 assoclen = _PyLong_AsInt(assoclenobj);
4516 if (assoclen == -1 && PyErr_Occurred()) {
4517 goto finally;
4518 }
4519 if (assoclen < 0) {
4520 PyErr_SetString(PyExc_TypeError,
4521 "assoclen must be positive");
4522 goto finally;
4523 }
4524 }
4525
4526 controllen = CMSG_SPACE(4);
4527 if (iv.buf != NULL) {
4528 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4529 }
4530 if (assoclen >= 0) {
4531 controllen += CMSG_SPACE(4);
4532 }
4533
4534 controlbuf = PyMem_Malloc(controllen);
4535 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004536 PyErr_NoMemory();
4537 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004538 }
4539 memset(controlbuf, 0, controllen);
4540
Christian Heimesdffa3942016-09-05 23:54:41 +02004541 msg.msg_controllen = controllen;
4542 msg.msg_control = controlbuf;
4543
4544 /* Fill in an iovec for each message part, and save the Py_buffer
4545 structs to release afterwards. */
4546 if (data_arg != NULL) {
4547 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4548 goto finally;
4549 }
4550 }
4551
4552 /* set operation to encrypt or decrypt */
4553 header = CMSG_FIRSTHDR(&msg);
4554 if (header == NULL) {
4555 PyErr_SetString(PyExc_RuntimeError,
4556 "unexpected NULL result from CMSG_FIRSTHDR");
4557 goto finally;
4558 }
4559 header->cmsg_level = SOL_ALG;
4560 header->cmsg_type = ALG_SET_OP;
4561 header->cmsg_len = CMSG_LEN(4);
4562 uiptr = (void*)CMSG_DATA(header);
4563 *uiptr = (unsigned int)op;
4564
4565 /* set initialization vector */
4566 if (iv.buf != NULL) {
4567 header = CMSG_NXTHDR(&msg, header);
4568 if (header == NULL) {
4569 PyErr_SetString(PyExc_RuntimeError,
4570 "unexpected NULL result from CMSG_NXTHDR(iv)");
4571 goto finally;
4572 }
4573 header->cmsg_level = SOL_ALG;
4574 header->cmsg_type = ALG_SET_IV;
4575 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4576 alg_iv = (void*)CMSG_DATA(header);
4577 alg_iv->ivlen = iv.len;
4578 memcpy(alg_iv->iv, iv.buf, iv.len);
4579 }
4580
4581 /* set length of associated data for AEAD */
4582 if (assoclen >= 0) {
4583 header = CMSG_NXTHDR(&msg, header);
4584 if (header == NULL) {
4585 PyErr_SetString(PyExc_RuntimeError,
4586 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4587 goto finally;
4588 }
4589 header->cmsg_level = SOL_ALG;
4590 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4591 header->cmsg_len = CMSG_LEN(4);
4592 uiptr = (void*)CMSG_DATA(header);
4593 *uiptr = (unsigned int)assoclen;
4594 }
4595
4596 ctx.msg = &msg;
4597 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004598 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004599 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004600 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004601
4602 retval = PyLong_FromSsize_t(ctx.result);
4603
4604 finally:
4605 PyMem_Free(controlbuf);
4606 if (iv.buf != NULL) {
4607 PyBuffer_Release(&iv);
4608 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004609 PyMem_Free(msg.msg_iov);
4610 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004611 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004612 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004613 PyMem_Free(databufs);
4614 return retval;
4615}
4616
4617PyDoc_STRVAR(sendmsg_afalg_doc,
4618"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4619\n\
4620Set operation mode, IV and length of associated data for an AF_ALG\n\
4621operation socket.");
4622#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004623
Guido van Rossum30a685f1991-06-27 15:51:29 +00004624/* s.shutdown(how) method */
4625
Guido van Rossum73624e91994-10-10 17:59:00 +00004626static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004627sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 int how;
4630 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004631
Serhiy Storchaka78980432013-01-15 01:12:17 +02004632 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 if (how == -1 && PyErr_Occurred())
4634 return NULL;
4635 Py_BEGIN_ALLOW_THREADS
4636 res = shutdown(s->sock_fd, how);
4637 Py_END_ALLOW_THREADS
4638 if (res < 0)
4639 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004640 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004641}
4642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004643PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004644"shutdown(flag)\n\
4645\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004646Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4647of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004648
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004649#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004650static PyObject*
4651sock_ioctl(PySocketSockObject *s, PyObject *arg)
4652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 unsigned long cmd = SIO_RCVALL;
4654 PyObject *argO;
4655 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4658 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 switch (cmd) {
4661 case SIO_RCVALL: {
4662 unsigned int option = RCVALL_ON;
4663 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4664 return NULL;
4665 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4666 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4667 return set_error();
4668 }
4669 return PyLong_FromUnsignedLong(recv); }
4670 case SIO_KEEPALIVE_VALS: {
4671 struct tcp_keepalive ka;
4672 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4673 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4674 return NULL;
4675 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4676 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4677 return set_error();
4678 }
4679 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004680#if defined(SIO_LOOPBACK_FAST_PATH)
4681 case SIO_LOOPBACK_FAST_PATH: {
4682 unsigned int option;
4683 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4684 return NULL;
4685 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4686 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4687 return set_error();
4688 }
4689 return PyLong_FromUnsignedLong(recv); }
4690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 default:
4692 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4693 return NULL;
4694 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004695}
4696PyDoc_STRVAR(sock_ioctl_doc,
4697"ioctl(cmd, option) -> long\n\
4698\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004699Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4700SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004701SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4702SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004703#endif
4704
4705#if defined(MS_WINDOWS)
4706static PyObject*
4707sock_share(PySocketSockObject *s, PyObject *arg)
4708{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004709 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004710 DWORD processId;
4711 int result;
4712
4713 if (!PyArg_ParseTuple(arg, "I", &processId))
4714 return NULL;
4715
4716 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004717 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004718 Py_END_ALLOW_THREADS
4719 if (result == SOCKET_ERROR)
4720 return set_error();
4721 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4722}
4723PyDoc_STRVAR(sock_share_doc,
4724"share(process_id) -> bytes\n\
4725\n\
4726Share the socket with another process. The target process id\n\
4727must be provided and the resulting bytes object passed to the target\n\
4728process. There the shared socket can be instantiated by calling\n\
4729socket.fromshare().");
4730
Christian Heimesfaf2f632008-01-06 16:59:19 +00004731
4732#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004733
4734/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004735
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004736static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4738 accept_doc},
4739 {"bind", (PyCFunction)sock_bind, METH_O,
4740 bind_doc},
4741 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004742 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 {"connect", (PyCFunction)sock_connect, METH_O,
4744 connect_doc},
4745 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4746 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004747 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4748 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4750 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004751#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 {"getpeername", (PyCFunction)sock_getpeername,
4753 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 {"getsockname", (PyCFunction)sock_getsockname,
4756 METH_NOARGS, getsockname_doc},
4757 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4758 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004759#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4761 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004762#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004763#if defined(MS_WINDOWS)
4764 {"share", (PyCFunction)sock_share, METH_VARARGS,
4765 sock_share_doc},
4766#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004767 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 listen_doc},
4769 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4770 recv_doc},
4771 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4772 recv_into_doc},
4773 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4774 recvfrom_doc},
4775 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4776 recvfrom_into_doc},
4777 {"send", (PyCFunction)sock_send, METH_VARARGS,
4778 send_doc},
4779 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4780 sendall_doc},
4781 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4782 sendto_doc},
4783 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4784 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004785 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4786 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4788 settimeout_doc},
4789 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4790 gettimeout_doc},
4791 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4792 setsockopt_doc},
4793 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4794 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004795#ifdef CMSG_LEN
4796 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4797 recvmsg_doc},
4798 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4799 recvmsg_into_doc,},
4800 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4801 sendmsg_doc},
4802#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004803#ifdef HAVE_SOCKADDR_ALG
4804 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4805 sendmsg_afalg_doc},
4806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004808};
4809
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004810/* SockObject members */
4811static PyMemberDef sock_memberlist[] = {
4812 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4813 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4814 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004815 {0},
4816};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004817
Victor Stinner71694d52015-03-28 01:18:54 +01004818static PyGetSetDef sock_getsetlist[] = {
4819 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4820 {NULL} /* sentinel */
4821};
4822
Guido van Rossum73624e91994-10-10 17:59:00 +00004823/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004824 First close the file description. */
4825
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004826static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004827sock_finalize(PySocketSockObject *s)
4828{
4829 SOCKET_T fd;
4830 PyObject *error_type, *error_value, *error_traceback;
4831
4832 /* Save the current exception, if any. */
4833 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4834
Victor Stinnerd3afb622016-07-22 17:47:09 +02004835 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004836 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4837 /* Spurious errors can appear at shutdown */
4838 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4839 PyErr_WriteUnraisable((PyObject *)s);
4840 }
4841 }
4842
4843 /* Only close the socket *after* logging the ResourceWarning warning
4844 to allow the logger to call socket methods like
4845 socket.getsockname(). If the socket is closed before, socket
4846 methods fails with the EBADF error. */
4847 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004848 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004849
4850 /* We do not want to retry upon EINTR: see sock_close() */
4851 Py_BEGIN_ALLOW_THREADS
4852 (void) SOCKETCLOSE(fd);
4853 Py_END_ALLOW_THREADS
4854 }
4855
4856 /* Restore the saved exception. */
4857 PyErr_Restore(error_type, error_value, error_traceback);
4858}
4859
4860static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004861sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004862{
Victor Stinner19a8e842016-03-21 16:36:48 +01004863 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4864 return;
4865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004867}
4868
Guido van Rossum30a685f1991-06-27 15:51:29 +00004869
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004871sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004872{
Victor Stinnere254e532014-07-26 14:36:55 +02004873 long sock_fd;
4874 /* On Windows, this test is needed because SOCKET_T is unsigned */
4875 if (s->sock_fd == INVALID_SOCKET) {
4876 sock_fd = -1;
4877 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004878#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004879 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 /* this can occur on Win64, and actually there is a special
4881 ugly printf formatter for decimal pointer length integer
4882 printing, only bother if necessary*/
4883 PyErr_SetString(PyExc_OverflowError,
4884 "no printf formatter to display "
4885 "the socket descriptor in decimal");
4886 return NULL;
4887 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004888#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004889 else
4890 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 return PyUnicode_FromFormat(
4892 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004893 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 s->sock_type,
4895 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004896}
4897
4898
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004899/* Create a new, uninitialized socket object. */
4900
4901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004902sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 new = type->tp_alloc(type, 0);
4907 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004908 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004909 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 ((PySocketSockObject *)new)->errorhandler = &set_error;
4911 }
4912 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004913}
4914
4915
4916/* Initialize a new socket object. */
4917
Victor Stinnerdaf45552013-08-28 00:53:59 +02004918#ifdef SOCK_CLOEXEC
4919/* socket() and socketpair() fail with EINVAL on Linux kernel older
4920 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4921static int sock_cloexec_works = -1;
4922#endif
4923
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004924/*ARGSUSED*/
4925static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004926sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 PySocketSockObject *s = (PySocketSockObject *)self;
4929 PyObject *fdobj = NULL;
4930 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004931 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004933#ifndef MS_WINDOWS
4934#ifdef SOCK_CLOEXEC
4935 int *atomic_flag_works = &sock_cloexec_works;
4936#else
4937 int *atomic_flag_works = NULL;
4938#endif
4939#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4942 "|iiiO:socket", keywords,
4943 &family, &type, &proto, &fdobj))
4944 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004947#ifdef MS_WINDOWS
4948 /* recreate a socket that was duplicated */
4949 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004950 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004951 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4952 PyErr_Format(PyExc_ValueError,
4953 "socket descriptor string has wrong size, "
4954 "should be %zu bytes.", sizeof(info));
4955 return -1;
4956 }
4957 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4958 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004959 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004960 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4961 Py_END_ALLOW_THREADS
4962 if (fd == INVALID_SOCKET) {
4963 set_error();
4964 return -1;
4965 }
4966 family = info.iAddressFamily;
4967 type = info.iSocketType;
4968 proto = info.iProtocol;
4969 }
4970 else
4971#endif
4972 {
4973 fd = PyLong_AsSocket_t(fdobj);
4974 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4975 return -1;
4976 if (fd == INVALID_SOCKET) {
4977 PyErr_SetString(PyExc_ValueError,
4978 "can't use invalid socket value");
4979 return -1;
4980 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004981
4982 if (family == -1) {
4983 sock_addr_t addrbuf;
4984 socklen_t addrlen = sizeof(sock_addr_t);
4985
4986 memset(&addrbuf, 0, addrlen);
4987 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4988 family = SAS2SA(&addrbuf)->sa_family;
4989 } else {
4990#ifdef MS_WINDOWS
4991 PyErr_SetFromWindowsErrWithFilename(0, "family");
4992#else
4993 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4994#endif
4995 return -1;
4996 }
4997 }
4998#ifdef SO_TYPE
4999 if (type == -1) {
5000 int tmp;
5001 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005002 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
5003 (void *)&tmp, &slen) == 0)
5004 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005005 type = tmp;
5006 } else {
5007#ifdef MS_WINDOWS
5008 PyErr_SetFromWindowsErrWithFilename(0, "type");
5009#else
5010 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
5011#endif
5012 return -1;
5013 }
5014 }
5015#else
5016 type = SOCK_STREAM;
5017#endif
5018#ifdef SO_PROTOCOL
5019 if (proto == -1) {
5020 int tmp;
5021 socklen_t slen = sizeof(tmp);
Serhiy Storchakabfe4fd52018-02-09 17:31:26 +02005022 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
5023 (void *)&tmp, &slen) == 0)
5024 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005025 proto = tmp;
5026 } else {
5027#ifdef MS_WINDOWS
5028 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
5029#else
5030 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
5031#endif
5032 return -1;
5033 }
5034 }
5035#else
5036 proto = 0;
5037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 }
5039 }
5040 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01005041 /* No fd, default to AF_INET and SOCK_STREAM */
5042 if (family == -1) {
5043 family = AF_INET;
5044 }
5045 if (type == -1) {
5046 type = SOCK_STREAM;
5047 }
5048 if (proto == -1) {
5049 proto = 0;
5050 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005051#ifdef MS_WINDOWS
5052 /* Windows implementation */
5053#ifndef WSA_FLAG_NO_HANDLE_INHERIT
5054#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5055#endif
5056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005058 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005059 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005060 NULL, 0,
5061 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5062 if (fd == INVALID_SOCKET) {
5063 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5064 support_wsa_no_inherit = 0;
5065 fd = socket(family, type, proto);
5066 }
5067 }
5068 else {
5069 fd = socket(family, type, proto);
5070 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 if (fd == INVALID_SOCKET) {
5074 set_error();
5075 return -1;
5076 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005077
5078 if (!support_wsa_no_inherit) {
5079 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5080 closesocket(fd);
5081 PyErr_SetFromWindowsErr(0);
5082 return -1;
5083 }
5084 }
5085#else
5086 /* UNIX */
5087 Py_BEGIN_ALLOW_THREADS
5088#ifdef SOCK_CLOEXEC
5089 if (sock_cloexec_works != 0) {
5090 fd = socket(family, type | SOCK_CLOEXEC, proto);
5091 if (sock_cloexec_works == -1) {
5092 if (fd >= 0) {
5093 sock_cloexec_works = 1;
5094 }
5095 else if (errno == EINVAL) {
5096 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5097 sock_cloexec_works = 0;
5098 fd = socket(family, type, proto);
5099 }
5100 }
5101 }
5102 else
5103#endif
5104 {
5105 fd = socket(family, type, proto);
5106 }
5107 Py_END_ALLOW_THREADS
5108
5109 if (fd == INVALID_SOCKET) {
5110 set_error();
5111 return -1;
5112 }
5113
5114 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5115 SOCKETCLOSE(fd);
5116 return -1;
5117 }
5118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005120 if (init_sockobject(s, fd, family, type, proto) == -1) {
5121 SOCKETCLOSE(fd);
5122 return -1;
5123 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005126
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005127}
5128
5129
Guido van Rossumb6775db1994-08-01 11:34:53 +00005130/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005131
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005132static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5134 "_socket.socket", /* tp_name */
5135 sizeof(PySocketSockObject), /* tp_basicsize */
5136 0, /* tp_itemsize */
5137 (destructor)sock_dealloc, /* tp_dealloc */
5138 0, /* tp_print */
5139 0, /* tp_getattr */
5140 0, /* tp_setattr */
5141 0, /* tp_reserved */
5142 (reprfunc)sock_repr, /* tp_repr */
5143 0, /* tp_as_number */
5144 0, /* tp_as_sequence */
5145 0, /* tp_as_mapping */
5146 0, /* tp_hash */
5147 0, /* tp_call */
5148 0, /* tp_str */
5149 PyObject_GenericGetAttr, /* tp_getattro */
5150 0, /* tp_setattro */
5151 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005152 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5153 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 sock_doc, /* tp_doc */
5155 0, /* tp_traverse */
5156 0, /* tp_clear */
5157 0, /* tp_richcompare */
5158 0, /* tp_weaklistoffset */
5159 0, /* tp_iter */
5160 0, /* tp_iternext */
5161 sock_methods, /* tp_methods */
5162 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005163 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 0, /* tp_base */
5165 0, /* tp_dict */
5166 0, /* tp_descr_get */
5167 0, /* tp_descr_set */
5168 0, /* tp_dictoffset */
5169 sock_initobj, /* tp_init */
5170 PyType_GenericAlloc, /* tp_alloc */
5171 sock_new, /* tp_new */
5172 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005173 0, /* tp_is_gc */
5174 0, /* tp_bases */
5175 0, /* tp_mro */
5176 0, /* tp_cache */
5177 0, /* tp_subclasses */
5178 0, /* tp_weaklist */
5179 0, /* tp_del */
5180 0, /* tp_version_tag */
5181 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005182};
5183
Guido van Rossum30a685f1991-06-27 15:51:29 +00005184
Guido van Rossum81194471991-07-27 21:42:02 +00005185/* Python interface to gethostname(). */
5186
5187/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005188static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005189socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005190{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005191#ifdef MS_WINDOWS
5192 /* Don't use winsock's gethostname, as this returns the ANSI
5193 version of the hostname, whereas we need a Unicode string.
5194 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005195 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005196 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005197 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005198 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005199
5200 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005201 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005202
5203 if (GetLastError() != ERROR_MORE_DATA)
5204 return PyErr_SetFromWindowsErr(0);
5205
5206 if (size == 0)
5207 return PyUnicode_New(0, 0);
5208
5209 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5210 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005211 name = PyMem_New(wchar_t, size);
5212 if (!name) {
5213 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005214 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005215 }
Victor Stinner74168972011-11-17 01:11:36 +01005216 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5217 name,
5218 &size))
5219 {
5220 PyMem_Free(name);
5221 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005222 }
Victor Stinner74168972011-11-17 01:11:36 +01005223
5224 result = PyUnicode_FromWideChar(name, size);
5225 PyMem_Free(name);
5226 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005227#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 char buf[1024];
5229 int res;
5230 Py_BEGIN_ALLOW_THREADS
5231 res = gethostname(buf, (int) sizeof buf - 1);
5232 Py_END_ALLOW_THREADS
5233 if (res < 0)
5234 return set_error();
5235 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005236 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005237#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005238}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005240PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005241"gethostname() -> string\n\
5242\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005243Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005244
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005245#ifdef HAVE_SETHOSTNAME
5246PyDoc_STRVAR(sethostname_doc,
5247"sethostname(name)\n\n\
5248Sets the hostname to name.");
5249
5250static PyObject *
5251socket_sethostname(PyObject *self, PyObject *args)
5252{
5253 PyObject *hnobj;
5254 Py_buffer buf;
5255 int res, flag = 0;
5256
Christian Heimesd2774c72013-06-19 02:06:29 +02005257#ifdef _AIX
5258/* issue #18259, not declared in any useful header file */
5259extern int sethostname(const char *, size_t);
5260#endif
5261
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005262 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5263 PyErr_Clear();
5264 if (!PyArg_ParseTuple(args, "O&:sethostname",
5265 PyUnicode_FSConverter, &hnobj))
5266 return NULL;
5267 flag = 1;
5268 }
5269 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5270 if (!res) {
5271 res = sethostname(buf.buf, buf.len);
5272 PyBuffer_Release(&buf);
5273 }
5274 if (flag)
5275 Py_DECREF(hnobj);
5276 if (res)
5277 return set_error();
5278 Py_RETURN_NONE;
5279}
5280#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005281
Guido van Rossum30a685f1991-06-27 15:51:29 +00005282/* Python interface to gethostbyname(name). */
5283
5284/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005286socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 char *name;
Коренберг Марк7766b962018-02-13 00:47:42 +05005289 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005290 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005291
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005292 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 return NULL;
Коренберг Марк7766b962018-02-13 00:47:42 +05005294 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005295 goto finally;
Коренберг Марк7766b962018-02-13 00:47:42 +05005296 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005297finally:
5298 PyMem_Free(name);
5299 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005300}
5301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005302PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005303"gethostbyname(host) -> address\n\
5304\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005305Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005306
5307
Victor Stinner72400302016-01-28 15:41:01 +01005308static PyObject*
5309sock_decode_hostname(const char *name)
5310{
5311#ifdef MS_WINDOWS
5312 /* Issue #26227: gethostbyaddr() returns a string encoded
5313 * to the ANSI code page */
5314 return PyUnicode_DecodeFSDefault(name);
5315#else
5316 /* Decode from UTF-8 */
5317 return PyUnicode_FromString(name);
5318#endif
5319}
5320
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005321/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5322
5323static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005324gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 char **pch;
5327 PyObject *rtn_tuple = (PyObject *)NULL;
5328 PyObject *name_list = (PyObject *)NULL;
5329 PyObject *addr_list = (PyObject *)NULL;
5330 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005331 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 if (h == NULL) {
5334 /* Let's get real error message to return */
5335 set_herror(h_errno);
5336 return NULL;
5337 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 if (h->h_addrtype != af) {
5340 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005341 errno = EAFNOSUPPORT;
5342 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 return NULL;
5344 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 case AF_INET:
5349 if (alen < sizeof(struct sockaddr_in))
5350 return NULL;
5351 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005352
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005353#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 case AF_INET6:
5355 if (alen < sizeof(struct sockaddr_in6))
5356 return NULL;
5357 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 if ((name_list = PyList_New(0)) == NULL)
5363 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 if ((addr_list = PyList_New(0)) == NULL)
5366 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 /* SF #1511317: h_aliases can be NULL */
5369 if (h->h_aliases) {
5370 for (pch = h->h_aliases; *pch != NULL; pch++) {
5371 int status;
5372 tmp = PyUnicode_FromString(*pch);
5373 if (tmp == NULL)
5374 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 status = PyList_Append(name_list, tmp);
5377 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 if (status)
5380 goto err;
5381 }
5382 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5385 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 case AF_INET:
5390 {
5391 struct sockaddr_in sin;
5392 memset(&sin, 0, sizeof(sin));
5393 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005398 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 if (pch == h->h_addr_list && alen >= sizeof(sin))
5401 memcpy((char *) addr, &sin, sizeof(sin));
5402 break;
5403 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005404
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005405#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 case AF_INET6:
5407 {
5408 struct sockaddr_in6 sin6;
5409 memset(&sin6, 0, sizeof(sin6));
5410 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005411#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Коренберг Марк7766b962018-02-13 00:47:42 +05005415 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5418 memcpy((char *) addr, &sin6, sizeof(sin6));
5419 break;
5420 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005421#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005424 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 "unsupported address family");
5426 return NULL;
5427 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 if (tmp == NULL)
5430 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 status = PyList_Append(addr_list, tmp);
5433 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 if (status)
5436 goto err;
5437 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005438
Victor Stinner72400302016-01-28 15:41:01 +01005439 name = sock_decode_hostname(h->h_name);
5440 if (name == NULL)
5441 goto err;
5442 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005443
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005444 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 Py_XDECREF(name_list);
5446 Py_XDECREF(addr_list);
5447 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005448}
5449
5450
5451/* Python interface to gethostbyname_ex(name). */
5452
5453/*ARGSUSED*/
5454static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005455socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 char *name;
5458 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005459 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005461 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005462#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005464#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005466#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 char buf[16384];
5468 int buf_len = (sizeof buf) - 1;
5469 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005470#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005471#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005473#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005474#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005475
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005476 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005478 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005479 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005481#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005482#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005483 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005485#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005487#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 memset((void *) &data, '\0', sizeof(data));
5489 result = gethostbyname_r(name, &hp_allocated, &data);
5490 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005491#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005492#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005493#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005495#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005496 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005498#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 Py_END_ALLOW_THREADS
5500 /* Some C libraries would require addr.__ss_family instead of
5501 addr.ss_family.
5502 Therefore, we cast the sockaddr_storage into sockaddr to
5503 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005504 sa = SAS2SA(&addr);
5505 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005507#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005509#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005510finally:
5511 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005513}
5514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005515PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005516"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5517\n\
5518Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005519for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005520
5521
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005522/* Python interface to gethostbyaddr(IP). */
5523
5524/*ARGSUSED*/
5525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005526socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005527{
Charles-François Natali8b759652011-12-23 16:44:51 +01005528 sock_addr_t addr;
5529 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 char *ip_num;
5531 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005532 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005533#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005535#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005537#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 /* glibcs up to 2.10 assume that the buf argument to
5539 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5540 does not ensure. The attribute below instructs the compiler
5541 to maintain this alignment. */
5542 char buf[16384] Py_ALIGNED(8);
5543 int buf_len = (sizeof buf) - 1;
5544 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005545#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005546#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005548#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005549#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005550 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 int al;
5552 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005553
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005554 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 return NULL;
5556 af = AF_UNSPEC;
5557 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005558 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 af = sa->sa_family;
5560 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005561 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 switch (af) {
5563 case AF_INET:
5564 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5565 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5566 break;
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 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5570 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5571 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005573 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005574 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005575 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 }
5577 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005578#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005579#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005580 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 &hp_allocated, buf, buf_len,
5582 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005583#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 h = gethostbyaddr_r(ap, al, af,
5585 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005586#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 memset((void *) &data, '\0', sizeof(data));
5588 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5589 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005590#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005591#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005592#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005594#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005595 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005597#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005599 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005600#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005602#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005603finally:
5604 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005606}
5607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005608PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005609"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5610\n\
5611Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005612for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005613
Guido van Rossum30a685f1991-06-27 15:51:29 +00005614
5615/* Python interface to getservbyname(name).
5616 This only returns the port number, since the other info is already
5617 known or not useful (like the list of aliases). */
5618
5619/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005621socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005622{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005623 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 struct servent *sp;
5625 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5626 return NULL;
5627 Py_BEGIN_ALLOW_THREADS
5628 sp = getservbyname(name, proto);
5629 Py_END_ALLOW_THREADS
5630 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005631 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 return NULL;
5633 }
5634 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005635}
5636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005637PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005638"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005639\n\
5640Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005641The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5642otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005643
Guido van Rossum30a685f1991-06-27 15:51:29 +00005644
Barry Warsaw11b91a02004-06-28 00:50:43 +00005645/* Python interface to getservbyport(port).
5646 This only returns the service name, since the other info is already
5647 known or not useful (like the list of aliases). */
5648
5649/*ARGSUSED*/
5650static PyObject *
5651socket_getservbyport(PyObject *self, PyObject *args)
5652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005654 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 struct servent *sp;
5656 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5657 return NULL;
5658 if (port < 0 || port > 0xffff) {
5659 PyErr_SetString(
5660 PyExc_OverflowError,
5661 "getservbyport: port must be 0-65535.");
5662 return NULL;
5663 }
5664 Py_BEGIN_ALLOW_THREADS
5665 sp = getservbyport(htons((short)port), proto);
5666 Py_END_ALLOW_THREADS
5667 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005668 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 return NULL;
5670 }
5671 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005672}
5673
5674PyDoc_STRVAR(getservbyport_doc,
5675"getservbyport(port[, protocolname]) -> string\n\
5676\n\
5677Return the service name from a port number and protocol name.\n\
5678The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5679otherwise any protocol will match.");
5680
Guido van Rossum3901d851996-12-19 16:35:04 +00005681/* Python interface to getprotobyname(name).
5682 This only returns the protocol number, since the other info is
5683 already known or not useful (like the list of aliases). */
5684
5685/*ARGSUSED*/
5686static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005687socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005688{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005689 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 struct protoent *sp;
5691 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5692 return NULL;
5693 Py_BEGIN_ALLOW_THREADS
5694 sp = getprotobyname(name);
5695 Py_END_ALLOW_THREADS
5696 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005697 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 return NULL;
5699 }
5700 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005701}
5702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005703PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005704"getprotobyname(name) -> integer\n\
5705\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005706Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005707
Christian Heimesd0e31b92018-01-27 09:54:13 +01005708static PyObject *
5709socket_close(PyObject *self, PyObject *fdobj)
5710{
5711 SOCKET_T fd;
5712 int res;
5713
5714 fd = PyLong_AsSocket_t(fdobj);
5715 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5716 return NULL;
5717 Py_BEGIN_ALLOW_THREADS
5718 res = SOCKETCLOSE(fd);
5719 Py_END_ALLOW_THREADS
5720 /* bpo-30319: The peer can already have closed the connection.
5721 Python ignores ECONNRESET on close(). */
5722 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5723 return set_error();
5724 }
5725 Py_RETURN_NONE;
5726}
5727
5728PyDoc_STRVAR(close_doc,
5729"close(integer) -> None\n\
5730\n\
5731Close an integer socket file descriptor. This is like os.close(), but for\n\
5732sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005733
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005734#ifndef NO_DUP
5735/* dup() function for socket fds */
5736
5737static PyObject *
5738socket_dup(PyObject *self, PyObject *fdobj)
5739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 SOCKET_T fd, newfd;
5741 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005742#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005743 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005744#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 fd = PyLong_AsSocket_t(fdobj);
5747 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5748 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005749
Victor Stinnerdaf45552013-08-28 00:53:59 +02005750#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005751 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005752 return set_error();
5753
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005754 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005755 FROM_PROTOCOL_INFO,
5756 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 if (newfd == INVALID_SOCKET)
5758 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005759
Victor Stinnerdaf45552013-08-28 00:53:59 +02005760 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5761 closesocket(newfd);
5762 PyErr_SetFromWindowsErr(0);
5763 return NULL;
5764 }
5765#else
5766 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5767 newfd = _Py_dup(fd);
5768 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005769 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005770#endif
5771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005772 newfdobj = PyLong_FromSocket_t(newfd);
5773 if (newfdobj == NULL)
5774 SOCKETCLOSE(newfd);
5775 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005776}
5777
5778PyDoc_STRVAR(dup_doc,
5779"dup(integer) -> integer\n\
5780\n\
5781Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5782sockets; on some platforms os.dup() won't work for socket file descriptors.");
5783#endif
5784
5785
Dave Cole331708b2004-08-09 04:51:41 +00005786#ifdef HAVE_SOCKETPAIR
5787/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005788 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005789 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005790
5791/*ARGSUSED*/
5792static PyObject *
5793socket_socketpair(PyObject *self, PyObject *args)
5794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 PySocketSockObject *s0 = NULL, *s1 = NULL;
5796 SOCKET_T sv[2];
5797 int family, type = SOCK_STREAM, proto = 0;
5798 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005799#ifdef SOCK_CLOEXEC
5800 int *atomic_flag_works = &sock_cloexec_works;
5801#else
5802 int *atomic_flag_works = NULL;
5803#endif
5804 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005805
5806#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005808#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5812 &family, &type, &proto))
5813 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005816 Py_BEGIN_ALLOW_THREADS
5817#ifdef SOCK_CLOEXEC
5818 if (sock_cloexec_works != 0) {
5819 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5820 if (sock_cloexec_works == -1) {
5821 if (ret >= 0) {
5822 sock_cloexec_works = 1;
5823 }
5824 else if (errno == EINVAL) {
5825 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5826 sock_cloexec_works = 0;
5827 ret = socketpair(family, type, proto, sv);
5828 }
5829 }
5830 }
5831 else
5832#endif
5833 {
5834 ret = socketpair(family, type, proto, sv);
5835 }
5836 Py_END_ALLOW_THREADS
5837
5838 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005840
5841 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5842 goto finally;
5843 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5844 goto finally;
5845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 s0 = new_sockobject(sv[0], family, type, proto);
5847 if (s0 == NULL)
5848 goto finally;
5849 s1 = new_sockobject(sv[1], family, type, proto);
5850 if (s1 == NULL)
5851 goto finally;
5852 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005853
5854finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 if (res == NULL) {
5856 if (s0 == NULL)
5857 SOCKETCLOSE(sv[0]);
5858 if (s1 == NULL)
5859 SOCKETCLOSE(sv[1]);
5860 }
5861 Py_XDECREF(s0);
5862 Py_XDECREF(s1);
5863 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005864}
5865
5866PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005867"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005868\n\
5869Create a pair of socket objects from the sockets returned by the platform\n\
5870socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005871The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005872AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005873
5874#endif /* HAVE_SOCKETPAIR */
5875
5876
Guido van Rossum006bf911996-06-12 04:04:55 +00005877static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005878socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005879{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005880 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005881
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005882 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 return NULL;
5884 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005885 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005887 "ntohs: can't convert negative Python int to C "
5888 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 return NULL;
5890 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005891 if (x > 0xffff) {
5892 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5893 "ntohs: Python int too large to convert to C "
5894 "16-bit unsigned integer (The silent truncation "
5895 "is deprecated)",
5896 1)) {
5897 return NULL;
5898 }
5899 }
5900 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005901}
5902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005903PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005904"ntohs(integer) -> integer\n\
5905\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005906Convert a 16-bit unsigned integer from network to host byte order.\n\
5907Note that in case the received integer does not fit in 16-bit unsigned\n\
5908integer, but does fit in a positive C int, it is silently truncated to\n\
590916-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005910However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005911exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005912
5913
Guido van Rossum006bf911996-06-12 04:04:55 +00005914static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005915socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 if (PyLong_Check(arg)) {
5920 x = PyLong_AsUnsignedLong(arg);
5921 if (x == (unsigned long) -1 && PyErr_Occurred())
5922 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005923#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 {
5925 unsigned long y;
5926 /* only want the trailing 32 bits */
5927 y = x & 0xFFFFFFFFUL;
5928 if (y ^ x)
5929 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005930 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 x = y;
5932 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 }
5935 else
5936 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005937 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005940}
5941
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005942PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005943"ntohl(integer) -> integer\n\
5944\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005945Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005946
5947
Guido van Rossum006bf911996-06-12 04:04:55 +00005948static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005949socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005950{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005951 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005952
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005953 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 return NULL;
5955 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005956 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005958 "htons: can't convert negative Python int to C "
5959 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 return NULL;
5961 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005962 if (x > 0xffff) {
5963 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5964 "htons: Python int too large to convert to C "
5965 "16-bit unsigned integer (The silent truncation "
5966 "is deprecated)",
5967 1)) {
5968 return NULL;
5969 }
5970 }
5971 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005972}
5973
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005974PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005975"htons(integer) -> integer\n\
5976\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005977Convert a 16-bit unsigned integer from host to network byte order.\n\
5978Note that in case the received integer does not fit in 16-bit unsigned\n\
5979integer, but does fit in a positive C int, it is silently truncated to\n\
598016-bit unsigned integer.\n\
oldkaa0735f2018-02-02 16:52:55 +08005981However, this silent truncation feature is deprecated, and will raise an\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005982exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005983
5984
Guido van Rossum006bf911996-06-12 04:04:55 +00005985static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005986socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 if (PyLong_Check(arg)) {
5991 x = PyLong_AsUnsignedLong(arg);
5992 if (x == (unsigned long) -1 && PyErr_Occurred())
5993 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005994#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 {
5996 unsigned long y;
5997 /* only want the trailing 32 bits */
5998 y = x & 0xFFFFFFFFUL;
5999 if (y ^ x)
6000 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006001 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006002 x = y;
6003 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00006004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 }
6006 else
6007 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03006008 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 Py_TYPE(arg)->tp_name);
6010 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00006011}
6012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006013PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00006014"htonl(integer) -> integer\n\
6015\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006016Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006017
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006018/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006020PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006021"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006022\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006023Convert 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 +00006024binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006025
6026static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006027socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006028{
Neal Norwitz88f115b2003-02-13 02:15:42 +00006029#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00006031#endif
6032
6033#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00006034#if (SIZEOF_INT != 4)
6035#error "Not sure if in_addr_t exists and int is not 32-bits."
6036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 /* Have to use inet_addr() instead */
6038 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00006039#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02006040 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
6043 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006044
Tim Peters1df9fdd2003-02-13 03:13:40 +00006045
6046#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00006047
6048#ifdef USE_INET_ATON_WEAKLINK
6049 if (inet_aton != NULL) {
6050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 if (inet_aton(ip_addr, &buf))
6052 return PyBytes_FromStringAndSize((char *)(&buf),
6053 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006054
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006055 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 "illegal IP address string passed to inet_aton");
6057 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006058
Thomas Wouters477c8d52006-05-27 19:21:47 +00006059#ifdef USE_INET_ATON_WEAKLINK
6060 } else {
6061#endif
6062
6063#endif
6064
6065#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 /* special-case this address as inet_addr might return INADDR_NONE
6068 * for this */
6069 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006070 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006072
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006073 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006077 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 "illegal IP address string passed to inet_aton");
6079 return NULL;
6080 }
6081 }
6082 return PyBytes_FromStringAndSize((char *) &packed_addr,
6083 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006084
6085#ifdef USE_INET_ATON_WEAKLINK
6086 }
6087#endif
6088
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006089#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006090}
6091
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006092PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006093"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006094\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006095Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006096
6097static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006098socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006099{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006100 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006102
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006103 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 return NULL;
6105 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006106
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006107 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006108 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006110 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 return NULL;
6112 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006113
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006114 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6115 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006116
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006117 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006119}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006120
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006121#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006122
6123PyDoc_STRVAR(inet_pton_doc,
6124"inet_pton(af, ip) -> packed IP address string\n\
6125\n\
6126Convert an IP address from string format to a packed string suitable\n\
6127for use with low-level network functions.");
6128
6129static PyObject *
6130socket_inet_pton(PyObject *self, PyObject *args)
6131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006133 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006135#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006136 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006137#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006139#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6141 return NULL;
6142 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006143
Martin v. Löwis04697e82004-06-02 12:35:29 +00006144#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006146 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 "can't use AF_INET6, IPv6 is disabled");
6148 return NULL;
6149 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006150#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 retval = inet_pton(af, ip, packed);
6153 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006154 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 return NULL;
6156 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006157 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 "illegal IP address string passed to inet_pton");
6159 return NULL;
6160 } else if (af == AF_INET) {
6161 return PyBytes_FromStringAndSize(packed,
6162 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006163#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 } else if (af == AF_INET6) {
6165 return PyBytes_FromStringAndSize(packed,
6166 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006169 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 return NULL;
6171 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006172}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006173
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006174PyDoc_STRVAR(inet_ntop_doc,
6175"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6176\n\
6177Convert a packed IP address of the given family to string format.");
6178
6179static PyObject *
6180socket_inet_ntop(PyObject *self, PyObject *args)
6181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006183 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006185#ifdef ENABLE_IPV6
Коренберг Марк7766b962018-02-13 00:47:42 +05006186 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006187#else
Коренберг Марк7766b962018-02-13 00:47:42 +05006188 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006189#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006190
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006191 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 return NULL;
6193 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006196 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197 PyErr_SetString(PyExc_ValueError,
6198 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006199 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 return NULL;
6201 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006202#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006204 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 PyErr_SetString(PyExc_ValueError,
6206 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006207 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 return NULL;
6209 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211 } else {
6212 PyErr_Format(PyExc_ValueError,
6213 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006214 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215 return NULL;
6216 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006217
Коренберг Марк7766b962018-02-13 00:47:42 +05006218 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006219 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6220 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006222 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 return NULL;
6224 } else {
6225 return PyUnicode_FromString(retval);
6226 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006227}
6228
6229#endif /* HAVE_INET_PTON */
6230
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006231/* Python interface to getaddrinfo(host, port). */
6232
6233/*ARGSUSED*/
6234static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006235socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006236{
Victor Stinner77af1722011-05-26 14:05:59 +02006237 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006238 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 struct addrinfo hints, *res;
6240 struct addrinfo *res0 = NULL;
6241 PyObject *hobj = NULL;
6242 PyObject *pobj = (PyObject *)NULL;
6243 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006244 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 int family, socktype, protocol, flags;
6246 int error;
6247 PyObject *all = (PyObject *)NULL;
6248 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006249
Georg Brandl6083a4b2013-10-14 06:51:46 +02006250 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006252 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006253 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 &protocol, &flags)) {
6255 return NULL;
6256 }
6257 if (hobj == Py_None) {
6258 hptr = NULL;
6259 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006260 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 if (!idna)
6262 return NULL;
6263 assert(PyBytes_Check(idna));
6264 hptr = PyBytes_AS_STRING(idna);
6265 } else if (PyBytes_Check(hobj)) {
6266 hptr = PyBytes_AsString(hobj);
6267 } else {
6268 PyErr_SetString(PyExc_TypeError,
6269 "getaddrinfo() argument 1 must be string or None");
6270 return NULL;
6271 }
6272 if (PyLong_CheckExact(pobj)) {
6273 long value = PyLong_AsLong(pobj);
6274 if (value == -1 && PyErr_Occurred())
6275 goto err;
6276 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6277 pptr = pbuf;
6278 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006279 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006280 if (pptr == NULL)
6281 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006283 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 } else if (pobj == Py_None) {
6285 pptr = (char *)NULL;
6286 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006287 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 goto err;
6289 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006290#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006291 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Leo Ariasc3d95082018-02-03 18:36:10 -06006292 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006293 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6294 * This workaround avoids a segfault in libsystem.
6295 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006296 pptr = "00";
6297 }
6298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 memset(&hints, 0, sizeof(hints));
6300 hints.ai_family = family;
6301 hints.ai_socktype = socktype;
6302 hints.ai_protocol = protocol;
6303 hints.ai_flags = flags;
6304 Py_BEGIN_ALLOW_THREADS
6305 ACQUIRE_GETADDRINFO_LOCK
6306 error = getaddrinfo(hptr, pptr, &hints, &res0);
6307 Py_END_ALLOW_THREADS
6308 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6309 if (error) {
6310 set_gaierror(error);
6311 goto err;
6312 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006313
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006314 all = PyList_New(0);
6315 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316 goto err;
6317 for (res = res0; res; res = res->ai_next) {
6318 PyObject *single;
6319 PyObject *addr =
6320 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6321 if (addr == NULL)
6322 goto err;
6323 single = Py_BuildValue("iiisO", res->ai_family,
6324 res->ai_socktype, res->ai_protocol,
6325 res->ai_canonname ? res->ai_canonname : "",
6326 addr);
6327 Py_DECREF(addr);
6328 if (single == NULL)
6329 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 if (PyList_Append(all, single))
6332 goto err;
6333 Py_XDECREF(single);
6334 }
6335 Py_XDECREF(idna);
6336 if (res0)
6337 freeaddrinfo(res0);
6338 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006339 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340 Py_XDECREF(all);
6341 Py_XDECREF(idna);
6342 if (res0)
6343 freeaddrinfo(res0);
6344 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006345}
6346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006347PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006348"getaddrinfo(host, port [, family, type, proto, flags])\n\
6349 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006350\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006351Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006352
6353/* Python interface to getnameinfo(sa, flags). */
6354
6355/*ARGSUSED*/
6356static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006357socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 PyObject *sa = (PyObject *)NULL;
6360 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006361 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006362 int port;
6363 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6365 struct addrinfo hints, *res = NULL;
6366 int error;
6367 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006368 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 flags = flowinfo = scope_id = 0;
6371 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6372 return NULL;
6373 if (!PyTuple_Check(sa)) {
6374 PyErr_SetString(PyExc_TypeError,
6375 "getnameinfo() argument 1 must be a tuple");
6376 return NULL;
6377 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006378 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006380 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006382 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006383 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006384 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006385 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006386 return NULL;
6387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6389 memset(&hints, 0, sizeof(hints));
6390 hints.ai_family = AF_UNSPEC;
6391 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006392 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393 Py_BEGIN_ALLOW_THREADS
6394 ACQUIRE_GETADDRINFO_LOCK
6395 error = getaddrinfo(hostp, pbuf, &hints, &res);
6396 Py_END_ALLOW_THREADS
6397 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6398 if (error) {
6399 set_gaierror(error);
6400 goto fail;
6401 }
6402 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006403 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 "sockaddr resolved to multiple addresses");
6405 goto fail;
6406 }
6407 switch (res->ai_family) {
6408 case AF_INET:
6409 {
6410 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006411 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412 "IPv4 sockaddr must be 2 tuple");
6413 goto fail;
6414 }
6415 break;
6416 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006417#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418 case AF_INET6:
6419 {
6420 struct sockaddr_in6 *sin6;
6421 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006422 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 sin6->sin6_scope_id = scope_id;
6424 break;
6425 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006428 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6430 if (error) {
6431 set_gaierror(error);
6432 goto fail;
6433 }
Victor Stinner72400302016-01-28 15:41:01 +01006434
6435 name = sock_decode_hostname(hbuf);
6436 if (name == NULL)
6437 goto fail;
6438 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006439
6440fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 if (res)
6442 freeaddrinfo(res);
6443 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006444}
6445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006446PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006447"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006448\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006449Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006450
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006451
6452/* Python API to getting and setting the default timeout value. */
6453
6454static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306455socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006456{
Victor Stinner71694d52015-03-28 01:18:54 +01006457 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006458 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 }
Victor Stinner71694d52015-03-28 01:18:54 +01006460 else {
6461 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6462 return PyFloat_FromDouble(seconds);
6463 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006464}
6465
6466PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006467"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006468\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006469Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006470A value of None indicates that new socket objects have no timeout.\n\
6471When the socket module is first imported, the default is None.");
6472
6473static PyObject *
6474socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6475{
Victor Stinner71694d52015-03-28 01:18:54 +01006476 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006477
Victor Stinner71694d52015-03-28 01:18:54 +01006478 if (socket_parse_timeout(&timeout, arg) < 0)
6479 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006482
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006483 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006484}
6485
6486PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006487"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006488\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006489Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006490A value of None indicates that new socket objects have no timeout.\n\
6491When the socket module is first imported, the default is None.");
6492
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006493#ifdef HAVE_IF_NAMEINDEX
6494/* Python API for getting interface indices and names */
6495
6496static PyObject *
6497socket_if_nameindex(PyObject *self, PyObject *arg)
6498{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006499 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006500 int i;
6501 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006502
Charles-François Natali60713592011-05-20 16:55:06 +02006503 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006504 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006505 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006506 return NULL;
6507 }
6508
6509 list = PyList_New(0);
6510 if (list == NULL) {
6511 if_freenameindex(ni);
6512 return NULL;
6513 }
6514
Charles-François Natali60713592011-05-20 16:55:06 +02006515 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6516 PyObject *ni_tuple = Py_BuildValue("IO&",
6517 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006518
6519 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6520 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006521 Py_DECREF(list);
6522 if_freenameindex(ni);
6523 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006524 }
6525 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006526 }
6527
6528 if_freenameindex(ni);
6529 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006530}
6531
6532PyDoc_STRVAR(if_nameindex_doc,
6533"if_nameindex()\n\
6534\n\
6535Returns a list of network interface information (index, name) tuples.");
6536
Charles-François Natali60713592011-05-20 16:55:06 +02006537static PyObject *
6538socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006539{
Charles-François Natali60713592011-05-20 16:55:06 +02006540 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006541 unsigned long index;
6542
Charles-François Natali60713592011-05-20 16:55:06 +02006543 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6544 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006545 return NULL;
6546
Charles-François Natali60713592011-05-20 16:55:06 +02006547 index = if_nametoindex(PyBytes_AS_STRING(oname));
6548 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006549 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006550 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006551 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006552 return NULL;
6553 }
6554
6555 return PyLong_FromUnsignedLong(index);
6556}
6557
6558PyDoc_STRVAR(if_nametoindex_doc,
6559"if_nametoindex(if_name)\n\
6560\n\
6561Returns the interface index corresponding to the interface name if_name.");
6562
Charles-François Natali60713592011-05-20 16:55:06 +02006563static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006564socket_if_indextoname(PyObject *self, PyObject *arg)
6565{
Charles-François Natali60713592011-05-20 16:55:06 +02006566 unsigned long index;
6567 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006568
Charles-François Natali60713592011-05-20 16:55:06 +02006569 index = PyLong_AsUnsignedLong(arg);
6570 if (index == (unsigned long) -1)
6571 return NULL;
6572
6573 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006574 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006575 return NULL;
6576 }
6577
Charles-François Natali60713592011-05-20 16:55:06 +02006578 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006579}
6580
6581PyDoc_STRVAR(if_indextoname_doc,
6582"if_indextoname(if_index)\n\
6583\n\
6584Returns the interface name corresponding to the interface index if_index.");
6585
6586#endif /* HAVE_IF_NAMEINDEX */
6587
6588
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006589#ifdef CMSG_LEN
6590/* Python interface to CMSG_LEN(length). */
6591
6592static PyObject *
6593socket_CMSG_LEN(PyObject *self, PyObject *args)
6594{
6595 Py_ssize_t length;
6596 size_t result;
6597
6598 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6599 return NULL;
6600 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6601 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6602 return NULL;
6603 }
6604 return PyLong_FromSize_t(result);
6605}
6606
6607PyDoc_STRVAR(CMSG_LEN_doc,
6608"CMSG_LEN(length) -> control message length\n\
6609\n\
6610Return the total length, without trailing padding, of an ancillary\n\
6611data item with associated data of the given length. This value can\n\
6612often be used as the buffer size for recvmsg() to receive a single\n\
6613item of ancillary data, but RFC 3542 requires portable applications to\n\
6614use CMSG_SPACE() and thus include space for padding, even when the\n\
6615item will be the last in the buffer. Raises OverflowError if length\n\
6616is outside the permissible range of values.");
6617
6618
6619#ifdef CMSG_SPACE
6620/* Python interface to CMSG_SPACE(length). */
6621
6622static PyObject *
6623socket_CMSG_SPACE(PyObject *self, PyObject *args)
6624{
6625 Py_ssize_t length;
6626 size_t result;
6627
6628 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6629 return NULL;
6630 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6631 PyErr_SetString(PyExc_OverflowError,
6632 "CMSG_SPACE() argument out of range");
6633 return NULL;
6634 }
6635 return PyLong_FromSize_t(result);
6636}
6637
6638PyDoc_STRVAR(CMSG_SPACE_doc,
6639"CMSG_SPACE(length) -> buffer size\n\
6640\n\
6641Return the buffer size needed for recvmsg() to receive an ancillary\n\
6642data item with associated data of the given length, along with any\n\
6643trailing padding. The buffer space needed to receive multiple items\n\
6644is the sum of the CMSG_SPACE() values for their associated data\n\
6645lengths. Raises OverflowError if length is outside the permissible\n\
6646range of values.");
6647#endif /* CMSG_SPACE */
6648#endif /* CMSG_LEN */
6649
6650
Guido van Rossum30a685f1991-06-27 15:51:29 +00006651/* List of functions exported by this module. */
6652
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006653static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654 {"gethostbyname", socket_gethostbyname,
6655 METH_VARARGS, gethostbyname_doc},
6656 {"gethostbyname_ex", socket_gethostbyname_ex,
6657 METH_VARARGS, ghbn_ex_doc},
6658 {"gethostbyaddr", socket_gethostbyaddr,
6659 METH_VARARGS, gethostbyaddr_doc},
6660 {"gethostname", socket_gethostname,
6661 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006662#ifdef HAVE_SETHOSTNAME
6663 {"sethostname", socket_sethostname,
6664 METH_VARARGS, sethostname_doc},
6665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666 {"getservbyname", socket_getservbyname,
6667 METH_VARARGS, getservbyname_doc},
6668 {"getservbyport", socket_getservbyport,
6669 METH_VARARGS, getservbyport_doc},
6670 {"getprotobyname", socket_getprotobyname,
6671 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006672 {"close", socket_close,
6673 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006674#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 {"dup", socket_dup,
6676 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006677#endif
Dave Cole331708b2004-08-09 04:51:41 +00006678#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 {"socketpair", socket_socketpair,
6680 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006681#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 {"ntohs", socket_ntohs,
6683 METH_VARARGS, ntohs_doc},
6684 {"ntohl", socket_ntohl,
6685 METH_O, ntohl_doc},
6686 {"htons", socket_htons,
6687 METH_VARARGS, htons_doc},
6688 {"htonl", socket_htonl,
6689 METH_O, htonl_doc},
6690 {"inet_aton", socket_inet_aton,
6691 METH_VARARGS, inet_aton_doc},
6692 {"inet_ntoa", socket_inet_ntoa,
6693 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006694#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695 {"inet_pton", socket_inet_pton,
6696 METH_VARARGS, inet_pton_doc},
6697 {"inet_ntop", socket_inet_ntop,
6698 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006699#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006700 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6701 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 {"getnameinfo", socket_getnameinfo,
6703 METH_VARARGS, getnameinfo_doc},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05306704 {"getdefaulttimeout", socket_getdefaulttimeout,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 METH_NOARGS, getdefaulttimeout_doc},
6706 {"setdefaulttimeout", socket_setdefaulttimeout,
6707 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006708#ifdef HAVE_IF_NAMEINDEX
6709 {"if_nameindex", socket_if_nameindex,
6710 METH_NOARGS, if_nameindex_doc},
6711 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006712 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006713 {"if_indextoname", socket_if_indextoname,
6714 METH_O, if_indextoname_doc},
6715#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006716#ifdef CMSG_LEN
6717 {"CMSG_LEN", socket_CMSG_LEN,
6718 METH_VARARGS, CMSG_LEN_doc},
6719#ifdef CMSG_SPACE
6720 {"CMSG_SPACE", socket_CMSG_SPACE,
6721 METH_VARARGS, CMSG_SPACE_doc},
6722#endif
6723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006725};
6726
Guido van Rossum30a685f1991-06-27 15:51:29 +00006727
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006728#ifdef MS_WINDOWS
6729#define OS_INIT_DEFINED
6730
6731/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006732
6733static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006734os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006737}
6738
6739static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006740os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 WSADATA WSAData;
6743 int ret;
6744 ret = WSAStartup(0x0101, &WSAData);
6745 switch (ret) {
6746 case 0: /* No error */
6747 Py_AtExit(os_cleanup);
6748 return 1; /* Success */
6749 case WSASYSNOTREADY:
6750 PyErr_SetString(PyExc_ImportError,
6751 "WSAStartup failed: network not ready");
6752 break;
6753 case WSAVERNOTSUPPORTED:
6754 case WSAEINVAL:
6755 PyErr_SetString(
6756 PyExc_ImportError,
6757 "WSAStartup failed: requested version not supported");
6758 break;
6759 default:
6760 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6761 break;
6762 }
6763 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006764}
6765
Guido van Rossum8d665e61996-06-26 18:22:49 +00006766#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006767
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006768
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006769
6770#ifndef OS_INIT_DEFINED
6771static int
6772os_init(void)
6773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006775}
6776#endif
6777
6778
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006779/* C API table - always add new things to the end for binary
6780 compatibility. */
6781static
6782PySocketModule_APIObject PySocketModuleAPI =
6783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006785 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006787};
6788
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006789
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006790/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006791
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006792 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006793 "socket.py" which implements some additional functionality.
6794 The import of "_socket" may fail with an ImportError exception if
6795 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006796 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006797 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006798*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006799
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006800PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006801"Implementation module for socket operations.\n\
6802\n\
6803See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006804
Martin v. Löwis1a214512008-06-11 05:26:20 +00006805static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 PyModuleDef_HEAD_INIT,
6807 PySocket_MODULE_NAME,
6808 socket_doc,
6809 -1,
6810 socket_methods,
6811 NULL,
6812 NULL,
6813 NULL,
6814 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006815};
6816
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006817PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006818PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 if (!os_init())
6823 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006824
Victor Stinnerdaf45552013-08-28 00:53:59 +02006825#ifdef MS_WINDOWS
6826 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006827 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006828 }
6829#endif
6830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006831 Py_TYPE(&sock_type) = &PyType_Type;
6832 m = PyModule_Create(&socketmodule);
6833 if (m == NULL)
6834 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006835
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006836 Py_INCREF(PyExc_OSError);
6837 PySocketModuleAPI.error = PyExc_OSError;
6838 Py_INCREF(PyExc_OSError);
6839 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006841 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 if (socket_herror == NULL)
6843 return NULL;
6844 Py_INCREF(socket_herror);
6845 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006846 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 NULL);
6848 if (socket_gaierror == NULL)
6849 return NULL;
6850 Py_INCREF(socket_gaierror);
6851 PyModule_AddObject(m, "gaierror", socket_gaierror);
6852 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006853 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854 if (socket_timeout == NULL)
6855 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006856 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 Py_INCREF(socket_timeout);
6858 PyModule_AddObject(m, "timeout", socket_timeout);
6859 Py_INCREF((PyObject *)&sock_type);
6860 if (PyModule_AddObject(m, "SocketType",
6861 (PyObject *)&sock_type) != 0)
6862 return NULL;
6863 Py_INCREF((PyObject *)&sock_type);
6864 if (PyModule_AddObject(m, "socket",
6865 (PyObject *)&sock_type) != 0)
6866 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006867
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006868#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006870#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 Py_INCREF(has_ipv6);
6874 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 /* Export C API */
6877 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6878 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6879 ) != 0)
6880 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006883#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006885#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006887#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006889#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006890#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006893#endif
6894#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006896#endif
6897#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006898 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006900#endif
6901#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006904#endif
6905#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006908#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006909#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006912#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006913#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006914 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006916#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006917#ifdef HAVE_SOCKADDR_ALG
6918 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6919#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006920#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006923#endif
6924#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006926#endif
6927#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006930#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006931#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006934#endif
6935#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006938#endif
6939#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006942#endif
6943#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006946#endif
6947#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, AF_NETLINK);
6950 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006951#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006953#endif
6954#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006956#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6958 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006959#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006961#endif
6962#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006964#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006965#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006967#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006968#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006970#endif
6971#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006973#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006975#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006977#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006978#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006980#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006981#ifdef NETLINK_CRYPTO
6982 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6983#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006984#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006985
6986#ifdef AF_VSOCK
6987 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6988 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6989 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6990 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6991 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6992 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6993 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6994 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6995 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6996#endif
6997
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006998#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006999 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007001#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02007002#ifdef AF_LINK
7003 PyModule_AddIntMacro(m, AF_LINK);
7004#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007005#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007006 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007008#endif
7009#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007012#endif
7013#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007016#endif
7017#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007020#endif
7021#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007022 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007024#endif
7025#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007026 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007028#endif
7029#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007032#endif
7033#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00007036#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00007037
Hye-Shik Chang81268602004-02-02 06:05:24 +00007038#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, AF_BLUETOOTH);
7040 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
7041 PyModule_AddIntMacro(m, BTPROTO_HCI);
7042 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007043#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007045#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00007046#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007047#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00007049#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, HCI_DATA_DIR);
7051 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00007052#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7055 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007056#endif
7057
Charles-François Natali47413c12011-10-06 19:47:44 +02007058#ifdef AF_CAN
7059 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007061#endif
7062#ifdef PF_CAN
7063 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007065#endif
7066
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007067/* Reliable Datagram Sockets */
7068#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007070#endif
7071#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007073#endif
7074
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007075/* Kernel event messages */
7076#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007078#endif
7079#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007081#endif
7082
Antoine Pitroub156a462010-10-27 20:13:57 +00007083#ifdef AF_PACKET
7084 PyModule_AddIntMacro(m, AF_PACKET);
7085#endif
7086#ifdef PF_PACKET
7087 PyModule_AddIntMacro(m, PF_PACKET);
7088#endif
7089#ifdef PACKET_HOST
7090 PyModule_AddIntMacro(m, PACKET_HOST);
7091#endif
7092#ifdef PACKET_BROADCAST
7093 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7094#endif
7095#ifdef PACKET_MULTICAST
7096 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7097#endif
7098#ifdef PACKET_OTHERHOST
7099 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7100#endif
7101#ifdef PACKET_OUTGOING
7102 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7103#endif
7104#ifdef PACKET_LOOPBACK
7105 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7106#endif
7107#ifdef PACKET_FASTROUTE
7108 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007109#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007110
Christian Heimes043d6f62008-01-07 17:19:16 +00007111#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007114 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7116 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7117 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007118
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7120 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7121 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, SOL_TIPC);
7125 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7126 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7127 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7128 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007129
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7131 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7132 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7133 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007135 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7137 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007138#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007141#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7143 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7144 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7145 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7146 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7147 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007148#endif
7149
Christian Heimesdffa3942016-09-05 23:54:41 +02007150#ifdef HAVE_SOCKADDR_ALG
7151 /* Socket options */
7152 PyModule_AddIntMacro(m, ALG_SET_KEY);
7153 PyModule_AddIntMacro(m, ALG_SET_IV);
7154 PyModule_AddIntMacro(m, ALG_SET_OP);
7155 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7156 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7157 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7158
7159 /* Operations */
7160 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7161 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7162 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7163 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7164#endif
7165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, SOCK_STREAM);
7168 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007169/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007170#ifdef SOCK_RAW
7171 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007173#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007175#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007177#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007178#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007180#endif
7181#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007183#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007193#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007194#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007196#endif
7197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007215#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007216#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007219#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007221#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007247#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007248#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007250#endif
7251#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007253#endif
7254#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007256#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007257#ifdef SO_PASSSEC
7258 PyModule_AddIntMacro(m, SO_PASSSEC);
7259#endif
7260#ifdef SO_PEERSEC
7261 PyModule_AddIntMacro(m, SO_PEERSEC);
7262#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007263#ifdef SO_BINDTODEVICE
7264 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7265#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007266#ifdef SO_PRIORITY
7267 PyModule_AddIntMacro(m, SO_PRIORITY);
7268#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007269#ifdef SO_MARK
7270 PyModule_AddIntMacro(m, SO_MARK);
7271#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007272#ifdef SO_DOMAIN
7273 PyModule_AddIntMacro(m, SO_DOMAIN);
7274#endif
7275#ifdef SO_PROTOCOL
7276 PyModule_AddIntMacro(m, SO_PROTOCOL);
7277#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279 /* Maximum number of connections for "listen" */
7280#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#endif
7285
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007286 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007287#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007289#endif
7290#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#endif
7293#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007295#endif
7296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 /* Flags for send, recv */
7298#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007299 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007314 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007317 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007319#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007323 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007325#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007326 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007327#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007328#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007329 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007330#endif
7331#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007333#endif
7334#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007335 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007336#endif
7337#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007338 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007339#endif
7340#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007342#endif
7343#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007345#endif
7346#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007347 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007348#endif
7349#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007350 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007351#endif
7352#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007354#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007355#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007356 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007357#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007359 /* Protocol level and numbers, usable for [gs]etsockopt */
7360#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007365#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007368#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007371#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007372 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007374#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007375 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007376#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007377#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007378 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007380#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007385#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007390#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007391 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007392#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007393#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007395#endif
7396#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7398 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007399#endif
7400#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7402 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7403 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007404
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7406 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7407 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007408#ifdef CAN_ISOTP
7409 PyModule_AddIntMacro(m, CAN_ISOTP);
7410#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007411#endif
7412#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7414 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7415 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7416 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007417#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007418#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7419 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7420#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007421#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007423 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7424 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7425 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7426 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7427 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7428 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7429 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7430 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7431 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7432 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7433 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7434 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7435#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007436#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007438#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007439#ifdef HAVE_SOCKADDR_ALG
7440 PyModule_AddIntMacro(m, SOL_ALG);
7441#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007442#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007444#endif
7445#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007447#endif
7448#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007450#endif
7451#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007453#endif
7454#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007456#endif
7457#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007462#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007463 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007465#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007470#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007479#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007482#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007485#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007488#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007490#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007491 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007501#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007504#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007507#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007510#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007513#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007516#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007519#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007522#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007525#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007531#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007534#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007537#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007538 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007541 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007543#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007544 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007546#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007550 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007552#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007555#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007556 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007558#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007560#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007561#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007564#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007566#endif
7567/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007568#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007569 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007570#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007571 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007573#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007575#endif
7576
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007577#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007578 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007579#endif
7580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007581 /* Some port configuration */
7582#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007587#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007590 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007591#endif
7592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007593 /* Some reserved IP v.4 addresses */
7594#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007596#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007599#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007601#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007602 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007604#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007607 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007611#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007614#ifdef INADDR_ALLHOSTS_GROUP
7615 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7616 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007617#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007620#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007623 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007625#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007627#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007628 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007629#endif
7630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007631 /* IPv4 [gs]etsockopt options */
7632#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007641#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007651 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007654 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007656#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007660 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007662#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007663 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007665#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007666 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007669 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007671#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007672 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007674#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007675 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007677#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007678 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007679#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007680#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007682#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007684 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7685#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007688#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007691#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007694#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007696#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007697#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007700#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007704#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007705 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007706#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007707 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007708#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007709 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007710#endif
7711#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007712 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007713#endif
7714#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007715 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007716#endif
7717#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007719#endif
7720#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007722#endif
7723#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007725#endif
7726#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007728#endif
7729#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007731#endif
7732#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007734#endif
7735#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007737#endif
7738#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007740#endif
7741#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007743#endif
7744#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007746#endif
7747#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007749#endif
7750#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007751 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007752#endif
7753#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007755#endif
7756#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007757 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007758#endif
7759#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007760 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007761#endif
7762#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007763 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007764#endif
7765#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007766 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007767#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007769 /* TCP options */
7770#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007771 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007773#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007774 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007776#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007777 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007779#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007780 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007782#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007783 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007785#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007786 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007788#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007789 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007791#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007792 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007794#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007795 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007797#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007798 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007800#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007801 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007803#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007804 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007805#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007806#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007807 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007808#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007809#ifdef TCP_CONGESTION
7810 PyModule_AddIntMacro(m, TCP_CONGESTION);
7811#endif
7812#ifdef TCP_USER_TIMEOUT
7813 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7814#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007815#ifdef TCP_NOTSENT_LOWAT
7816 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7817#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007819 /* IPX options */
7820#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007821 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007822#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007823
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007824/* Reliable Datagram Sockets */
7825#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007827#endif
7828#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007830#endif
7831#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007833#endif
7834#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007836#endif
7837#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007839#endif
7840#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007842#endif
7843#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007845#endif
7846#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007848#endif
7849#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007851#endif
7852#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007854#endif
7855#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007857#endif
7858#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007860#endif
7861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007862 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007863#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007864 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007865#endif
7866#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007867 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007868#endif
7869#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007870 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007871#endif
7872#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007873 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007874#endif
7875#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007876 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007877#endif
7878#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007879 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007880#endif
7881#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007882 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007883#endif
7884#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007885 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007886#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007887#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007888 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007889#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007890#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007891 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007892#endif
7893#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007894 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007895#endif
7896#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007897 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007898#endif
7899#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007900 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007901#endif
7902#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007903 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007904#endif
7905#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007906 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007907#endif
7908#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007909 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007910#endif
7911#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007912 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007913#endif
7914#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007915 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007916#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007917#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007918 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007919#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007920#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007921 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007922#endif
7923#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007924 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007925#endif
7926#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007927 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007928#endif
7929#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007930 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007931#endif
7932#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007933 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007934#endif
7935#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007936 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007937#endif
7938#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007939 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007940#endif
7941#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007942 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007943#endif
7944#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007945 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007946#endif
7947#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007948 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007949#endif
7950#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007952#endif
7953#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007954 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007955#endif
7956#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007957 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007958#endif
7959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007960 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007961#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007962 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007963#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007965#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007966 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007967#endif
7968#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007969 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007970#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007971 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007972#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007973 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007974#endif
7975#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007976 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007977#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007978 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007979#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007980 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007981#endif
7982
Christian Heimesfaf2f632008-01-06 16:59:19 +00007983#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007984 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007985 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7986#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007987 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007988#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007989 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007990 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7991#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007992 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007993#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007994 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007995 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007996 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007997 PyObject *tmp;
7998 tmp = PyLong_FromUnsignedLong(codes[i]);
7999 if (tmp == NULL)
8000 return NULL;
8001 PyModule_AddObject(m, names[i], tmp);
8002 }
8003 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008004 PyModule_AddIntMacro(m, RCVALL_OFF);
8005 PyModule_AddIntMacro(m, RCVALL_ON);
8006 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008007#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008008 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008009#endif
8010#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02008011 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00008012#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00008013#endif /* _MSTCPIP_ */
8014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008015 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00008016#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008017 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00008018#endif
animalize19e7d482018-02-27 02:10:36 +08008019
8020#ifdef MS_WINDOWS
8021 /* remove some flags on older version Windows during run-time */
8022 remove_unusable_flags(m);
8023#endif
8024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008025 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00008026}