blob: 53bf996876265a8aa026aaff5d86913acd226eff [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 */
Miss Islington (bot)bf8e9d12018-08-16 03:29:20 -0400306#include <versionhelpers.h>
Steve Dower65e4cb12014-11-22 12:54:57 -0800307
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -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
Miss Islington (bot)5b17d7f2018-09-04 23:45:03 -0700569#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
Miss Islington (bot)04425992018-02-12 12:12:24 -08001169/* 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 *
Miss Islington (bot)04425992018-02-12 12:12:24 -08001172make_ipv4_addr(const struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173{
Miss Islington (bot)04425992018-02-12 12:12:24 -08001174 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
Miss Islington (bot)04425992018-02-12 12:12:24 -08001182#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 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001260 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 {
Miss Islington (bot)04425992018-02-12 12:12:24 -08001307 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,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 struct sockaddr *addr_ret, int *len_ret)
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,
1652 "getsockaddrarg: "
1653 "AF_NETLINK address must be tuple, not %.500s",
1654 Py_TYPE(args)->tp_name);
1655 return 0;
1656 }
1657 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1658 return 0;
1659 addr->nl_family = AF_NETLINK;
1660 addr->nl_pid = pid;
1661 addr->nl_groups = groups;
1662 *len_ret = sizeof(*addr);
1663 return 1;
1664 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001665#endif /* AF_NETLINK */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001666
caaveryeffc12f2017-09-06 18:18:10 -04001667#if defined(AF_VSOCK)
1668 case AF_VSOCK:
1669 {
1670 struct sockaddr_vm* addr;
1671 int port, cid;
1672 addr = (struct sockaddr_vm *)addr_ret;
1673 memset(addr, 0, sizeof(struct sockaddr_vm));
1674 if (!PyTuple_Check(args)) {
1675 PyErr_Format(
1676 PyExc_TypeError,
1677 "getsockaddrarg: "
1678 "AF_VSOCK address must be tuple, not %.500s",
1679 Py_TYPE(args)->tp_name);
1680 return 0;
1681 }
1682 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1683 return 0;
1684 addr->svm_family = s->sock_family;
1685 addr->svm_port = port;
1686 addr->svm_cid = cid;
1687 *len_ret = sizeof(*addr);
1688 return 1;
1689 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001690#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04001691
1692
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001693#ifdef AF_RDS
1694 case AF_RDS:
1695 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001696#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 case AF_INET:
1699 {
1700 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001701 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 int port, result;
1703 if (!PyTuple_Check(args)) {
1704 PyErr_Format(
1705 PyExc_TypeError,
1706 "getsockaddrarg: "
1707 "AF_INET address must be tuple, not %.500s",
1708 Py_TYPE(args)->tp_name);
1709 return 0;
1710 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001711 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1712 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return 0;
1714 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001715 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001717 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (result < 0)
1719 return 0;
1720 if (port < 0 || port > 0xffff) {
1721 PyErr_SetString(
1722 PyExc_OverflowError,
1723 "getsockaddrarg: port must be 0-65535.");
1724 return 0;
1725 }
1726 addr->sin_family = AF_INET;
1727 addr->sin_port = htons((short)port);
1728 *len_ret = sizeof *addr;
1729 return 1;
1730 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001732#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 case AF_INET6:
1734 {
1735 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001736 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001737 int port, result;
1738 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 flowinfo = scope_id = 0;
1740 if (!PyTuple_Check(args)) {
1741 PyErr_Format(
1742 PyExc_TypeError,
1743 "getsockaddrarg: "
1744 "AF_INET6 address must be tuple, not %.500s",
1745 Py_TYPE(args)->tp_name);
1746 return 0;
1747 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001748 if (!PyArg_ParseTuple(args, "O&i|II",
1749 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 &scope_id)) {
1751 return 0;
1752 }
1753 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001754 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001756 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (result < 0)
1758 return 0;
1759 if (port < 0 || port > 0xffff) {
1760 PyErr_SetString(
1761 PyExc_OverflowError,
1762 "getsockaddrarg: port must be 0-65535.");
1763 return 0;
1764 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001765 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001766 PyErr_SetString(
1767 PyExc_OverflowError,
1768 "getsockaddrarg: flowinfo must be 0-1048575.");
1769 return 0;
1770 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 addr->sin6_family = s->sock_family;
1772 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001773 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 addr->sin6_scope_id = scope_id;
1775 *len_ret = sizeof *addr;
1776 return 1;
1777 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001778#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001779
Hye-Shik Chang81268602004-02-02 06:05:24 +00001780#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 case AF_BLUETOOTH:
1782 {
1783 switch (s->sock_proto) {
1784 case BTPROTO_L2CAP:
1785 {
1786 struct sockaddr_l2 *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001787 const char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 addr = (struct sockaddr_l2 *)addr_ret;
1790 memset(addr, 0, sizeof(struct sockaddr_l2));
1791 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1792 if (!PyArg_ParseTuple(args, "si", &straddr,
1793 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001794 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 "wrong format");
1796 return 0;
1797 }
1798 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1799 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 *len_ret = sizeof *addr;
1802 return 1;
1803 }
1804 case BTPROTO_RFCOMM:
1805 {
1806 struct sockaddr_rc *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001807 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 addr = (struct sockaddr_rc *)addr_ret;
1810 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1811 if (!PyArg_ParseTuple(args, "si", &straddr,
1812 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001813 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 "wrong format");
1815 return 0;
1816 }
1817 if (setbdaddr(straddr, &_BT_RC_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_HCI:
1824 {
1825 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001826#if defined(__NetBSD__) || defined(__DragonFly__)
Serhiy Storchakad3187152017-11-09 18:00:38 +02001827 const char *straddr;
1828 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1829 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001830 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001831 "wrong format");
1832 return 0;
1833 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001834 straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001835 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1836 return 0;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001837#else /* __NetBSD__ || __DragonFly__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1839 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001840 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 "wrong format");
1842 return 0;
1843 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001844#endif /* !(__NetBSD__ || __DragonFly__) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 *len_ret = sizeof *addr;
1846 return 1;
1847 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001848#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 case BTPROTO_SCO:
1850 {
1851 struct sockaddr_sco *addr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001852 const char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 addr = (struct sockaddr_sco *)addr_ret;
1855 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1856 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001857 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 "wrong format");
1859 return 0;
1860 }
1861 straddr = PyBytes_AS_STRING(args);
1862 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1863 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 *len_ret = sizeof *addr;
1866 return 1;
1867 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001868#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001870 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 return 0;
1872 }
1873 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001874#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00001875
Antoine Pitroub156a462010-10-27 20:13:57 +00001876#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 case AF_PACKET:
1878 {
1879 struct sockaddr_ll* addr;
1880 struct ifreq ifr;
Serhiy Storchakad3187152017-11-09 18:00:38 +02001881 const char *interfaceName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 int protoNumber;
1883 int hatype = 0;
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001884 int pkttype = PACKET_HOST;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001885 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 if (!PyTuple_Check(args)) {
1888 PyErr_Format(
1889 PyExc_TypeError,
1890 "getsockaddrarg: "
1891 "AF_PACKET address must be tuple, not %.500s",
1892 Py_TYPE(args)->tp_name);
1893 return 0;
1894 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001895 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001897 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 return 0;
1899 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1900 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1901 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1902 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001903 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 return 0;
1905 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001906 if (haddr.buf && haddr.len > 8) {
1907 PyErr_SetString(PyExc_ValueError,
1908 "Hardware address must be 8 bytes or less");
1909 PyBuffer_Release(&haddr);
1910 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 }
1912 if (protoNumber < 0 || protoNumber > 0xffff) {
1913 PyErr_SetString(
1914 PyExc_OverflowError,
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07001915 "getsockaddrarg: proto must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001916 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 return 0;
1918 }
1919 addr = (struct sockaddr_ll*)addr_ret;
1920 addr->sll_family = AF_PACKET;
1921 addr->sll_protocol = htons((short)protoNumber);
1922 addr->sll_ifindex = ifr.ifr_ifindex;
1923 addr->sll_pkttype = pkttype;
1924 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001925 if (haddr.buf) {
1926 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1927 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001929 else
1930 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001932 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 return 1;
1934 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001935#endif /* HAVE_NETPACKET_PACKET_H && SIOCGIFINDEX */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001936
Christian Heimes043d6f62008-01-07 17:19:16 +00001937#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 case AF_TIPC:
1939 {
1940 unsigned int atype, v1, v2, v3;
1941 unsigned int scope = TIPC_CLUSTER_SCOPE;
1942 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 if (!PyTuple_Check(args)) {
1945 PyErr_Format(
1946 PyExc_TypeError,
1947 "getsockaddrarg: "
1948 "AF_TIPC address must be tuple, not %.500s",
1949 Py_TYPE(args)->tp_name);
1950 return 0;
1951 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (!PyArg_ParseTuple(args,
1954 "IIII|I;Invalid TIPC address format",
1955 &atype, &v1, &v2, &v3, &scope))
1956 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 addr = (struct sockaddr_tipc *) addr_ret;
1959 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 addr->family = AF_TIPC;
1962 addr->scope = scope;
1963 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 if (atype == TIPC_ADDR_NAMESEQ) {
1966 addr->addr.nameseq.type = v1;
1967 addr->addr.nameseq.lower = v2;
1968 addr->addr.nameseq.upper = v3;
1969 } else if (atype == TIPC_ADDR_NAME) {
1970 addr->addr.name.name.type = v1;
1971 addr->addr.name.name.instance = v2;
1972 } else if (atype == TIPC_ADDR_ID) {
1973 addr->addr.id.node = v1;
1974 addr->addr.id.ref = v2;
1975 } else {
1976 /* Shouldn't happen */
1977 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1978 return 0;
1979 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 return 1;
1984 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02001985#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00001986
Serhiy Storchakad3187152017-11-09 18:00:38 +02001987#if defined(AF_CAN) && defined(SIOCGIFINDEX)
Charles-François Natali47413c12011-10-06 19:47:44 +02001988 case AF_CAN:
1989 switch (s->sock_proto) {
Serhiy Storchakad3187152017-11-09 18:00:38 +02001990#ifdef CAN_RAW
Charles-François Natali47413c12011-10-06 19:47:44 +02001991 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001992 /* fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02001993#endif
1994#ifdef CAN_BCM
Charles-François Natali773e42d2013-02-05 19:42:01 +01001995 case CAN_BCM:
Serhiy Storchakad3187152017-11-09 18:00:38 +02001996#endif
1997#if defined(CAN_RAW) || defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001998 {
1999 struct sockaddr_can *addr;
2000 PyObject *interfaceName;
2001 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02002002 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002003 addr = (struct sockaddr_can *)addr_ret;
2004
Charles-François Natali47413c12011-10-06 19:47:44 +02002005 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
2006 &interfaceName))
2007 return 0;
2008
2009 len = PyBytes_GET_SIZE(interfaceName);
2010
2011 if (len == 0) {
2012 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02002013 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02002014 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2015 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02002016 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2017 s->errorhandler();
2018 Py_DECREF(interfaceName);
2019 return 0;
2020 }
2021 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002022 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002023 "AF_CAN interface name too long");
2024 Py_DECREF(interfaceName);
2025 return 0;
2026 }
2027
2028 addr->can_family = AF_CAN;
2029 addr->can_ifindex = ifr.ifr_ifindex;
2030
2031 *len_ret = sizeof(*addr);
2032 Py_DECREF(interfaceName);
2033 return 1;
2034 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002035#endif /* CAN_RAW || CAN_BCM */
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04002036
2037#ifdef CAN_ISOTP
2038 case CAN_ISOTP:
2039 {
2040 struct sockaddr_can *addr;
2041 PyObject *interfaceName;
2042 struct ifreq ifr;
2043 Py_ssize_t len;
2044 unsigned long int rx_id, tx_id;
2045
2046 addr = (struct sockaddr_can *)addr_ret;
2047
2048 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
2049 &interfaceName,
2050 &rx_id,
2051 &tx_id))
2052 return 0;
2053
2054 len = PyBytes_GET_SIZE(interfaceName);
2055
2056 if (len == 0) {
2057 ifr.ifr_ifindex = 0;
2058 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
2059 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
2060 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
2061 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
2062 s->errorhandler();
2063 Py_DECREF(interfaceName);
2064 return 0;
2065 }
2066 } else {
2067 PyErr_SetString(PyExc_OSError,
2068 "AF_CAN interface name too long");
2069 Py_DECREF(interfaceName);
2070 return 0;
2071 }
2072
2073 addr->can_family = AF_CAN;
2074 addr->can_ifindex = ifr.ifr_ifindex;
2075 addr->can_addr.tp.rx_id = rx_id;
2076 addr->can_addr.tp.tx_id = tx_id;
2077
2078 *len_ret = sizeof(*addr);
2079 Py_DECREF(interfaceName);
2080 return 1;
2081 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002082#endif /* CAN_ISOTP */
Charles-François Natali47413c12011-10-06 19:47:44 +02002083 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002084 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002085 "getsockaddrarg: unsupported CAN protocol");
2086 return 0;
2087 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002088#endif /* AF_CAN && SIOCGIFINDEX */
Victor Stinnera534fc42013-06-03 22:07:27 +02002089
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002090#ifdef PF_SYSTEM
2091 case PF_SYSTEM:
2092 switch (s->sock_proto) {
2093#ifdef SYSPROTO_CONTROL
2094 case SYSPROTO_CONTROL:
2095 {
2096 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002097
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002098 addr = (struct sockaddr_ctl *)addr_ret;
2099 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002100 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002101
2102 if (PyUnicode_Check(args)) {
2103 struct ctl_info info;
2104 PyObject *ctl_name;
2105
2106 if (!PyArg_Parse(args, "O&",
2107 PyUnicode_FSConverter, &ctl_name)) {
2108 return 0;
2109 }
2110
Victor Stinnerf50e1872015-03-20 11:32:24 +01002111 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002112 PyErr_SetString(PyExc_ValueError,
2113 "provided string is too long");
2114 Py_DECREF(ctl_name);
2115 return 0;
2116 }
2117 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2118 sizeof(info.ctl_name));
2119 Py_DECREF(ctl_name);
2120
2121 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2122 PyErr_SetString(PyExc_OSError,
2123 "cannot find kernel control with provided name");
2124 return 0;
2125 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002126
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002127 addr->sc_id = info.ctl_id;
2128 addr->sc_unit = 0;
2129 } else if (!PyArg_ParseTuple(args, "II",
2130 &(addr->sc_id), &(addr->sc_unit))) {
2131 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2132 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002133
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002134 return 0;
2135 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002136
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002137 *len_ret = sizeof(*addr);
2138 return 1;
2139 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002140#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002141 default:
2142 PyErr_SetString(PyExc_OSError,
2143 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2144 return 0;
2145 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002146#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002147#ifdef HAVE_SOCKADDR_ALG
2148 case AF_ALG:
2149 {
2150 struct sockaddr_alg *sa;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002151 const char *type;
2152 const char *name;
Christian Heimesdffa3942016-09-05 23:54:41 +02002153 sa = (struct sockaddr_alg *)addr_ret;
2154
2155 memset(sa, 0, sizeof(*sa));
2156 sa->salg_family = AF_ALG;
2157
2158 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2159 &type, &name, &sa->salg_feat, &sa->salg_mask))
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002160 {
Christian Heimesdffa3942016-09-05 23:54:41 +02002161 return 0;
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002162 }
2163 /* sockaddr_alg has fixed-sized char arrays for type, and name
2164 * both must be NULL terminated.
2165 */
2166 if (strlen(type) >= sizeof(sa->salg_type)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002167 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2168 return 0;
2169 }
2170 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
Victor Stinner1a7b62d2018-12-10 12:13:01 +01002171 if (strlen(name) >= sizeof(sa->salg_name)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002172 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2173 return 0;
2174 }
2175 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2176
2177 *len_ret = sizeof(*sa);
2178 return 1;
2179 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002180#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002185 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002189}
2190
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191
Guido van Rossum48a680c2001-03-02 06:34:14 +00002192/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002193 Return 1 if the family is known, 0 otherwise. The length is returned
2194 through len_ret. */
2195
2196static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002197getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002200
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002201#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 case AF_UNIX:
2203 {
2204 *len_ret = sizeof (struct sockaddr_un);
2205 return 1;
2206 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002207#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002208
Martin v. Löwis11017b12006-01-14 18:12:57 +00002209#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002210 case AF_NETLINK:
2211 {
2212 *len_ret = sizeof (struct sockaddr_nl);
2213 return 1;
2214 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002215#endif /* AF_NETLINK */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002216
caaveryeffc12f2017-09-06 18:18:10 -04002217#if defined(AF_VSOCK)
2218 case AF_VSOCK:
2219 {
2220 *len_ret = sizeof (struct sockaddr_vm);
2221 return 1;
2222 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002223#endif /* AF_VSOCK */
caaveryeffc12f2017-09-06 18:18:10 -04002224
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002225#ifdef AF_RDS
2226 case AF_RDS:
2227 /* RDS sockets use sockaddr_in: fall-through */
Serhiy Storchakad3187152017-11-09 18:00:38 +02002228#endif /* AF_RDS */
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 case AF_INET:
2231 {
2232 *len_ret = sizeof (struct sockaddr_in);
2233 return 1;
2234 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002235
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002236#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 case AF_INET6:
2238 {
2239 *len_ret = sizeof (struct sockaddr_in6);
2240 return 1;
2241 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002242#endif /* ENABLE_IPV6 */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002243
Hye-Shik Chang81268602004-02-02 06:05:24 +00002244#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 case AF_BLUETOOTH:
2246 {
2247 switch(s->sock_proto)
2248 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 case BTPROTO_L2CAP:
2251 *len_ret = sizeof (struct sockaddr_l2);
2252 return 1;
2253 case BTPROTO_RFCOMM:
2254 *len_ret = sizeof (struct sockaddr_rc);
2255 return 1;
2256 case BTPROTO_HCI:
2257 *len_ret = sizeof (struct sockaddr_hci);
2258 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002259#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 case BTPROTO_SCO:
2261 *len_ret = sizeof (struct sockaddr_sco);
2262 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002263#endif /* !__FreeBSD__ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002265 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 "unknown BT protocol");
2267 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 }
2270 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002271#endif /* USE_BLUETOOTH */
Martin v. Löwis12af0482004-01-31 12:34:17 +00002272
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002273#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 case AF_PACKET:
2275 {
2276 *len_ret = sizeof (struct sockaddr_ll);
2277 return 1;
2278 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002279#endif /* HAVE_NETPACKET_PACKET_H */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002280
Christian Heimes043d6f62008-01-07 17:19:16 +00002281#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 case AF_TIPC:
2283 {
2284 *len_ret = sizeof (struct sockaddr_tipc);
2285 return 1;
2286 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002287#endif /* HAVE_LINUX_TIPC_H */
Christian Heimes043d6f62008-01-07 17:19:16 +00002288
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002289#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002290 case AF_CAN:
2291 {
2292 *len_ret = sizeof (struct sockaddr_can);
2293 return 1;
2294 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002295#endif /* AF_CAN */
Victor Stinnera534fc42013-06-03 22:07:27 +02002296
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002297#ifdef PF_SYSTEM
2298 case PF_SYSTEM:
2299 switch(s->sock_proto) {
2300#ifdef SYSPROTO_CONTROL
2301 case SYSPROTO_CONTROL:
2302 *len_ret = sizeof (struct sockaddr_ctl);
2303 return 1;
Serhiy Storchakad3187152017-11-09 18:00:38 +02002304#endif /* SYSPROTO_CONTROL */
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002305 default:
2306 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2307 "unknown PF_SYSTEM protocol");
2308 return 0;
2309 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002310#endif /* PF_SYSTEM */
Christian Heimesdffa3942016-09-05 23:54:41 +02002311#ifdef HAVE_SOCKADDR_ALG
2312 case AF_ALG:
2313 {
2314 *len_ret = sizeof (struct sockaddr_alg);
2315 return 1;
2316 }
Serhiy Storchakad3187152017-11-09 18:00:38 +02002317#endif /* HAVE_SOCKADDR_ALG */
Charles-François Natali47413c12011-10-06 19:47:44 +02002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002322 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002326}
2327
2328
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002329/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2330 Currently, these methods are only compiled if the RFC 2292/3542
2331 CMSG_LEN() macro is available. Older systems seem to have used
2332 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2333 it may be possible to define CMSG_LEN() that way if it's not
2334 provided. Some architectures might need extra padding after the
2335 cmsghdr, however, and CMSG_LEN() would have to take account of
2336 this. */
2337#ifdef CMSG_LEN
2338/* If length is in range, set *result to CMSG_LEN(length) and return
2339 true; otherwise, return false. */
2340static int
2341get_CMSG_LEN(size_t length, size_t *result)
2342{
2343 size_t tmp;
2344
2345 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2346 return 0;
2347 tmp = CMSG_LEN(length);
2348 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2349 return 0;
2350 *result = tmp;
2351 return 1;
2352}
2353
2354#ifdef CMSG_SPACE
2355/* If length is in range, set *result to CMSG_SPACE(length) and return
2356 true; otherwise, return false. */
2357static int
2358get_CMSG_SPACE(size_t length, size_t *result)
2359{
2360 size_t tmp;
2361
2362 /* Use CMSG_SPACE(1) here in order to take account of the padding
2363 necessary before *and* after the data. */
2364 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2365 return 0;
2366 tmp = CMSG_SPACE(length);
2367 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2368 return 0;
2369 *result = tmp;
2370 return 1;
2371}
2372#endif
2373
2374/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2375 pointer in msg->msg_control with at least "space" bytes after it,
2376 and its cmsg_len member inside the buffer. */
2377static int
2378cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2379{
2380 size_t cmsg_offset;
2381 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2382 sizeof(cmsgh->cmsg_len));
2383
Charles-François Natali466517d2011-08-28 18:23:43 +02002384 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002385 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002386 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002387 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2388 annoying under OS X as it's unsigned there and so it triggers a
2389 tautological comparison warning under Clang when compared against 0.
2390 Since the check is valid on other platforms, silence the warning under
2391 Clang. */
2392 #ifdef __clang__
2393 #pragma clang diagnostic push
2394 #pragma clang diagnostic ignored "-Wtautological-compare"
2395 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002396 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002397 #pragma GCC diagnostic push
2398 #pragma GCC diagnostic ignored "-Wtype-limits"
2399 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002400 if (msg->msg_controllen < 0)
2401 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002402 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002403 #pragma GCC diagnostic pop
2404 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002405 #ifdef __clang__
2406 #pragma clang diagnostic pop
2407 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002408 if (space < cmsg_len_end)
2409 space = cmsg_len_end;
2410 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2411 return (cmsg_offset <= (size_t)-1 - space &&
2412 cmsg_offset + space <= msg->msg_controllen);
2413}
2414
2415/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2416 *space to number of bytes following it in the buffer and return
2417 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2418 msg->msg_controllen are valid. */
2419static int
2420get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2421{
2422 size_t data_offset;
2423 char *data_ptr;
2424
2425 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2426 return 0;
2427 data_offset = data_ptr - (char *)msg->msg_control;
2428 if (data_offset > msg->msg_controllen)
2429 return 0;
2430 *space = msg->msg_controllen - data_offset;
2431 return 1;
2432}
2433
2434/* If cmsgh is invalid or not contained in the buffer pointed to by
2435 msg->msg_control, return -1. If cmsgh is valid and its associated
2436 data is entirely contained in the buffer, set *data_len to the
2437 length of the associated data and return 0. If only part of the
2438 associated data is contained in the buffer but cmsgh is otherwise
2439 valid, set *data_len to the length contained in the buffer and
2440 return 1. */
2441static int
2442get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2443{
2444 size_t space, cmsg_data_len;
2445
2446 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2447 cmsgh->cmsg_len < CMSG_LEN(0))
2448 return -1;
2449 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2450 if (!get_cmsg_data_space(msg, cmsgh, &space))
2451 return -1;
2452 if (space >= cmsg_data_len) {
2453 *data_len = cmsg_data_len;
2454 return 0;
2455 }
2456 *data_len = space;
2457 return 1;
2458}
2459#endif /* CMSG_LEN */
2460
2461
Victor Stinner31bf2d52015-04-01 21:57:09 +02002462struct sock_accept {
2463 socklen_t *addrlen;
2464 sock_addr_t *addrbuf;
2465 SOCKET_T result;
2466};
2467
2468#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2469/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2470static int accept4_works = -1;
2471#endif
2472
2473static int
2474sock_accept_impl(PySocketSockObject *s, void *data)
2475{
2476 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002477 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2478 socklen_t *paddrlen = ctx->addrlen;
2479#ifdef HAVE_SOCKADDR_ALG
2480 /* AF_ALG does not support accept() with addr and raises
2481 * ECONNABORTED instead. */
2482 if (s->sock_family == AF_ALG) {
2483 addr = NULL;
2484 paddrlen = NULL;
2485 *ctx->addrlen = 0;
2486 }
2487#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002488
2489#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2490 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002491 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002492 SOCK_CLOEXEC);
2493 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2494 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2495 accept4_works = (errno != ENOSYS);
2496 }
2497 }
2498 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002499 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002500#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002501 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002502#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002503
2504#ifdef MS_WINDOWS
2505 return (ctx->result != INVALID_SOCKET);
2506#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002507 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002508#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002509}
2510
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002511/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002512
Guido van Rossum73624e91994-10-10 17:59:00 +00002513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002514sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002517 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 socklen_t addrlen;
2519 PyObject *sock = NULL;
2520 PyObject *addr = NULL;
2521 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002522 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 if (!getsockaddrlen(s, &addrlen))
2525 return NULL;
2526 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 if (!IS_SELECTABLE(s))
2529 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002530
Victor Stinner31bf2d52015-04-01 21:57:09 +02002531 ctx.addrlen = &addrlen;
2532 ctx.addrbuf = &addrbuf;
2533 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002535 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002536
Victor Stinnerdaf45552013-08-28 00:53:59 +02002537#ifdef MS_WINDOWS
2538 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2539 PyErr_SetFromWindowsErr(0);
2540 SOCKETCLOSE(newfd);
2541 goto finally;
2542 }
2543#else
2544
2545#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2546 if (!accept4_works)
2547#endif
2548 {
2549 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2550 SOCKETCLOSE(newfd);
2551 goto finally;
2552 }
2553 }
2554#endif
2555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 sock = PyLong_FromSocket_t(newfd);
2557 if (sock == NULL) {
2558 SOCKETCLOSE(newfd);
2559 goto finally;
2560 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2563 addrlen, s->sock_proto);
2564 if (addr == NULL)
2565 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002568
Guido van Rossum67f7a382002-06-06 21:08:16 +00002569finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 Py_XDECREF(sock);
2571 Py_XDECREF(addr);
2572 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002576"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002578Wait for an incoming connection. Return a new socket file descriptor\n\
2579representing the connection, and the address of the client.\n\
2580For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581
Guido van Rossum11ba0942002-06-13 15:07:44 +00002582/* s.setblocking(flag) method. Argument:
2583 False -- non-blocking mode; same as settimeout(0)
2584 True -- blocking mode; same as settimeout(None)
2585*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002586
Guido van Rossum73624e91994-10-10 17:59:00 +00002587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002588sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002589{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002590 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 block = PyLong_AsLong(arg);
2593 if (block == -1 && PyErr_Occurred())
2594 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Victor Stinner9001d802015-04-06 23:06:01 +02002596 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002597 if (internal_setblocking(s, block) == -1) {
2598 return NULL;
2599 }
2600 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002601}
Guido van Rossume4485b01994-09-07 14:32:49 +00002602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002603PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002604"setblocking(flag)\n\
2605\n\
2606Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002607setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002608setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002609
Yury Selivanovf11b4602018-01-28 17:27:38 -05002610/* s.getblocking() method.
2611 Returns True if socket is in blocking mode,
2612 False if it is in non-blocking mode.
2613*/
2614static PyObject *
2615sock_getblocking(PySocketSockObject *s)
2616{
2617 if (s->sock_timeout) {
2618 Py_RETURN_TRUE;
2619 }
2620 else {
2621 Py_RETURN_FALSE;
2622 }
2623}
2624
2625PyDoc_STRVAR(getblocking_doc,
2626"getblocking()\n\
2627\n\
2628Returns True if socket is in blocking mode, or False if it\n\
2629is in non-blocking mode.");
2630
Victor Stinner71694d52015-03-28 01:18:54 +01002631static int
2632socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2633{
2634#ifdef MS_WINDOWS
2635 struct timeval tv;
2636#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002637#ifndef HAVE_POLL
2638 _PyTime_t ms;
2639#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002640 int overflow = 0;
2641
2642 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002643 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002644 return 0;
2645 }
2646
Victor Stinner869e1772015-03-30 03:49:14 +02002647 if (_PyTime_FromSecondsObject(timeout,
Pablo Galindo59af94f2017-10-18 08:13:09 +01002648 timeout_obj, _PyTime_ROUND_TIMEOUT) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002649 return -1;
2650
2651 if (*timeout < 0) {
2652 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2653 return -1;
2654 }
2655
2656#ifdef MS_WINDOWS
Pablo Galindo59af94f2017-10-18 08:13:09 +01002657 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_TIMEOUT) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002658#endif
2659#ifndef HAVE_POLL
Pablo Galindo59af94f2017-10-18 08:13:09 +01002660 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_TIMEOUT);
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002661 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002662#endif
2663 if (overflow) {
2664 PyErr_SetString(PyExc_OverflowError,
2665 "timeout doesn't fit into C timeval");
2666 return -1;
2667 }
2668
2669 return 0;
2670}
2671
Guido van Rossum11ba0942002-06-13 15:07:44 +00002672/* s.settimeout(timeout) method. Argument:
2673 None -- no timeout, blocking mode; same as setblocking(True)
2674 0.0 -- non-blocking mode; same as setblocking(False)
2675 > 0 -- timeout mode; operations time out after timeout seconds
2676 < 0 -- illegal; raises an exception
2677*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002680{
Victor Stinner71694d52015-03-28 01:18:54 +01002681 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002682
Victor Stinner71694d52015-03-28 01:18:54 +01002683 if (socket_parse_timeout(&timeout, arg) < 0)
2684 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 s->sock_timeout = timeout;
Yury Selivanovf11b4602018-01-28 17:27:38 -05002687
2688 int block = timeout < 0;
2689 /* Blocking mode for a Python socket object means that operations
2690 like :meth:`recv` or :meth:`sendall` will block the execution of
2691 the current thread until they are complete or aborted with a
2692 `socket.timeout` or `socket.error` errors. When timeout is `None`,
2693 the underlying FD is in a blocking mode. When timeout is a positive
2694 number, the FD is in a non-blocking mode, and socket ops are
2695 implemented with a `select()` call.
2696
2697 When timeout is 0.0, the FD is in a non-blocking mode.
2698
2699 This table summarizes all states in which the socket object and
2700 its underlying FD can be:
2701
2702 ==================== ===================== ==============
2703 `gettimeout()` `getblocking()` FD
2704 ==================== ===================== ==============
2705 ``None`` ``True`` blocking
2706 ``0.0`` ``False`` non-blocking
2707 ``> 0`` ``True`` non-blocking
2708 */
2709
2710 if (internal_setblocking(s, block) == -1) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002711 return NULL;
2712 }
2713 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714}
2715
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002716PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002717"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002719Set a timeout on socket operations. 'timeout' can be a float,\n\
2720giving in seconds, or None. Setting a timeout of None disables\n\
2721the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002723
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002724/* s.gettimeout() method.
2725 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002726static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002727sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002728{
Victor Stinner71694d52015-03-28 01:18:54 +01002729 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002730 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 }
Victor Stinner71694d52015-03-28 01:18:54 +01002732 else {
2733 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2734 return PyFloat_FromDouble(seconds);
2735 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002736}
2737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002739"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002740\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002741Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002742operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002743operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002744
Guido van Rossumaee08791992-09-08 09:05:33 +00002745/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002746 With an integer third argument, sets an integer optval with optlen=4.
2747 With None as third argument and an integer fourth argument, set
2748 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002749 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002750 use optional built-in module 'struct' to encode the string.
2751*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002752
Guido van Rossum73624e91994-10-10 17:59:00 +00002753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002754sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 int level;
2757 int optname;
2758 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002759 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002761 unsigned int optlen;
2762 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002763
caaveryeffc12f2017-09-06 18:18:10 -04002764#ifdef AF_VSOCK
2765 if (s->sock_family == AF_VSOCK) {
2766 uint64_t vflag; // Must be set width of 64 bits
2767 /* setsockopt(level, opt, flag) */
2768 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2769 &level, &optname, &vflag)) {
2770 // level should always be set to AF_VSOCK
2771 res = setsockopt(s->sock_fd, level, optname,
2772 (void*)&vflag, sizeof vflag);
2773 goto done;
2774 }
2775 return NULL;
2776 }
2777#endif
2778
Christian Heimesdffa3942016-09-05 23:54:41 +02002779 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (PyArg_ParseTuple(args, "iii:setsockopt",
2781 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002782 res = setsockopt(s->sock_fd, level, optname,
2783 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002784 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002786
2787 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002788 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002789 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2790 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2791 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002792 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002793 NULL, (socklen_t)optlen);
2794 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002796
2797 PyErr_Clear();
2798 /* setsockopt(level, opt, buffer) */
2799 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2800 &level, &optname, &optval))
2801 return NULL;
2802
2803#ifdef MS_WINDOWS
2804 if (optval.len > INT_MAX) {
2805 PyBuffer_Release(&optval);
2806 PyErr_Format(PyExc_OverflowError,
2807 "socket option is larger than %i bytes",
2808 INT_MAX);
2809 return NULL;
2810 }
2811 res = setsockopt(s->sock_fd, level, optname,
2812 optval.buf, (int)optval.len);
2813#else
2814 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2815#endif
2816 PyBuffer_Release(&optval);
2817
2818done:
Victor Stinnercc739322016-03-23 21:35:29 +01002819 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002821 }
2822
2823 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002824}
2825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002826PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002827"setsockopt(level, option, value: int)\n\
2828setsockopt(level, option, value: buffer)\n\
2829setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002830\n\
2831Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002832The value argument can either be an integer, a string buffer, or \n\
2833None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002834
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002835
Guido van Rossumaee08791992-09-08 09:05:33 +00002836/* s.getsockopt() method.
2837 With two arguments, retrieves an integer option.
2838 With a third integer argument, retrieves a string buffer of that size;
2839 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002840
Guido van Rossum73624e91994-10-10 17:59:00 +00002841static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002842sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 int level;
2845 int optname;
2846 int res;
2847 PyObject *buf;
2848 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002849 int flag = 0;
2850 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2853 &level, &optname, &buflen))
2854 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002857#ifdef AF_VSOCK
2858 if (s->sock_family == AF_VSOCK) {
2859 uint64_t vflag = 0; // Must be set width of 64 bits
2860 flagsize = sizeof vflag;
2861 res = getsockopt(s->sock_fd, level, optname,
2862 (void *)&vflag, &flagsize);
2863 if (res < 0)
2864 return s->errorhandler();
2865 return PyLong_FromUnsignedLong(vflag);
2866 }
2867#endif
2868 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 res = getsockopt(s->sock_fd, level, optname,
2870 (void *)&flag, &flagsize);
2871 if (res < 0)
2872 return s->errorhandler();
2873 return PyLong_FromLong(flag);
2874 }
caaveryeffc12f2017-09-06 18:18:10 -04002875#ifdef AF_VSOCK
2876 if (s->sock_family == AF_VSOCK) {
2877 PyErr_SetString(PyExc_OSError,
2878 "getsockopt string buffer not allowed");
2879 return NULL;
2880 }
2881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002883 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 "getsockopt buflen out of range");
2885 return NULL;
2886 }
2887 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2888 if (buf == NULL)
2889 return NULL;
2890 res = getsockopt(s->sock_fd, level, optname,
2891 (void *)PyBytes_AS_STRING(buf), &buflen);
2892 if (res < 0) {
2893 Py_DECREF(buf);
2894 return s->errorhandler();
2895 }
2896 _PyBytes_Resize(&buf, buflen);
2897 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002898}
2899
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002900PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002901"getsockopt(level, option[, buffersize]) -> value\n\
2902\n\
2903Get a socket option. See the Unix manual for level and option.\n\
2904If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002905string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002906
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002907
Fred Drake728819a2000-07-01 03:40:12 +00002908/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002909
Guido van Rossum73624e91994-10-10 17:59:00 +00002910static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002911sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 sock_addr_t addrbuf;
2914 int addrlen;
2915 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2918 return NULL;
2919 Py_BEGIN_ALLOW_THREADS
2920 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2921 Py_END_ALLOW_THREADS
2922 if (res < 0)
2923 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002924 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002925}
2926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002927PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002928"bind(address)\n\
2929\n\
2930Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002931pair (host, port); the host must refer to the local host. For raw packet\n\
Benjamin Petersoncadb66e2018-09-11 18:46:36 -07002932sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002933
Guido van Rossum30a685f1991-06-27 15:51:29 +00002934
2935/* s.close() method.
2936 Set the file descriptor to -1 so operations tried subsequently
2937 will surely fail. */
2938
Guido van Rossum73624e91994-10-10 17:59:00 +00002939static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002940sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002943 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002944
Victor Stinner19a8e842016-03-21 16:36:48 +01002945 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002946 if (fd != INVALID_SOCKET) {
2947 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002948
2949 /* We do not want to retry upon EINTR: see
2950 http://lwn.net/Articles/576478/ and
2951 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2952 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002954 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002956 /* bpo-30319: The peer can already have closed the connection.
2957 Python ignores ECONNRESET on close(). */
2958 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002959 return s->errorhandler();
2960 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002962 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002963}
2964
Christian Heimesd0e31b92018-01-27 09:54:13 +01002965PyDoc_STRVAR(sock_close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002966"close()\n\
2967\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002970static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002971sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002972{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002973 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002974 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002975 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002976}
2977
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002978PyDoc_STRVAR(detach_doc,
2979"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002980\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002981Close the socket object without closing the underlying file descriptor.\n\
2982The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002983can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002984
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002985static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002986sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002987{
Victor Stinner81c41db2015-04-02 11:50:57 +02002988 int err;
2989 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002990
Victor Stinner81c41db2015-04-02 11:50:57 +02002991 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2992 /* getsockopt() failed */
2993 return 0;
2994 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002995
Victor Stinner81c41db2015-04-02 11:50:57 +02002996 if (err == EISCONN)
2997 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002998 if (err != 0) {
2999 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
3000 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02003001 return 0;
3002 }
3003 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003004}
3005
3006static int
3007internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
3008 int raise)
3009{
3010 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003011
3012 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003014 Py_END_ALLOW_THREADS
3015
Victor Stinner70a46f62015-03-31 22:03:59 +02003016 if (!res) {
3017 /* connect() succeeded, the socket is connected */
3018 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003020
Victor Stinner81c41db2015-04-02 11:50:57 +02003021 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02003022
Victor Stinner81c41db2015-04-02 11:50:57 +02003023 /* save error, PyErr_CheckSignals() can replace it */
3024 err = GET_SOCK_ERROR;
3025 if (CHECK_ERRNO(EINTR)) {
3026 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02003027 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02003028
3029 /* Issue #23618: when connect() fails with EINTR, the connection is
3030 running asynchronously.
3031
3032 If the socket is blocking or has a timeout, wait until the
3033 connection completes, fails or timed out using select(), and then
3034 get the connection status using getsockopt(SO_ERROR).
3035
3036 If the socket is non-blocking, raise InterruptedError. The caller is
3037 responsible to wait until the connection completes, fails or timed
3038 out (it's the case in asyncio for example). */
3039 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
3040 }
3041 else {
3042 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
3043 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02003044 }
3045
Victor Stinner81c41db2015-04-02 11:50:57 +02003046 if (!wait_connect) {
3047 if (raise) {
3048 /* restore error, maybe replaced by PyErr_CheckSignals() */
3049 SET_SOCK_ERROR(err);
3050 s->errorhandler();
3051 return -1;
3052 }
3053 else
3054 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02003055 }
3056
Victor Stinner81c41db2015-04-02 11:50:57 +02003057 if (raise) {
3058 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003059 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3060 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003061 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02003062 }
Victor Stinner81c41db2015-04-02 11:50:57 +02003063 else {
3064 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02003065 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
3066 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02003067 return err;
3068 }
3069 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003070}
Guido van Rossum30a685f1991-06-27 15:51:29 +00003071
Fred Drake728819a2000-07-01 03:40:12 +00003072/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003073
Guido van Rossum73624e91994-10-10 17:59:00 +00003074static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 sock_addr_t addrbuf;
3078 int addrlen;
3079 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3082 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003083
Victor Stinner81c41db2015-04-02 11:50:57 +02003084 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02003085 if (res < 0)
3086 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003087
Victor Stinneree699e92015-03-31 21:28:42 +02003088 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003089}
3090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003091PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003092"connect(address)\n\
3093\n\
3094Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003095is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096
Guido van Rossum30a685f1991-06-27 15:51:29 +00003097
Fred Drake728819a2000-07-01 03:40:12 +00003098/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003099
3100static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003101sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 sock_addr_t addrbuf;
3104 int addrlen;
3105 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
3108 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003109
Victor Stinner81c41db2015-04-02 11:50:57 +02003110 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01003111 if (res < 0)
3112 return NULL;
3113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003115}
3116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003117PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003118"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003119\n\
3120This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003121instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003122
Guido van Rossumfc4255d1997-11-19 18:57:13 +00003123
Guido van Rossumed233a51992-06-23 09:07:03 +00003124/* s.fileno() method */
3125
Guido van Rossum73624e91994-10-10 17:59:00 +00003126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003127sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003130}
3131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003132PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003133"fileno() -> integer\n\
3134\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003135Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003136
Guido van Rossumed233a51992-06-23 09:07:03 +00003137
Guido van Rossumc89705d1992-11-26 08:54:07 +00003138/* s.getsockname() method */
3139
Guido van Rossum73624e91994-10-10 17:59:00 +00003140static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003141sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 sock_addr_t addrbuf;
3144 int res;
3145 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 if (!getsockaddrlen(s, &addrlen))
3148 return NULL;
3149 memset(&addrbuf, 0, addrlen);
3150 Py_BEGIN_ALLOW_THREADS
3151 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3152 Py_END_ALLOW_THREADS
3153 if (res < 0)
3154 return s->errorhandler();
3155 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3156 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003157}
3158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003159PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003160"getsockname() -> address info\n\
3161\n\
3162Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003163info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003164
Guido van Rossumc89705d1992-11-26 08:54:07 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003167/* s.getpeername() method */
3168
Guido van Rossum73624e91994-10-10 17:59:00 +00003169static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003170sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 sock_addr_t addrbuf;
3173 int res;
3174 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 if (!getsockaddrlen(s, &addrlen))
3177 return NULL;
3178 memset(&addrbuf, 0, addrlen);
3179 Py_BEGIN_ALLOW_THREADS
3180 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3181 Py_END_ALLOW_THREADS
3182 if (res < 0)
3183 return s->errorhandler();
3184 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3185 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003186}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003188PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003189"getpeername() -> address info\n\
3190\n\
3191Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003192info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003193
Guido van Rossumb6775db1994-08-01 11:34:53 +00003194#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003195
3196
Guido van Rossum30a685f1991-06-27 15:51:29 +00003197/* s.listen(n) method */
3198
Guido van Rossum73624e91994-10-10 17:59:00 +00003199static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003200sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003201{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003202 /* We try to choose a default backlog high enough to avoid connection drops
3203 * for common workloads, yet not too high to limit resource usage. */
3204 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003206
Charles-François Natali644b8f52014-05-22 19:45:39 +01003207 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003211 /* To avoid problems on systems that don't allow a negative backlog
3212 * (which doesn't make sense anyway) we force a minimum value of 0. */
3213 if (backlog < 0)
3214 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 res = listen(s->sock_fd, backlog);
3216 Py_END_ALLOW_THREADS
3217 if (res < 0)
3218 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003219 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003220}
3221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003222PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003223"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003224\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003225Enable a server to accept connections. If backlog is specified, it must be\n\
3226at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003227unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003228connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003229
Victor Stinner31bf2d52015-04-01 21:57:09 +02003230struct sock_recv {
3231 char *cbuf;
3232 Py_ssize_t len;
3233 int flags;
3234 Py_ssize_t result;
3235};
3236
3237static int
3238sock_recv_impl(PySocketSockObject *s, void *data)
3239{
3240 struct sock_recv *ctx = data;
3241
3242#ifdef MS_WINDOWS
3243 if (ctx->len > INT_MAX)
3244 ctx->len = INT_MAX;
3245 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3246#else
3247 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3248#endif
3249 return (ctx->result >= 0);
3250}
3251
Guido van Rossum82a5c661998-07-07 20:45:43 +00003252
Thomas Wouters477c8d52006-05-27 19:21:47 +00003253/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003254 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003255 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003256 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003257 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003258 * also possible that we return a number of bytes smaller than the request
3259 * bytes.
3260 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003261
Antoine Pitrou19467d22010-08-17 19:33:30 +00003262static Py_ssize_t
3263sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003264{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003265 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 if (!IS_SELECTABLE(s)) {
3268 select_error();
3269 return -1;
3270 }
3271 if (len == 0) {
3272 /* If 0 bytes were requested, do nothing. */
3273 return 0;
3274 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003275
Victor Stinner31bf2d52015-04-01 21:57:09 +02003276 ctx.cbuf = cbuf;
3277 ctx.len = len;
3278 ctx.flags = flags;
3279 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003281
3282 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003283}
3284
Guido van Rossum48a680c2001-03-02 06:34:14 +00003285
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003286/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003287
Guido van Rossum73624e91994-10-10 17:59:00 +00003288static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003289sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003290{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003291 Py_ssize_t recvlen, outlen;
3292 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003294
Antoine Pitrou19467d22010-08-17 19:33:30 +00003295 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 if (recvlen < 0) {
3299 PyErr_SetString(PyExc_ValueError,
3300 "negative buffersize in recv");
3301 return NULL;
3302 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 /* Allocate a new string. */
3305 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3306 if (buf == NULL)
3307 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 /* Call the guts */
3310 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3311 if (outlen < 0) {
3312 /* An error occurred, release the string and return an
3313 error. */
3314 Py_DECREF(buf);
3315 return NULL;
3316 }
3317 if (outlen != recvlen) {
3318 /* We did not read as many bytes as we anticipated, resize the
3319 string if possible and be successful. */
3320 _PyBytes_Resize(&buf, outlen);
3321 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003324}
3325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003326PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003327"recv(buffersize[, flags]) -> data\n\
3328\n\
3329Receive up to buffersize bytes from the socket. For the optional flags\n\
3330argument, see the Unix manual. When no data is available, block until\n\
3331at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003332the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003333
Guido van Rossum30a685f1991-06-27 15:51:29 +00003334
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003335/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003336
Thomas Wouters477c8d52006-05-27 19:21:47 +00003337static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003338sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003341
Antoine Pitrou19467d22010-08-17 19:33:30 +00003342 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 Py_buffer pbuf;
3344 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003345 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003348 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 &pbuf, &recvlen, &flags))
3350 return NULL;
3351 buf = pbuf.buf;
3352 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 if (recvlen < 0) {
3355 PyBuffer_Release(&pbuf);
3356 PyErr_SetString(PyExc_ValueError,
3357 "negative buffersize in recv_into");
3358 return NULL;
3359 }
3360 if (recvlen == 0) {
3361 /* If nbytes was not specified, use the buffer's length */
3362 recvlen = buflen;
3363 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 /* Check if the buffer is large enough */
3366 if (buflen < recvlen) {
3367 PyBuffer_Release(&pbuf);
3368 PyErr_SetString(PyExc_ValueError,
3369 "buffer too small for requested bytes");
3370 return NULL;
3371 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 /* Call the guts */
3374 readlen = sock_recv_guts(s, buf, recvlen, flags);
3375 if (readlen < 0) {
3376 /* Return an error. */
3377 PyBuffer_Release(&pbuf);
3378 return NULL;
3379 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 PyBuffer_Release(&pbuf);
3382 /* Return the number of bytes read. Note that we do not do anything
3383 special here in the case that readlen < recvlen. */
3384 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003385}
3386
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003387PyDoc_STRVAR(recv_into_doc,
3388"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003389\n\
3390A version of recv() that stores its data into a buffer rather than creating \n\
3391a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3392is not specified (or 0), receive up to the size available in the given buffer.\n\
3393\n\
3394See recv() for documentation about the flags.");
3395
Victor Stinner31bf2d52015-04-01 21:57:09 +02003396struct sock_recvfrom {
3397 char* cbuf;
3398 Py_ssize_t len;
3399 int flags;
3400 socklen_t *addrlen;
3401 sock_addr_t *addrbuf;
3402 Py_ssize_t result;
3403};
3404
3405static int
3406sock_recvfrom_impl(PySocketSockObject *s, void *data)
3407{
3408 struct sock_recvfrom *ctx = data;
3409
3410 memset(ctx->addrbuf, 0, *ctx->addrlen);
3411
3412#ifdef MS_WINDOWS
3413 if (ctx->len > INT_MAX)
3414 ctx->len = INT_MAX;
3415 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3416 SAS2SA(ctx->addrbuf), ctx->addrlen);
3417#else
3418 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3419 SAS2SA(ctx->addrbuf), ctx->addrlen);
3420#endif
3421 return (ctx->result >= 0);
3422}
3423
Thomas Wouters477c8d52006-05-27 19:21:47 +00003424
3425/*
Christian Heimes99170a52007-12-19 02:07:34 +00003426 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3427 * into a char buffer. If you have any inc/def ref to do to the objects that
3428 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003429 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003430 * that it is also possible that we return a number of bytes smaller than the
3431 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003432 *
3433 * 'addr' is a return value for the address object. Note that you must decref
3434 * it yourself.
3435 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003436static Py_ssize_t
3437sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003442 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 if (!getsockaddrlen(s, &addrlen))
3447 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 if (!IS_SELECTABLE(s)) {
3450 select_error();
3451 return -1;
3452 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003453
Victor Stinner31bf2d52015-04-01 21:57:09 +02003454 ctx.cbuf = cbuf;
3455 ctx.len = len;
3456 ctx.flags = flags;
3457 ctx.addrbuf = &addrbuf;
3458 ctx.addrlen = &addrlen;
3459 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003461
Victor Stinner31bf2d52015-04-01 21:57:09 +02003462 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3463 s->sock_proto);
3464 if (*addr == NULL)
3465 return -1;
3466
3467 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003468}
3469
3470/* s.recvfrom(nbytes [,flags]) method */
3471
3472static PyObject *
3473sock_recvfrom(PySocketSockObject *s, PyObject *args)
3474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 PyObject *buf = NULL;
3476 PyObject *addr = NULL;
3477 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003478 int flags = 0;
3479 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003480
Antoine Pitrou19467d22010-08-17 19:33:30 +00003481 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 if (recvlen < 0) {
3485 PyErr_SetString(PyExc_ValueError,
3486 "negative buffersize in recvfrom");
3487 return NULL;
3488 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003490 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3491 if (buf == NULL)
3492 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3495 recvlen, flags, &addr);
3496 if (outlen < 0) {
3497 goto finally;
3498 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 if (outlen != recvlen) {
3501 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003502 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003504 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 goto finally;
3506 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003509
3510finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 Py_XDECREF(buf);
3512 Py_XDECREF(addr);
3513 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003514}
3515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003516PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003517"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3518\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003519Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003520
Thomas Wouters477c8d52006-05-27 19:21:47 +00003521
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003522/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003523
3524static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003525sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003528
Antoine Pitrou19467d22010-08-17 19:33:30 +00003529 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 Py_buffer pbuf;
3531 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003532 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003535
Antoine Pitrou19467d22010-08-17 19:33:30 +00003536 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003537 kwlist, &pbuf,
3538 &recvlen, &flags))
3539 return NULL;
3540 buf = pbuf.buf;
3541 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 if (recvlen < 0) {
3544 PyBuffer_Release(&pbuf);
3545 PyErr_SetString(PyExc_ValueError,
3546 "negative buffersize in recvfrom_into");
3547 return NULL;
3548 }
3549 if (recvlen == 0) {
3550 /* If nbytes was not specified, use the buffer's length */
3551 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003552 } else if (recvlen > buflen) {
3553 PyBuffer_Release(&pbuf);
3554 PyErr_SetString(PyExc_ValueError,
3555 "nbytes is greater than the length of the buffer");
3556 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3560 if (readlen < 0) {
3561 PyBuffer_Release(&pbuf);
3562 /* Return an error */
3563 Py_XDECREF(addr);
3564 return NULL;
3565 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 PyBuffer_Release(&pbuf);
3568 /* Return the number of bytes read and the address. Note that we do
3569 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003570 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003571}
3572
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003573PyDoc_STRVAR(recvfrom_into_doc,
3574"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003576Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003577
Victor Stinner35bee932015-04-02 12:28:07 +02003578/* The sendmsg() and recvmsg[_into]() methods require a working
3579 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3580#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003581struct sock_recvmsg {
3582 struct msghdr *msg;
3583 int flags;
3584 ssize_t result;
3585};
3586
3587static int
3588sock_recvmsg_impl(PySocketSockObject *s, void *data)
3589{
3590 struct sock_recvmsg *ctx = data;
3591
3592 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3593 return (ctx->result >= 0);
3594}
3595
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596/*
3597 * Call recvmsg() with the supplied iovec structures, flags, and
3598 * ancillary data buffer size (controllen). Returns the tuple return
3599 * value for recvmsg() or recvmsg_into(), with the first item provided
3600 * by the supplied makeval() function. makeval() will be called with
3601 * the length read and makeval_data as arguments, and must return a
3602 * new reference (which will be decrefed if there is a subsequent
3603 * error). On error, closes any file descriptors received via
3604 * SCM_RIGHTS.
3605 */
3606static PyObject *
3607sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3608 int flags, Py_ssize_t controllen,
3609 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3610{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 sock_addr_t addrbuf;
3612 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003613 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003614 PyObject *cmsg_list = NULL, *retval = NULL;
3615 void *controlbuf = NULL;
3616 struct cmsghdr *cmsgh;
3617 size_t cmsgdatalen = 0;
3618 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003619 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003620
3621 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3622 ignored" when the socket is connected (Linux fills them in
3623 anyway for AF_UNIX sockets at least). Normally msg_namelen
3624 seems to be set to 0 if there's no address, but try to
3625 initialize msg_name to something that won't be mistaken for a
3626 real address if that doesn't happen. */
3627 if (!getsockaddrlen(s, &addrbuflen))
3628 return NULL;
3629 memset(&addrbuf, 0, addrbuflen);
3630 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3631
3632 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3633 PyErr_SetString(PyExc_ValueError,
3634 "invalid ancillary data buffer length");
3635 return NULL;
3636 }
3637 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3638 return PyErr_NoMemory();
3639
3640 /* Make the system call. */
3641 if (!IS_SELECTABLE(s)) {
3642 select_error();
3643 goto finally;
3644 }
3645
Victor Stinner31bf2d52015-04-01 21:57:09 +02003646 msg.msg_name = SAS2SA(&addrbuf);
3647 msg.msg_namelen = addrbuflen;
3648 msg.msg_iov = iov;
3649 msg.msg_iovlen = iovlen;
3650 msg.msg_control = controlbuf;
3651 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003652
Victor Stinner31bf2d52015-04-01 21:57:09 +02003653 ctx.msg = &msg;
3654 ctx.flags = flags;
3655 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003656 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003657
3658 /* Make list of (level, type, data) tuples from control messages. */
3659 if ((cmsg_list = PyList_New(0)) == NULL)
3660 goto err_closefds;
3661 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3662 implementations didn't do so. */
3663 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3664 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3665 PyObject *bytes, *tuple;
3666 int tmp;
3667
3668 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3669 if (cmsg_status != 0) {
3670 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3671 "received malformed or improperly-truncated "
3672 "ancillary data", 1) == -1)
3673 goto err_closefds;
3674 }
3675 if (cmsg_status < 0)
3676 break;
3677 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003678 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003679 goto err_closefds;
3680 }
3681
3682 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3683 cmsgdatalen);
3684 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3685 (int)cmsgh->cmsg_type, bytes);
3686 if (tuple == NULL)
3687 goto err_closefds;
3688 tmp = PyList_Append(cmsg_list, tuple);
3689 Py_DECREF(tuple);
3690 if (tmp != 0)
3691 goto err_closefds;
3692
3693 if (cmsg_status != 0)
3694 break;
3695 }
3696
3697 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003698 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003699 cmsg_list,
3700 (int)msg.msg_flags,
3701 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3702 ((msg.msg_namelen > addrbuflen) ?
3703 addrbuflen : msg.msg_namelen),
3704 s->sock_proto));
3705 if (retval == NULL)
3706 goto err_closefds;
3707
3708finally:
3709 Py_XDECREF(cmsg_list);
3710 PyMem_Free(controlbuf);
3711 return retval;
3712
3713err_closefds:
3714#ifdef SCM_RIGHTS
3715 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3716 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3717 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3718 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3719 if (cmsg_status < 0)
3720 break;
3721 if (cmsgh->cmsg_level == SOL_SOCKET &&
3722 cmsgh->cmsg_type == SCM_RIGHTS) {
3723 size_t numfds;
3724 int *fdp;
3725
3726 numfds = cmsgdatalen / sizeof(int);
3727 fdp = (int *)CMSG_DATA(cmsgh);
3728 while (numfds-- > 0)
3729 close(*fdp++);
3730 }
3731 if (cmsg_status != 0)
3732 break;
3733 }
3734#endif /* SCM_RIGHTS */
3735 goto finally;
3736}
3737
3738
3739static PyObject *
3740makeval_recvmsg(ssize_t received, void *data)
3741{
3742 PyObject **buf = data;
3743
3744 if (received < PyBytes_GET_SIZE(*buf))
3745 _PyBytes_Resize(buf, received);
3746 Py_XINCREF(*buf);
3747 return *buf;
3748}
3749
3750/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3751
3752static PyObject *
3753sock_recvmsg(PySocketSockObject *s, PyObject *args)
3754{
3755 Py_ssize_t bufsize, ancbufsize = 0;
3756 int flags = 0;
3757 struct iovec iov;
3758 PyObject *buf = NULL, *retval = NULL;
3759
3760 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3761 return NULL;
3762
3763 if (bufsize < 0) {
3764 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3765 return NULL;
3766 }
3767 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3768 return NULL;
3769 iov.iov_base = PyBytes_AS_STRING(buf);
3770 iov.iov_len = bufsize;
3771
3772 /* Note that we're passing a pointer to *our pointer* to the bytes
3773 object here (&buf); makeval_recvmsg() may incref the object, or
3774 deallocate it and set our pointer to NULL. */
3775 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3776 &makeval_recvmsg, &buf);
3777 Py_XDECREF(buf);
3778 return retval;
3779}
3780
3781PyDoc_STRVAR(recvmsg_doc,
3782"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3783\n\
3784Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3785socket. The ancbufsize argument sets the size in bytes of the\n\
3786internal buffer used to receive the ancillary data; it defaults to 0,\n\
3787meaning that no ancillary data will be received. Appropriate buffer\n\
3788sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3789CMSG_LEN(), and items which do not fit into the buffer might be\n\
3790truncated or discarded. The flags argument defaults to 0 and has the\n\
3791same meaning as for recv().\n\
3792\n\
3793The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3794The data item is a bytes object holding the non-ancillary data\n\
3795received. The ancdata item is a list of zero or more tuples\n\
3796(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3797(control messages) received: cmsg_level and cmsg_type are integers\n\
3798specifying the protocol level and protocol-specific type respectively,\n\
3799and cmsg_data is a bytes object holding the associated data. The\n\
3800msg_flags item is the bitwise OR of various flags indicating\n\
3801conditions on the received message; see your system documentation for\n\
3802details. If the receiving socket is unconnected, address is the\n\
3803address of the sending socket, if available; otherwise, its value is\n\
3804unspecified.\n\
3805\n\
3806If recvmsg() raises an exception after the system call returns, it\n\
3807will first attempt to close any file descriptors received via the\n\
3808SCM_RIGHTS mechanism.");
3809
3810
3811static PyObject *
3812makeval_recvmsg_into(ssize_t received, void *data)
3813{
3814 return PyLong_FromSsize_t(received);
3815}
3816
3817/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3818
3819static PyObject *
3820sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3821{
3822 Py_ssize_t ancbufsize = 0;
3823 int flags = 0;
3824 struct iovec *iovs = NULL;
3825 Py_ssize_t i, nitems, nbufs = 0;
3826 Py_buffer *bufs = NULL;
3827 PyObject *buffers_arg, *fast, *retval = NULL;
3828
3829 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3830 &buffers_arg, &ancbufsize, &flags))
3831 return NULL;
3832
3833 if ((fast = PySequence_Fast(buffers_arg,
3834 "recvmsg_into() argument 1 must be an "
3835 "iterable")) == NULL)
3836 return NULL;
3837 nitems = PySequence_Fast_GET_SIZE(fast);
3838 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003839 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003840 goto finally;
3841 }
3842
3843 /* Fill in an iovec for each item, and save the Py_buffer
3844 structs to release afterwards. */
3845 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3846 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3847 PyErr_NoMemory();
3848 goto finally;
3849 }
3850 for (; nbufs < nitems; nbufs++) {
3851 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3852 "w*;recvmsg_into() argument 1 must be an iterable "
3853 "of single-segment read-write buffers",
3854 &bufs[nbufs]))
3855 goto finally;
3856 iovs[nbufs].iov_base = bufs[nbufs].buf;
3857 iovs[nbufs].iov_len = bufs[nbufs].len;
3858 }
3859
3860 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3861 &makeval_recvmsg_into, NULL);
3862finally:
3863 for (i = 0; i < nbufs; i++)
3864 PyBuffer_Release(&bufs[i]);
3865 PyMem_Free(bufs);
3866 PyMem_Free(iovs);
3867 Py_DECREF(fast);
3868 return retval;
3869}
3870
3871PyDoc_STRVAR(recvmsg_into_doc,
3872"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3873\n\
3874Receive normal data and ancillary data from the socket, scattering the\n\
3875non-ancillary data into a series of buffers. The buffers argument\n\
3876must be an iterable of objects that export writable buffers\n\
3877(e.g. bytearray objects); these will be filled with successive chunks\n\
3878of the non-ancillary data until it has all been written or there are\n\
3879no more buffers. The ancbufsize argument sets the size in bytes of\n\
3880the internal buffer used to receive the ancillary data; it defaults to\n\
38810, meaning that no ancillary data will be received. Appropriate\n\
3882buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3883or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3884truncated or discarded. The flags argument defaults to 0 and has the\n\
3885same meaning as for recv().\n\
3886\n\
3887The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3888The nbytes item is the total number of bytes of non-ancillary data\n\
3889written into the buffers. The ancdata item is a list of zero or more\n\
3890tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3891data (control messages) received: cmsg_level and cmsg_type are\n\
3892integers specifying the protocol level and protocol-specific type\n\
3893respectively, and cmsg_data is a bytes object holding the associated\n\
3894data. The msg_flags item is the bitwise OR of various flags\n\
3895indicating conditions on the received message; see your system\n\
3896documentation for details. If the receiving socket is unconnected,\n\
3897address is the address of the sending socket, if available; otherwise,\n\
3898its value is unspecified.\n\
3899\n\
3900If recvmsg_into() raises an exception after the system call returns,\n\
3901it will first attempt to close any file descriptors received via the\n\
3902SCM_RIGHTS mechanism.");
3903#endif /* CMSG_LEN */
3904
3905
Victor Stinner31bf2d52015-04-01 21:57:09 +02003906struct sock_send {
3907 char *buf;
3908 Py_ssize_t len;
3909 int flags;
3910 Py_ssize_t result;
3911};
3912
3913static int
3914sock_send_impl(PySocketSockObject *s, void *data)
3915{
3916 struct sock_send *ctx = data;
3917
3918#ifdef MS_WINDOWS
3919 if (ctx->len > INT_MAX)
3920 ctx->len = INT_MAX;
3921 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3922#else
3923 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3924#endif
3925 return (ctx->result >= 0);
3926}
3927
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003928/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003929
Guido van Rossum73624e91994-10-10 17:59:00 +00003930static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003931sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003932{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003933 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003935 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3938 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 if (!IS_SELECTABLE(s)) {
3941 PyBuffer_Release(&pbuf);
3942 return select_error();
3943 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003944 ctx.buf = pbuf.buf;
3945 ctx.len = pbuf.len;
3946 ctx.flags = flags;
3947 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003948 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 return NULL;
3950 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003951 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003952
3953 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003954}
3955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003956PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003957"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003958\n\
3959Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003960argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003961sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003962
3963
3964/* s.sendall(data [,flags]) method */
3965
3966static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003967sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003970 Py_ssize_t len, n;
3971 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003973 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003974 int has_timeout = (s->sock_timeout > 0);
3975 _PyTime_t interval = s->sock_timeout;
3976 _PyTime_t deadline = 0;
3977 int deadline_initialized = 0;
3978 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3981 return NULL;
3982 buf = pbuf.buf;
3983 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 if (!IS_SELECTABLE(s)) {
3986 PyBuffer_Release(&pbuf);
3987 return select_error();
3988 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003990 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003991 if (has_timeout) {
3992 if (deadline_initialized) {
3993 /* recompute the timeout */
3994 interval = deadline - _PyTime_GetMonotonicClock();
3995 }
3996 else {
3997 deadline_initialized = 1;
3998 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3999 }
4000
4001 if (interval <= 0) {
4002 PyErr_SetString(socket_timeout, "timed out");
4003 goto done;
4004 }
4005 }
4006
Victor Stinner02f32ab2015-04-01 22:53:26 +02004007 ctx.buf = buf;
4008 ctx.len = len;
4009 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02004010 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
4011 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004012 n = ctx.result;
4013 assert(n >= 0);
4014
4015 buf += n;
4016 len -= n;
4017
4018 /* We must run our signal handlers before looping again.
4019 send() can return a successful partial write when it is
4020 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02004021 if (PyErr_CheckSignals())
4022 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02004023 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004025
Victor Stinner8912d142015-04-06 23:16:34 +02004026 Py_INCREF(Py_None);
4027 res = Py_None;
4028
4029done:
4030 PyBuffer_Release(&pbuf);
4031 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004032}
4033
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004034PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00004035"sendall(data[, flags])\n\
4036\n\
4037Send a data string to the socket. For the optional flags\n\
4038argument, see the Unix manual. This calls send() repeatedly\n\
4039until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004040to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004041
Guido van Rossum30a685f1991-06-27 15:51:29 +00004042
Victor Stinner31bf2d52015-04-01 21:57:09 +02004043struct sock_sendto {
4044 char *buf;
4045 Py_ssize_t len;
4046 int flags;
4047 int addrlen;
4048 sock_addr_t *addrbuf;
4049 Py_ssize_t result;
4050};
4051
4052static int
4053sock_sendto_impl(PySocketSockObject *s, void *data)
4054{
4055 struct sock_sendto *ctx = data;
4056
4057#ifdef MS_WINDOWS
4058 if (ctx->len > INT_MAX)
4059 ctx->len = INT_MAX;
4060 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
4061 SAS2SA(ctx->addrbuf), ctx->addrlen);
4062#else
4063 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
4064 SAS2SA(ctx->addrbuf), ctx->addrlen);
4065#endif
4066 return (ctx->result >= 0);
4067}
4068
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00004069/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004070
Guido van Rossum73624e91994-10-10 17:59:00 +00004071static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004072sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 Py_buffer pbuf;
4075 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004076 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004077 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004078 int addrlen, flags;
4079 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01004082 arglen = PyTuple_Size(args);
4083 switch (arglen) {
4084 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004085 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
4086 return NULL;
4087 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004088 break;
4089 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08004090 if (!PyArg_ParseTuple(args, "y*iO:sendto",
4091 &pbuf, &flags, &addro)) {
4092 return NULL;
4093 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004094 break;
4095 default:
4096 PyErr_Format(PyExc_TypeError,
4097 "sendto() takes 2 or 3 arguments (%d given)",
4098 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02004099 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004100 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01004101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 if (!IS_SELECTABLE(s)) {
4103 PyBuffer_Release(&pbuf);
4104 return select_error();
4105 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00004106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
4108 PyBuffer_Release(&pbuf);
4109 return NULL;
4110 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004111
Victor Stinner31bf2d52015-04-01 21:57:09 +02004112 ctx.buf = pbuf.buf;
4113 ctx.len = pbuf.len;
4114 ctx.flags = flags;
4115 ctx.addrlen = addrlen;
4116 ctx.addrbuf = &addrbuf;
4117 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004118 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 return NULL;
4120 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00004121 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02004122
4123 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004124}
4125
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004126PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004127"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004128\n\
4129Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004130For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004131
Guido van Rossum30a685f1991-06-27 15:51:29 +00004132
Victor Stinner35bee932015-04-02 12:28:07 +02004133/* The sendmsg() and recvmsg[_into]() methods require a working
4134 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4135#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004136struct sock_sendmsg {
4137 struct msghdr *msg;
4138 int flags;
4139 ssize_t result;
4140};
4141
4142static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004143sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4144 struct msghdr *msg,
4145 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4146 Py_ssize_t ndataparts, ndatabufs = 0;
4147 int result = -1;
4148 struct iovec *iovs = NULL;
4149 PyObject *data_fast = NULL;
4150 Py_buffer *databufs = NULL;
4151
4152 /* Fill in an iovec for each message part, and save the Py_buffer
4153 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004154 data_fast = PySequence_Fast(data_arg,
4155 "sendmsg() argument 1 must be an "
4156 "iterable");
4157 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004158 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004159 }
4160
Christian Heimesdffa3942016-09-05 23:54:41 +02004161 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4162 if (ndataparts > INT_MAX) {
4163 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4164 goto finally;
4165 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004166
Christian Heimesdffa3942016-09-05 23:54:41 +02004167 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004168 if (ndataparts > 0) {
4169 iovs = PyMem_New(struct iovec, ndataparts);
4170 if (iovs == NULL) {
4171 PyErr_NoMemory();
4172 goto finally;
4173 }
4174 msg->msg_iov = iovs;
4175
4176 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004177 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004178 PyErr_NoMemory();
4179 goto finally;
4180 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004181 }
4182 for (; ndatabufs < ndataparts; ndatabufs++) {
4183 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4184 "y*;sendmsg() argument 1 must be an iterable of "
4185 "bytes-like objects",
4186 &databufs[ndatabufs]))
4187 goto finally;
4188 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4189 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4190 }
4191 result = 0;
4192 finally:
4193 *databufsout = databufs;
4194 *ndatabufsout = ndatabufs;
4195 Py_XDECREF(data_fast);
4196 return result;
4197}
4198
4199static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004200sock_sendmsg_impl(PySocketSockObject *s, void *data)
4201{
4202 struct sock_sendmsg *ctx = data;
4203
4204 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4205 return (ctx->result >= 0);
4206}
4207
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004208/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4209
4210static PyObject *
4211sock_sendmsg(PySocketSockObject *s, PyObject *args)
4212{
Christian Heimesdffa3942016-09-05 23:54:41 +02004213 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004214 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004215 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004216 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004217 struct cmsginfo {
4218 int level;
4219 int type;
4220 Py_buffer data;
4221 } *cmsgs = NULL;
4222 void *controlbuf = NULL;
4223 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004224 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004225 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004226 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004227 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004228
4229 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004230 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004231 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004232 }
4233
4234 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004235
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004236 /* Parse destination address. */
4237 if (addr_arg != NULL && addr_arg != Py_None) {
4238 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4239 goto finally;
4240 msg.msg_name = &addrbuf;
4241 msg.msg_namelen = addrlen;
4242 }
4243
4244 /* Fill in an iovec for each message part, and save the Py_buffer
4245 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004246 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004247 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004248 }
4249
4250 if (cmsg_arg == NULL)
4251 ncmsgs = 0;
4252 else {
4253 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4254 "sendmsg() argument 2 must be an "
4255 "iterable")) == NULL)
4256 goto finally;
4257 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4258 }
4259
4260#ifndef CMSG_SPACE
4261 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004262 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004263 "sending multiple control messages is not supported "
4264 "on this system");
4265 goto finally;
4266 }
4267#endif
4268 /* Save level, type and Py_buffer for each control message,
4269 and calculate total size. */
4270 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4271 PyErr_NoMemory();
4272 goto finally;
4273 }
4274 controllen = controllen_last = 0;
4275 while (ncmsgbufs < ncmsgs) {
4276 size_t bufsize, space;
4277
4278 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4279 "(iiy*):[sendmsg() ancillary data items]",
4280 &cmsgs[ncmsgbufs].level,
4281 &cmsgs[ncmsgbufs].type,
4282 &cmsgs[ncmsgbufs].data))
4283 goto finally;
4284 bufsize = cmsgs[ncmsgbufs++].data.len;
4285
4286#ifdef CMSG_SPACE
4287 if (!get_CMSG_SPACE(bufsize, &space)) {
4288#else
4289 if (!get_CMSG_LEN(bufsize, &space)) {
4290#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004291 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004292 goto finally;
4293 }
4294 controllen += space;
4295 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004296 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004297 goto finally;
4298 }
4299 controllen_last = controllen;
4300 }
4301
4302 /* Construct ancillary data block from control message info. */
4303 if (ncmsgbufs > 0) {
4304 struct cmsghdr *cmsgh = NULL;
4305
Victor Stinner52d61e42016-09-12 11:41:58 +02004306 controlbuf = PyMem_Malloc(controllen);
4307 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004308 PyErr_NoMemory();
4309 goto finally;
4310 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004311 msg.msg_control = controlbuf;
4312
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004313 msg.msg_controllen = controllen;
4314
4315 /* Need to zero out the buffer as a workaround for glibc's
4316 CMSG_NXTHDR() implementation. After getting the pointer to
4317 the next header, it checks its (uninitialized) cmsg_len
4318 member to see if the "message" fits in the buffer, and
4319 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004320 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004321 memset(controlbuf, 0, controllen);
4322
4323 for (i = 0; i < ncmsgbufs; i++) {
4324 size_t msg_len, data_len = cmsgs[i].data.len;
4325 int enough_space = 0;
4326
4327 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4328 if (cmsgh == NULL) {
4329 PyErr_Format(PyExc_RuntimeError,
4330 "unexpected NULL result from %s()",
4331 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4332 goto finally;
4333 }
4334 if (!get_CMSG_LEN(data_len, &msg_len)) {
4335 PyErr_SetString(PyExc_RuntimeError,
4336 "item size out of range for CMSG_LEN()");
4337 goto finally;
4338 }
4339 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4340 size_t space;
4341
4342 cmsgh->cmsg_len = msg_len;
4343 if (get_cmsg_data_space(&msg, cmsgh, &space))
4344 enough_space = (space >= data_len);
4345 }
4346 if (!enough_space) {
4347 PyErr_SetString(PyExc_RuntimeError,
4348 "ancillary data does not fit in calculated "
4349 "space");
4350 goto finally;
4351 }
4352 cmsgh->cmsg_level = cmsgs[i].level;
4353 cmsgh->cmsg_type = cmsgs[i].type;
4354 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4355 }
4356 }
4357
4358 /* Make the system call. */
4359 if (!IS_SELECTABLE(s)) {
4360 select_error();
4361 goto finally;
4362 }
4363
Victor Stinner31bf2d52015-04-01 21:57:09 +02004364 ctx.msg = &msg;
4365 ctx.flags = flags;
4366 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004367 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004368
4369 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004370
4371finally:
4372 PyMem_Free(controlbuf);
4373 for (i = 0; i < ncmsgbufs; i++)
4374 PyBuffer_Release(&cmsgs[i].data);
4375 PyMem_Free(cmsgs);
4376 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004377 PyMem_Free(msg.msg_iov);
4378 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004379 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004380 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004381 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004382 return retval;
4383}
4384
4385PyDoc_STRVAR(sendmsg_doc,
4386"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4387\n\
4388Send normal and ancillary data to the socket, gathering the\n\
4389non-ancillary data from a series of buffers and concatenating it into\n\
4390a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004391data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004392The ancdata argument specifies the ancillary data (control messages)\n\
4393as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4394cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4395protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004396is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004397argument defaults to 0 and has the same meaning as for send(). If\n\
4398address is supplied and not None, it sets a destination address for\n\
4399the message. The return value is the number of bytes of non-ancillary\n\
4400data sent.");
4401#endif /* CMSG_LEN */
4402
Christian Heimesdffa3942016-09-05 23:54:41 +02004403#ifdef HAVE_SOCKADDR_ALG
4404static PyObject*
4405sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4406{
4407 PyObject *retval = NULL;
4408
4409 Py_ssize_t i, ndatabufs = 0;
4410 Py_buffer *databufs = NULL;
4411 PyObject *data_arg = NULL;
4412
4413 Py_buffer iv = {NULL, NULL};
4414
4415 PyObject *opobj = NULL;
4416 int op = -1;
4417
4418 PyObject *assoclenobj = NULL;
4419 int assoclen = -1;
4420
4421 unsigned int *uiptr;
4422 int flags = 0;
4423
4424 struct msghdr msg;
4425 struct cmsghdr *header = NULL;
4426 struct af_alg_iv *alg_iv = NULL;
4427 struct sock_sendmsg ctx;
4428 Py_ssize_t controllen;
4429 void *controlbuf = NULL;
4430 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4431
4432 if (self->sock_family != AF_ALG) {
4433 PyErr_SetString(PyExc_OSError,
4434 "algset is only supported for AF_ALG");
4435 return NULL;
4436 }
4437
4438 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4439 "|O$O!y*O!i:sendmsg_afalg", keywords,
4440 &data_arg,
4441 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004442 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004443 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004444 }
4445
4446 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004447
4448 /* op is a required, keyword-only argument >= 0 */
4449 if (opobj != NULL) {
4450 op = _PyLong_AsInt(opobj);
4451 }
4452 if (op < 0) {
4453 /* override exception from _PyLong_AsInt() */
4454 PyErr_SetString(PyExc_TypeError,
4455 "Invalid or missing argument 'op'");
4456 goto finally;
4457 }
4458 /* assoclen is optional but must be >= 0 */
4459 if (assoclenobj != NULL) {
4460 assoclen = _PyLong_AsInt(assoclenobj);
4461 if (assoclen == -1 && PyErr_Occurred()) {
4462 goto finally;
4463 }
4464 if (assoclen < 0) {
4465 PyErr_SetString(PyExc_TypeError,
4466 "assoclen must be positive");
4467 goto finally;
4468 }
4469 }
4470
4471 controllen = CMSG_SPACE(4);
4472 if (iv.buf != NULL) {
4473 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4474 }
4475 if (assoclen >= 0) {
4476 controllen += CMSG_SPACE(4);
4477 }
4478
4479 controlbuf = PyMem_Malloc(controllen);
4480 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004481 PyErr_NoMemory();
4482 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004483 }
4484 memset(controlbuf, 0, controllen);
4485
Christian Heimesdffa3942016-09-05 23:54:41 +02004486 msg.msg_controllen = controllen;
4487 msg.msg_control = controlbuf;
4488
4489 /* Fill in an iovec for each message part, and save the Py_buffer
4490 structs to release afterwards. */
4491 if (data_arg != NULL) {
4492 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4493 goto finally;
4494 }
4495 }
4496
4497 /* set operation to encrypt or decrypt */
4498 header = CMSG_FIRSTHDR(&msg);
4499 if (header == NULL) {
4500 PyErr_SetString(PyExc_RuntimeError,
4501 "unexpected NULL result from CMSG_FIRSTHDR");
4502 goto finally;
4503 }
4504 header->cmsg_level = SOL_ALG;
4505 header->cmsg_type = ALG_SET_OP;
4506 header->cmsg_len = CMSG_LEN(4);
4507 uiptr = (void*)CMSG_DATA(header);
4508 *uiptr = (unsigned int)op;
4509
4510 /* set initialization vector */
4511 if (iv.buf != NULL) {
4512 header = CMSG_NXTHDR(&msg, header);
4513 if (header == NULL) {
4514 PyErr_SetString(PyExc_RuntimeError,
4515 "unexpected NULL result from CMSG_NXTHDR(iv)");
4516 goto finally;
4517 }
4518 header->cmsg_level = SOL_ALG;
4519 header->cmsg_type = ALG_SET_IV;
4520 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4521 alg_iv = (void*)CMSG_DATA(header);
4522 alg_iv->ivlen = iv.len;
4523 memcpy(alg_iv->iv, iv.buf, iv.len);
4524 }
4525
4526 /* set length of associated data for AEAD */
4527 if (assoclen >= 0) {
4528 header = CMSG_NXTHDR(&msg, header);
4529 if (header == NULL) {
4530 PyErr_SetString(PyExc_RuntimeError,
4531 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4532 goto finally;
4533 }
4534 header->cmsg_level = SOL_ALG;
4535 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4536 header->cmsg_len = CMSG_LEN(4);
4537 uiptr = (void*)CMSG_DATA(header);
4538 *uiptr = (unsigned int)assoclen;
4539 }
4540
4541 ctx.msg = &msg;
4542 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004543 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004544 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004545 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004546
4547 retval = PyLong_FromSsize_t(ctx.result);
4548
4549 finally:
4550 PyMem_Free(controlbuf);
4551 if (iv.buf != NULL) {
4552 PyBuffer_Release(&iv);
4553 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004554 PyMem_Free(msg.msg_iov);
4555 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004556 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004557 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004558 PyMem_Free(databufs);
4559 return retval;
4560}
4561
4562PyDoc_STRVAR(sendmsg_afalg_doc,
4563"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4564\n\
4565Set operation mode, IV and length of associated data for an AF_ALG\n\
4566operation socket.");
4567#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004568
Guido van Rossum30a685f1991-06-27 15:51:29 +00004569/* s.shutdown(how) method */
4570
Guido van Rossum73624e91994-10-10 17:59:00 +00004571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004572sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 int how;
4575 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004576
Serhiy Storchaka78980432013-01-15 01:12:17 +02004577 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 if (how == -1 && PyErr_Occurred())
4579 return NULL;
4580 Py_BEGIN_ALLOW_THREADS
4581 res = shutdown(s->sock_fd, how);
4582 Py_END_ALLOW_THREADS
4583 if (res < 0)
4584 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004585 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004586}
4587
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004588PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004589"shutdown(flag)\n\
4590\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004591Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4592of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004593
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004594#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004595static PyObject*
4596sock_ioctl(PySocketSockObject *s, PyObject *arg)
4597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 unsigned long cmd = SIO_RCVALL;
4599 PyObject *argO;
4600 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4603 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 switch (cmd) {
4606 case SIO_RCVALL: {
4607 unsigned int option = RCVALL_ON;
4608 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4609 return NULL;
4610 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4611 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4612 return set_error();
4613 }
4614 return PyLong_FromUnsignedLong(recv); }
4615 case SIO_KEEPALIVE_VALS: {
4616 struct tcp_keepalive ka;
4617 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4618 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4619 return NULL;
4620 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4621 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4622 return set_error();
4623 }
4624 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004625#if defined(SIO_LOOPBACK_FAST_PATH)
4626 case SIO_LOOPBACK_FAST_PATH: {
4627 unsigned int option;
4628 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4629 return NULL;
4630 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4631 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4632 return set_error();
4633 }
4634 return PyLong_FromUnsignedLong(recv); }
4635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 default:
4637 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4638 return NULL;
4639 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004640}
4641PyDoc_STRVAR(sock_ioctl_doc,
4642"ioctl(cmd, option) -> long\n\
4643\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004644Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4645SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004646SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4647SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004648#endif
4649
4650#if defined(MS_WINDOWS)
4651static PyObject*
4652sock_share(PySocketSockObject *s, PyObject *arg)
4653{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004654 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004655 DWORD processId;
4656 int result;
4657
4658 if (!PyArg_ParseTuple(arg, "I", &processId))
4659 return NULL;
4660
4661 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004662 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004663 Py_END_ALLOW_THREADS
4664 if (result == SOCKET_ERROR)
4665 return set_error();
4666 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4667}
4668PyDoc_STRVAR(sock_share_doc,
4669"share(process_id) -> bytes\n\
4670\n\
4671Share the socket with another process. The target process id\n\
4672must be provided and the resulting bytes object passed to the target\n\
4673process. There the shared socket can be instantiated by calling\n\
4674socket.fromshare().");
4675
Christian Heimesfaf2f632008-01-06 16:59:19 +00004676
4677#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004678
4679/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004680
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004681static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4683 accept_doc},
4684 {"bind", (PyCFunction)sock_bind, METH_O,
4685 bind_doc},
4686 {"close", (PyCFunction)sock_close, METH_NOARGS,
Christian Heimesd0e31b92018-01-27 09:54:13 +01004687 sock_close_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 {"connect", (PyCFunction)sock_connect, METH_O,
4689 connect_doc},
4690 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4691 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004692 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4693 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4695 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004696#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 {"getpeername", (PyCFunction)sock_getpeername,
4698 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 {"getsockname", (PyCFunction)sock_getsockname,
4701 METH_NOARGS, getsockname_doc},
4702 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4703 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004704#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4706 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004707#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004708#if defined(MS_WINDOWS)
4709 {"share", (PyCFunction)sock_share, METH_VARARGS,
4710 sock_share_doc},
4711#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004712 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 listen_doc},
4714 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4715 recv_doc},
4716 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4717 recv_into_doc},
4718 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4719 recvfrom_doc},
4720 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4721 recvfrom_into_doc},
4722 {"send", (PyCFunction)sock_send, METH_VARARGS,
4723 send_doc},
4724 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4725 sendall_doc},
4726 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4727 sendto_doc},
4728 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4729 setblocking_doc},
Yury Selivanovf11b4602018-01-28 17:27:38 -05004730 {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
4731 getblocking_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4733 settimeout_doc},
4734 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4735 gettimeout_doc},
4736 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4737 setsockopt_doc},
4738 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4739 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004740#ifdef CMSG_LEN
4741 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4742 recvmsg_doc},
4743 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4744 recvmsg_into_doc,},
4745 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4746 sendmsg_doc},
4747#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004748#ifdef HAVE_SOCKADDR_ALG
4749 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4750 sendmsg_afalg_doc},
4751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004753};
4754
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004755/* SockObject members */
4756static PyMemberDef sock_memberlist[] = {
4757 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4758 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4759 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004760 {0},
4761};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004762
Victor Stinner71694d52015-03-28 01:18:54 +01004763static PyGetSetDef sock_getsetlist[] = {
4764 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4765 {NULL} /* sentinel */
4766};
4767
Guido van Rossum73624e91994-10-10 17:59:00 +00004768/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004769 First close the file description. */
4770
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004771static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004772sock_finalize(PySocketSockObject *s)
4773{
4774 SOCKET_T fd;
4775 PyObject *error_type, *error_value, *error_traceback;
4776
4777 /* Save the current exception, if any. */
4778 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4779
Victor Stinnerd3afb622016-07-22 17:47:09 +02004780 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004781 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4782 /* Spurious errors can appear at shutdown */
4783 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4784 PyErr_WriteUnraisable((PyObject *)s);
4785 }
4786 }
4787
4788 /* Only close the socket *after* logging the ResourceWarning warning
4789 to allow the logger to call socket methods like
4790 socket.getsockname(). If the socket is closed before, socket
4791 methods fails with the EBADF error. */
4792 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004793 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004794
4795 /* We do not want to retry upon EINTR: see sock_close() */
4796 Py_BEGIN_ALLOW_THREADS
4797 (void) SOCKETCLOSE(fd);
4798 Py_END_ALLOW_THREADS
4799 }
4800
4801 /* Restore the saved exception. */
4802 PyErr_Restore(error_type, error_value, error_traceback);
4803}
4804
4805static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004806sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004807{
Victor Stinner19a8e842016-03-21 16:36:48 +01004808 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4809 return;
4810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004812}
4813
Guido van Rossum30a685f1991-06-27 15:51:29 +00004814
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004815static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004816sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004817{
Victor Stinnere254e532014-07-26 14:36:55 +02004818 long sock_fd;
4819 /* On Windows, this test is needed because SOCKET_T is unsigned */
4820 if (s->sock_fd == INVALID_SOCKET) {
4821 sock_fd = -1;
4822 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004823#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004824 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 /* this can occur on Win64, and actually there is a special
4826 ugly printf formatter for decimal pointer length integer
4827 printing, only bother if necessary*/
4828 PyErr_SetString(PyExc_OverflowError,
4829 "no printf formatter to display "
4830 "the socket descriptor in decimal");
4831 return NULL;
4832 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004833#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004834 else
4835 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 return PyUnicode_FromFormat(
4837 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004838 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 s->sock_type,
4840 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004841}
4842
4843
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004844/* Create a new, uninitialized socket object. */
4845
4846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004847sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 new = type->tp_alloc(type, 0);
4852 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004853 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004854 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 ((PySocketSockObject *)new)->errorhandler = &set_error;
4856 }
4857 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004858}
4859
4860
4861/* Initialize a new socket object. */
4862
Victor Stinnerdaf45552013-08-28 00:53:59 +02004863#ifdef SOCK_CLOEXEC
4864/* socket() and socketpair() fail with EINVAL on Linux kernel older
4865 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4866static int sock_cloexec_works = -1;
4867#endif
4868
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004869/*ARGSUSED*/
4870static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004871sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 PySocketSockObject *s = (PySocketSockObject *)self;
4874 PyObject *fdobj = NULL;
4875 SOCKET_T fd = INVALID_SOCKET;
Christian Heimesb6e43af2018-01-29 22:37:58 +01004876 int family = -1, type = -1, proto = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004878#ifndef MS_WINDOWS
4879#ifdef SOCK_CLOEXEC
4880 int *atomic_flag_works = &sock_cloexec_works;
4881#else
4882 int *atomic_flag_works = NULL;
4883#endif
4884#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4887 "|iiiO:socket", keywords,
4888 &family, &type, &proto, &fdobj))
4889 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004892#ifdef MS_WINDOWS
4893 /* recreate a socket that was duplicated */
4894 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004895 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004896 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4897 PyErr_Format(PyExc_ValueError,
4898 "socket descriptor string has wrong size, "
4899 "should be %zu bytes.", sizeof(info));
4900 return -1;
4901 }
4902 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4903 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004904 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004905 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4906 Py_END_ALLOW_THREADS
4907 if (fd == INVALID_SOCKET) {
4908 set_error();
4909 return -1;
4910 }
4911 family = info.iAddressFamily;
4912 type = info.iSocketType;
4913 proto = info.iProtocol;
4914 }
4915 else
4916#endif
4917 {
4918 fd = PyLong_AsSocket_t(fdobj);
4919 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4920 return -1;
4921 if (fd == INVALID_SOCKET) {
4922 PyErr_SetString(PyExc_ValueError,
4923 "can't use invalid socket value");
4924 return -1;
4925 }
Christian Heimesb6e43af2018-01-29 22:37:58 +01004926
4927 if (family == -1) {
4928 sock_addr_t addrbuf;
4929 socklen_t addrlen = sizeof(sock_addr_t);
4930
4931 memset(&addrbuf, 0, addrlen);
4932 if (getsockname(fd, SAS2SA(&addrbuf), &addrlen) == 0) {
4933 family = SAS2SA(&addrbuf)->sa_family;
4934 } else {
4935#ifdef MS_WINDOWS
4936 PyErr_SetFromWindowsErrWithFilename(0, "family");
4937#else
4938 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "family");
4939#endif
4940 return -1;
4941 }
4942 }
4943#ifdef SO_TYPE
4944 if (type == -1) {
4945 int tmp;
4946 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004947 if (getsockopt(fd, SOL_SOCKET, SO_TYPE,
4948 (void *)&tmp, &slen) == 0)
4949 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004950 type = tmp;
4951 } else {
4952#ifdef MS_WINDOWS
4953 PyErr_SetFromWindowsErrWithFilename(0, "type");
4954#else
4955 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "type");
4956#endif
4957 return -1;
4958 }
4959 }
4960#else
4961 type = SOCK_STREAM;
4962#endif
4963#ifdef SO_PROTOCOL
4964 if (proto == -1) {
4965 int tmp;
4966 socklen_t slen = sizeof(tmp);
Miss Islington (bot)7df80492018-02-09 07:56:34 -08004967 if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL,
4968 (void *)&tmp, &slen) == 0)
4969 {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004970 proto = tmp;
4971 } else {
4972#ifdef MS_WINDOWS
4973 PyErr_SetFromWindowsErrWithFilename(0, "protocol");
4974#else
4975 PyErr_SetFromErrnoWithFilename(PyExc_OSError, "protocol");
4976#endif
4977 return -1;
4978 }
4979 }
4980#else
4981 proto = 0;
4982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 }
4984 }
4985 else {
Christian Heimesb6e43af2018-01-29 22:37:58 +01004986 /* No fd, default to AF_INET and SOCK_STREAM */
4987 if (family == -1) {
4988 family = AF_INET;
4989 }
4990 if (type == -1) {
4991 type = SOCK_STREAM;
4992 }
4993 if (proto == -1) {
4994 proto = 0;
4995 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004996#ifdef MS_WINDOWS
4997 /* Windows implementation */
4998#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4999#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
5000#endif
5001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02005003 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005004 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005005 NULL, 0,
5006 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
5007 if (fd == INVALID_SOCKET) {
5008 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
5009 support_wsa_no_inherit = 0;
5010 fd = socket(family, type, proto);
5011 }
5012 }
5013 else {
5014 fd = socket(family, type, proto);
5015 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (fd == INVALID_SOCKET) {
5019 set_error();
5020 return -1;
5021 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02005022
5023 if (!support_wsa_no_inherit) {
5024 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
5025 closesocket(fd);
5026 PyErr_SetFromWindowsErr(0);
5027 return -1;
5028 }
5029 }
5030#else
5031 /* UNIX */
5032 Py_BEGIN_ALLOW_THREADS
5033#ifdef SOCK_CLOEXEC
5034 if (sock_cloexec_works != 0) {
5035 fd = socket(family, type | SOCK_CLOEXEC, proto);
5036 if (sock_cloexec_works == -1) {
5037 if (fd >= 0) {
5038 sock_cloexec_works = 1;
5039 }
5040 else if (errno == EINVAL) {
5041 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5042 sock_cloexec_works = 0;
5043 fd = socket(family, type, proto);
5044 }
5045 }
5046 }
5047 else
5048#endif
5049 {
5050 fd = socket(family, type, proto);
5051 }
5052 Py_END_ALLOW_THREADS
5053
5054 if (fd == INVALID_SOCKET) {
5055 set_error();
5056 return -1;
5057 }
5058
5059 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
5060 SOCKETCLOSE(fd);
5061 return -1;
5062 }
5063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02005065 if (init_sockobject(s, fd, family, type, proto) == -1) {
5066 SOCKETCLOSE(fd);
5067 return -1;
5068 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005071
Guido van Rossum384ca9c2001-10-27 22:20:47 +00005072}
5073
5074
Guido van Rossumb6775db1994-08-01 11:34:53 +00005075/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00005076
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005077static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
5079 "_socket.socket", /* tp_name */
5080 sizeof(PySocketSockObject), /* tp_basicsize */
5081 0, /* tp_itemsize */
5082 (destructor)sock_dealloc, /* tp_dealloc */
5083 0, /* tp_print */
5084 0, /* tp_getattr */
5085 0, /* tp_setattr */
5086 0, /* tp_reserved */
5087 (reprfunc)sock_repr, /* tp_repr */
5088 0, /* tp_as_number */
5089 0, /* tp_as_sequence */
5090 0, /* tp_as_mapping */
5091 0, /* tp_hash */
5092 0, /* tp_call */
5093 0, /* tp_str */
5094 PyObject_GenericGetAttr, /* tp_getattro */
5095 0, /* tp_setattro */
5096 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01005097 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
5098 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 sock_doc, /* tp_doc */
5100 0, /* tp_traverse */
5101 0, /* tp_clear */
5102 0, /* tp_richcompare */
5103 0, /* tp_weaklistoffset */
5104 0, /* tp_iter */
5105 0, /* tp_iternext */
5106 sock_methods, /* tp_methods */
5107 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01005108 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 0, /* tp_base */
5110 0, /* tp_dict */
5111 0, /* tp_descr_get */
5112 0, /* tp_descr_set */
5113 0, /* tp_dictoffset */
5114 sock_initobj, /* tp_init */
5115 PyType_GenericAlloc, /* tp_alloc */
5116 sock_new, /* tp_new */
5117 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01005118 0, /* tp_is_gc */
5119 0, /* tp_bases */
5120 0, /* tp_mro */
5121 0, /* tp_cache */
5122 0, /* tp_subclasses */
5123 0, /* tp_weaklist */
5124 0, /* tp_del */
5125 0, /* tp_version_tag */
5126 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005127};
5128
Guido van Rossum30a685f1991-06-27 15:51:29 +00005129
Guido van Rossum81194471991-07-27 21:42:02 +00005130/* Python interface to gethostname(). */
5131
5132/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005133static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005134socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00005135{
Martin v. Löwis72f48422010-10-29 18:20:08 +00005136#ifdef MS_WINDOWS
5137 /* Don't use winsock's gethostname, as this returns the ANSI
5138 version of the hostname, whereas we need a Unicode string.
5139 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005140 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02005141 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01005142 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00005143 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01005144
5145 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01005146 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01005147
5148 if (GetLastError() != ERROR_MORE_DATA)
5149 return PyErr_SetFromWindowsErr(0);
5150
5151 if (size == 0)
5152 return PyUnicode_New(0, 0);
5153
5154 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
5155 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005156 name = PyMem_New(wchar_t, size);
5157 if (!name) {
5158 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01005159 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005160 }
Victor Stinner74168972011-11-17 01:11:36 +01005161 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
5162 name,
5163 &size))
5164 {
5165 PyMem_Free(name);
5166 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005167 }
Victor Stinner74168972011-11-17 01:11:36 +01005168
5169 result = PyUnicode_FromWideChar(name, size);
5170 PyMem_Free(name);
5171 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00005172#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 char buf[1024];
5174 int res;
5175 Py_BEGIN_ALLOW_THREADS
5176 res = gethostname(buf, (int) sizeof buf - 1);
5177 Py_END_ALLOW_THREADS
5178 if (res < 0)
5179 return set_error();
5180 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02005181 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00005182#endif
Guido van Rossum81194471991-07-27 21:42:02 +00005183}
Guido van Rossumff4949e1992-08-05 19:58:53 +00005184
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005185PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005186"gethostname() -> string\n\
5187\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005188Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005189
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005190#ifdef HAVE_SETHOSTNAME
5191PyDoc_STRVAR(sethostname_doc,
5192"sethostname(name)\n\n\
5193Sets the hostname to name.");
5194
5195static PyObject *
5196socket_sethostname(PyObject *self, PyObject *args)
5197{
5198 PyObject *hnobj;
5199 Py_buffer buf;
5200 int res, flag = 0;
5201
Christian Heimesd2774c72013-06-19 02:06:29 +02005202#ifdef _AIX
5203/* issue #18259, not declared in any useful header file */
5204extern int sethostname(const char *, size_t);
5205#endif
5206
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005207 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5208 PyErr_Clear();
5209 if (!PyArg_ParseTuple(args, "O&:sethostname",
5210 PyUnicode_FSConverter, &hnobj))
5211 return NULL;
5212 flag = 1;
5213 }
5214 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5215 if (!res) {
5216 res = sethostname(buf.buf, buf.len);
5217 PyBuffer_Release(&buf);
5218 }
5219 if (flag)
5220 Py_DECREF(hnobj);
5221 if (res)
5222 return set_error();
5223 Py_RETURN_NONE;
5224}
5225#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005226
Guido van Rossum30a685f1991-06-27 15:51:29 +00005227/* Python interface to gethostbyname(name). */
5228
5229/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005230static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005231socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 char *name;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005234 struct sockaddr_in addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005235 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005236
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005237 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 return NULL;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005239 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005240 goto finally;
Miss Islington (bot)04425992018-02-12 12:12:24 -08005241 ret = make_ipv4_addr(&addrbuf);
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005242finally:
5243 PyMem_Free(name);
5244 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005245}
5246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005247PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005248"gethostbyname(host) -> address\n\
5249\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005250Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005251
5252
Victor Stinner72400302016-01-28 15:41:01 +01005253static PyObject*
5254sock_decode_hostname(const char *name)
5255{
5256#ifdef MS_WINDOWS
5257 /* Issue #26227: gethostbyaddr() returns a string encoded
5258 * to the ANSI code page */
5259 return PyUnicode_DecodeFSDefault(name);
5260#else
5261 /* Decode from UTF-8 */
5262 return PyUnicode_FromString(name);
5263#endif
5264}
5265
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005266/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5267
5268static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005269gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 char **pch;
5272 PyObject *rtn_tuple = (PyObject *)NULL;
5273 PyObject *name_list = (PyObject *)NULL;
5274 PyObject *addr_list = (PyObject *)NULL;
5275 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005276 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 if (h == NULL) {
5279 /* Let's get real error message to return */
5280 set_herror(h_errno);
5281 return NULL;
5282 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 if (h->h_addrtype != af) {
5285 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005286 errno = EAFNOSUPPORT;
5287 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 return NULL;
5289 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 case AF_INET:
5294 if (alen < sizeof(struct sockaddr_in))
5295 return NULL;
5296 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005297
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005298#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 case AF_INET6:
5300 if (alen < sizeof(struct sockaddr_in6))
5301 return NULL;
5302 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005303#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 if ((name_list = PyList_New(0)) == NULL)
5308 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 if ((addr_list = PyList_New(0)) == NULL)
5311 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 /* SF #1511317: h_aliases can be NULL */
5314 if (h->h_aliases) {
5315 for (pch = h->h_aliases; *pch != NULL; pch++) {
5316 int status;
5317 tmp = PyUnicode_FromString(*pch);
5318 if (tmp == NULL)
5319 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 status = PyList_Append(name_list, tmp);
5322 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 if (status)
5325 goto err;
5326 }
5327 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5330 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 case AF_INET:
5335 {
5336 struct sockaddr_in sin;
5337 memset(&sin, 0, sizeof(sin));
5338 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005339#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005343 tmp = make_ipv4_addr(&sin);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 if (pch == h->h_addr_list && alen >= sizeof(sin))
5346 memcpy((char *) addr, &sin, sizeof(sin));
5347 break;
5348 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005349
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005350#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 case AF_INET6:
5352 {
5353 struct sockaddr_in6 sin6;
5354 memset(&sin6, 0, sizeof(sin6));
5355 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005356#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
Miss Islington (bot)04425992018-02-12 12:12:24 -08005360 tmp = make_ipv6_addr(&sin6);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5363 memcpy((char *) addr, &sin6, sizeof(sin6));
5364 break;
5365 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005366#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005369 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 "unsupported address family");
5371 return NULL;
5372 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005374 if (tmp == NULL)
5375 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 status = PyList_Append(addr_list, tmp);
5378 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 if (status)
5381 goto err;
5382 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005383
Victor Stinner72400302016-01-28 15:41:01 +01005384 name = sock_decode_hostname(h->h_name);
5385 if (name == NULL)
5386 goto err;
5387 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005388
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005389 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 Py_XDECREF(name_list);
5391 Py_XDECREF(addr_list);
5392 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005393}
5394
5395
5396/* Python interface to gethostbyname_ex(name). */
5397
5398/*ARGSUSED*/
5399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005400socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 char *name;
5403 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005404 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005406 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005407#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005409#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005411#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 char buf[16384];
5413 int buf_len = (sizeof buf) - 1;
5414 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005415#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005416#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005418#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005419#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005420
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005421 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005423 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005424 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005426#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005427#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005428 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005430#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005432#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 memset((void *) &data, '\0', sizeof(data));
5434 result = gethostbyname_r(name, &hp_allocated, &data);
5435 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005436#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005437#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005438#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005440#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005441 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005443#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 Py_END_ALLOW_THREADS
5445 /* Some C libraries would require addr.__ss_family instead of
5446 addr.ss_family.
5447 Therefore, we cast the sockaddr_storage into sockaddr to
5448 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005449 sa = SAS2SA(&addr);
5450 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005452#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005454#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005455finally:
5456 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005458}
5459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005460PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005461"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5462\n\
5463Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005464for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005465
5466
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005467/* Python interface to gethostbyaddr(IP). */
5468
5469/*ARGSUSED*/
5470static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005471socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005472{
Charles-François Natali8b759652011-12-23 16:44:51 +01005473 sock_addr_t addr;
5474 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 char *ip_num;
5476 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005477 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005478#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005480#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005482#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 /* glibcs up to 2.10 assume that the buf argument to
5484 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5485 does not ensure. The attribute below instructs the compiler
5486 to maintain this alignment. */
5487 char buf[16384] Py_ALIGNED(8);
5488 int buf_len = (sizeof buf) - 1;
5489 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005490#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005491#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005493#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005494#endif /* HAVE_GETHOSTBYNAME_R */
Serhiy Storchakad3187152017-11-09 18:00:38 +02005495 const char *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 int al;
5497 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005498
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005499 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 return NULL;
5501 af = AF_UNSPEC;
5502 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005503 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 af = sa->sa_family;
5505 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005506 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 switch (af) {
5508 case AF_INET:
5509 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5510 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5511 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005512#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 case AF_INET6:
5514 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5515 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5516 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005519 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005520 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 }
5522 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005523#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005524#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005525 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 &hp_allocated, buf, buf_len,
5527 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005528#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 h = gethostbyaddr_r(ap, al, af,
5530 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005531#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 memset((void *) &data, '\0', sizeof(data));
5533 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5534 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005535#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005536#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005537#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005539#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005540 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005542#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005544 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005545#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005547#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005548finally:
5549 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005551}
5552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005553PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005554"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5555\n\
5556Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005557for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005558
Guido van Rossum30a685f1991-06-27 15:51:29 +00005559
5560/* Python interface to getservbyname(name).
5561 This only returns the port number, since the other info is already
5562 known or not useful (like the list of aliases). */
5563
5564/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005566socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005567{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005568 const char *name, *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 struct servent *sp;
5570 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5571 return NULL;
5572 Py_BEGIN_ALLOW_THREADS
5573 sp = getservbyname(name, proto);
5574 Py_END_ALLOW_THREADS
5575 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005576 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 return NULL;
5578 }
5579 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005580}
5581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005582PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005583"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005584\n\
5585Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005586The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5587otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005588
Guido van Rossum30a685f1991-06-27 15:51:29 +00005589
Barry Warsaw11b91a02004-06-28 00:50:43 +00005590/* Python interface to getservbyport(port).
5591 This only returns the service name, since the other info is already
5592 known or not useful (like the list of aliases). */
5593
5594/*ARGSUSED*/
5595static PyObject *
5596socket_getservbyport(PyObject *self, PyObject *args)
5597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 int port;
Serhiy Storchakad3187152017-11-09 18:00:38 +02005599 const char *proto=NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 struct servent *sp;
5601 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5602 return NULL;
5603 if (port < 0 || port > 0xffff) {
5604 PyErr_SetString(
5605 PyExc_OverflowError,
5606 "getservbyport: port must be 0-65535.");
5607 return NULL;
5608 }
5609 Py_BEGIN_ALLOW_THREADS
5610 sp = getservbyport(htons((short)port), proto);
5611 Py_END_ALLOW_THREADS
5612 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005613 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 return NULL;
5615 }
5616 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005617}
5618
5619PyDoc_STRVAR(getservbyport_doc,
5620"getservbyport(port[, protocolname]) -> string\n\
5621\n\
5622Return the service name from a port number and protocol name.\n\
5623The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5624otherwise any protocol will match.");
5625
Guido van Rossum3901d851996-12-19 16:35:04 +00005626/* Python interface to getprotobyname(name).
5627 This only returns the protocol number, since the other info is
5628 already known or not useful (like the list of aliases). */
5629
5630/*ARGSUSED*/
5631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005632socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005633{
Serhiy Storchakad3187152017-11-09 18:00:38 +02005634 const char *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 struct protoent *sp;
5636 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5637 return NULL;
5638 Py_BEGIN_ALLOW_THREADS
5639 sp = getprotobyname(name);
5640 Py_END_ALLOW_THREADS
5641 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005642 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 return NULL;
5644 }
5645 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005646}
5647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005648PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005649"getprotobyname(name) -> integer\n\
5650\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005651Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005652
Christian Heimesd0e31b92018-01-27 09:54:13 +01005653static PyObject *
5654socket_close(PyObject *self, PyObject *fdobj)
5655{
5656 SOCKET_T fd;
5657 int res;
5658
5659 fd = PyLong_AsSocket_t(fdobj);
5660 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5661 return NULL;
5662 Py_BEGIN_ALLOW_THREADS
5663 res = SOCKETCLOSE(fd);
5664 Py_END_ALLOW_THREADS
5665 /* bpo-30319: The peer can already have closed the connection.
5666 Python ignores ECONNRESET on close(). */
5667 if (res < 0 && !CHECK_ERRNO(ECONNRESET)) {
5668 return set_error();
5669 }
5670 Py_RETURN_NONE;
5671}
5672
5673PyDoc_STRVAR(close_doc,
5674"close(integer) -> None\n\
5675\n\
5676Close an integer socket file descriptor. This is like os.close(), but for\n\
5677sockets; on some platforms os.close() won't work for socket file descriptors.");
Guido van Rossum3901d851996-12-19 16:35:04 +00005678
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005679#ifndef NO_DUP
5680/* dup() function for socket fds */
5681
5682static PyObject *
5683socket_dup(PyObject *self, PyObject *fdobj)
5684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 SOCKET_T fd, newfd;
5686 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005687#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005688 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005689#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 fd = PyLong_AsSocket_t(fdobj);
5692 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5693 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005694
Victor Stinnerdaf45552013-08-28 00:53:59 +02005695#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005696 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005697 return set_error();
5698
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005699 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005700 FROM_PROTOCOL_INFO,
5701 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 if (newfd == INVALID_SOCKET)
5703 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005704
Victor Stinnerdaf45552013-08-28 00:53:59 +02005705 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5706 closesocket(newfd);
5707 PyErr_SetFromWindowsErr(0);
5708 return NULL;
5709 }
5710#else
5711 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5712 newfd = _Py_dup(fd);
5713 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005714 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005715#endif
5716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 newfdobj = PyLong_FromSocket_t(newfd);
5718 if (newfdobj == NULL)
5719 SOCKETCLOSE(newfd);
5720 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005721}
5722
5723PyDoc_STRVAR(dup_doc,
5724"dup(integer) -> integer\n\
5725\n\
5726Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5727sockets; on some platforms os.dup() won't work for socket file descriptors.");
5728#endif
5729
5730
Dave Cole331708b2004-08-09 04:51:41 +00005731#ifdef HAVE_SOCKETPAIR
5732/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005733 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005734 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005735
5736/*ARGSUSED*/
5737static PyObject *
5738socket_socketpair(PyObject *self, PyObject *args)
5739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 PySocketSockObject *s0 = NULL, *s1 = NULL;
5741 SOCKET_T sv[2];
5742 int family, type = SOCK_STREAM, proto = 0;
5743 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005744#ifdef SOCK_CLOEXEC
5745 int *atomic_flag_works = &sock_cloexec_works;
5746#else
5747 int *atomic_flag_works = NULL;
5748#endif
5749 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005750
5751#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5757 &family, &type, &proto))
5758 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005760 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005761 Py_BEGIN_ALLOW_THREADS
5762#ifdef SOCK_CLOEXEC
5763 if (sock_cloexec_works != 0) {
5764 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5765 if (sock_cloexec_works == -1) {
5766 if (ret >= 0) {
5767 sock_cloexec_works = 1;
5768 }
5769 else if (errno == EINVAL) {
5770 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5771 sock_cloexec_works = 0;
5772 ret = socketpair(family, type, proto, sv);
5773 }
5774 }
5775 }
5776 else
5777#endif
5778 {
5779 ret = socketpair(family, type, proto, sv);
5780 }
5781 Py_END_ALLOW_THREADS
5782
5783 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005785
5786 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5787 goto finally;
5788 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5789 goto finally;
5790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 s0 = new_sockobject(sv[0], family, type, proto);
5792 if (s0 == NULL)
5793 goto finally;
5794 s1 = new_sockobject(sv[1], family, type, proto);
5795 if (s1 == NULL)
5796 goto finally;
5797 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005798
5799finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 if (res == NULL) {
5801 if (s0 == NULL)
5802 SOCKETCLOSE(sv[0]);
5803 if (s1 == NULL)
5804 SOCKETCLOSE(sv[1]);
5805 }
5806 Py_XDECREF(s0);
5807 Py_XDECREF(s1);
5808 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005809}
5810
5811PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005812"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005813\n\
5814Create a pair of socket objects from the sockets returned by the platform\n\
5815socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005816The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005817AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005818
5819#endif /* HAVE_SOCKETPAIR */
5820
5821
Guido van Rossum006bf911996-06-12 04:04:55 +00005822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005823socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005824{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005825 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005826
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005827 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 return NULL;
5829 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005830 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005832 "ntohs: can't convert negative Python int to C "
5833 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 return NULL;
5835 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005836 if (x > 0xffff) {
5837 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5838 "ntohs: Python int too large to convert to C "
5839 "16-bit unsigned integer (The silent truncation "
5840 "is deprecated)",
5841 1)) {
5842 return NULL;
5843 }
5844 }
5845 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005846}
5847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005848PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005849"ntohs(integer) -> integer\n\
5850\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005851Convert a 16-bit unsigned integer from network to host byte order.\n\
5852Note that in case the received integer does not fit in 16-bit unsigned\n\
5853integer, but does fit in a positive C int, it is silently truncated to\n\
585416-bit unsigned integer.\n\
5855However, this silent truncation feature is deprecated, and will raise an \n\
5856exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005857
5858
Guido van Rossum006bf911996-06-12 04:04:55 +00005859static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005860socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 if (PyLong_Check(arg)) {
5865 x = PyLong_AsUnsignedLong(arg);
5866 if (x == (unsigned long) -1 && PyErr_Occurred())
5867 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005868#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 {
5870 unsigned long y;
5871 /* only want the trailing 32 bits */
5872 y = x & 0xFFFFFFFFUL;
5873 if (y ^ x)
5874 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005875 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 x = y;
5877 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 }
5880 else
5881 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005882 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005885}
5886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005887PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005888"ntohl(integer) -> integer\n\
5889\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005890Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005891
5892
Guido van Rossum006bf911996-06-12 04:04:55 +00005893static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005894socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005895{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005896 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005897
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005898 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 return NULL;
5900 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005901 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005903 "htons: can't convert negative Python int to C "
5904 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 return NULL;
5906 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005907 if (x > 0xffff) {
5908 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5909 "htons: Python int too large to convert to C "
5910 "16-bit unsigned integer (The silent truncation "
5911 "is deprecated)",
5912 1)) {
5913 return NULL;
5914 }
5915 }
5916 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005917}
5918
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005919PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005920"htons(integer) -> integer\n\
5921\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005922Convert a 16-bit unsigned integer from host to network byte order.\n\
5923Note that in case the received integer does not fit in 16-bit unsigned\n\
5924integer, but does fit in a positive C int, it is silently truncated to\n\
592516-bit unsigned integer.\n\
5926However, this silent truncation feature is deprecated, and will raise an \n\
5927exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005928
5929
Guido van Rossum006bf911996-06-12 04:04:55 +00005930static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005931socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 if (PyLong_Check(arg)) {
5936 x = PyLong_AsUnsignedLong(arg);
5937 if (x == (unsigned long) -1 && PyErr_Occurred())
5938 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005939#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 {
5941 unsigned long y;
5942 /* only want the trailing 32 bits */
5943 y = x & 0xFFFFFFFFUL;
5944 if (y ^ x)
5945 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005946 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 x = y;
5948 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 }
5951 else
5952 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005953 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 Py_TYPE(arg)->tp_name);
5955 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005956}
5957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005958PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005959"htonl(integer) -> integer\n\
5960\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005961Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005962
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005963/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005965PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005966"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005967\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005968Convert 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 +00005969binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005970
5971static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005972socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005973{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005974#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005976#endif
5977
5978#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005979#if (SIZEOF_INT != 4)
5980#error "Not sure if in_addr_t exists and int is not 32-bits."
5981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 /* Have to use inet_addr() instead */
5983 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005984#endif
Serhiy Storchakad3187152017-11-09 18:00:38 +02005985 const char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5988 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005989
Tim Peters1df9fdd2003-02-13 03:13:40 +00005990
5991#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005992
5993#ifdef USE_INET_ATON_WEAKLINK
5994 if (inet_aton != NULL) {
5995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996 if (inet_aton(ip_addr, &buf))
5997 return PyBytes_FromStringAndSize((char *)(&buf),
5998 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005999
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006000 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 "illegal IP address string passed to inet_aton");
6002 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006003
Thomas Wouters477c8d52006-05-27 19:21:47 +00006004#ifdef USE_INET_ATON_WEAKLINK
6005 } else {
6006#endif
6007
6008#endif
6009
6010#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
6011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 /* special-case this address as inet_addr might return INADDR_NONE
6013 * for this */
6014 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02006015 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00006017
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006018 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00006020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006022 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 "illegal IP address string passed to inet_aton");
6024 return NULL;
6025 }
6026 }
6027 return PyBytes_FromStringAndSize((char *) &packed_addr,
6028 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00006029
6030#ifdef USE_INET_ATON_WEAKLINK
6031 }
6032#endif
6033
Guido van Rossumad05cdf2003-02-12 23:08:22 +00006034#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006035}
6036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006037PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00006038"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006039\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006040Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006041
6042static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006043socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006044{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006045 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006047
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006048 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 return NULL;
6050 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00006051
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006052 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006053 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006055 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 return NULL;
6057 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006058
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006059 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
6060 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006061
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006062 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00006064}
Guido van Rossum82a5c661998-07-07 20:45:43 +00006065
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006066#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006067
6068PyDoc_STRVAR(inet_pton_doc,
6069"inet_pton(af, ip) -> packed IP address string\n\
6070\n\
6071Convert an IP address from string format to a packed string suitable\n\
6072for use with low-level network functions.");
6073
6074static PyObject *
6075socket_inet_pton(PyObject *self, PyObject *args)
6076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 int af;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006078 const char* ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006080#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02006081 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006082#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
6086 return NULL;
6087 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006088
Martin v. Löwis04697e82004-06-02 12:35:29 +00006089#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006091 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 "can't use AF_INET6, IPv6 is disabled");
6093 return NULL;
6094 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00006095#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00006096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 retval = inet_pton(af, ip, packed);
6098 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006099 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 return NULL;
6101 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006102 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 "illegal IP address string passed to inet_pton");
6104 return NULL;
6105 } else if (af == AF_INET) {
6106 return PyBytes_FromStringAndSize(packed,
6107 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006108#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 } else if (af == AF_INET6) {
6110 return PyBytes_FromStringAndSize(packed,
6111 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006114 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006115 return NULL;
6116 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006117}
Thomas Wouters477c8d52006-05-27 19:21:47 +00006118
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006119PyDoc_STRVAR(inet_ntop_doc,
6120"inet_ntop(af, packed_ip) -> string formatted IP address\n\
6121\n\
6122Convert a packed IP address of the given family to string format.");
6123
6124static PyObject *
6125socket_inet_ntop(PyObject *self, PyObject *args)
6126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006128 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006130#ifdef ENABLE_IPV6
Miss Islington (bot)04425992018-02-12 12:12:24 -08006131 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006132#else
Miss Islington (bot)04425992018-02-12 12:12:24 -08006133 char ip[INET_ADDRSTRLEN];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006134#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00006135
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006136 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 return NULL;
6138 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006141 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 PyErr_SetString(PyExc_ValueError,
6143 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006144 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 return NULL;
6146 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006147#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006149 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 PyErr_SetString(PyExc_ValueError,
6151 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006152 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 return NULL;
6154 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156 } else {
6157 PyErr_Format(PyExc_ValueError,
6158 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006159 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006160 return NULL;
6161 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006162
Miss Islington (bot)04425992018-02-12 12:12:24 -08006163 /* inet_ntop guarantee NUL-termination of resulting string. */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02006164 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
6165 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006167 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 return NULL;
6169 } else {
6170 return PyUnicode_FromString(retval);
6171 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006172}
6173
6174#endif /* HAVE_INET_PTON */
6175
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006176/* Python interface to getaddrinfo(host, port). */
6177
6178/*ARGSUSED*/
6179static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006180socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006181{
Victor Stinner77af1722011-05-26 14:05:59 +02006182 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006183 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 struct addrinfo hints, *res;
6185 struct addrinfo *res0 = NULL;
6186 PyObject *hobj = NULL;
6187 PyObject *pobj = (PyObject *)NULL;
6188 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02006189 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 int family, socktype, protocol, flags;
6191 int error;
6192 PyObject *all = (PyObject *)NULL;
6193 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006194
Georg Brandl6083a4b2013-10-14 06:51:46 +02006195 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02006197 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006198 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199 &protocol, &flags)) {
6200 return NULL;
6201 }
6202 if (hobj == Py_None) {
6203 hptr = NULL;
6204 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02006205 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 if (!idna)
6207 return NULL;
6208 assert(PyBytes_Check(idna));
6209 hptr = PyBytes_AS_STRING(idna);
6210 } else if (PyBytes_Check(hobj)) {
6211 hptr = PyBytes_AsString(hobj);
6212 } else {
6213 PyErr_SetString(PyExc_TypeError,
6214 "getaddrinfo() argument 1 must be string or None");
6215 return NULL;
6216 }
6217 if (PyLong_CheckExact(pobj)) {
6218 long value = PyLong_AsLong(pobj);
6219 if (value == -1 && PyErr_Occurred())
6220 goto err;
6221 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6222 pptr = pbuf;
6223 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006224 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006225 if (pptr == NULL)
6226 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006228 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 } else if (pobj == Py_None) {
6230 pptr = (char *)NULL;
6231 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006232 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 goto err;
6234 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006235#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006236 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
Miss Islington (bot)e86db342018-02-03 17:41:43 -08006237 /* On OSX up to at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006238 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6239 * This workaround avoids a segfault in libsystem.
6240 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006241 pptr = "00";
6242 }
6243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 memset(&hints, 0, sizeof(hints));
6245 hints.ai_family = family;
6246 hints.ai_socktype = socktype;
6247 hints.ai_protocol = protocol;
6248 hints.ai_flags = flags;
6249 Py_BEGIN_ALLOW_THREADS
6250 ACQUIRE_GETADDRINFO_LOCK
6251 error = getaddrinfo(hptr, pptr, &hints, &res0);
6252 Py_END_ALLOW_THREADS
6253 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6254 if (error) {
6255 set_gaierror(error);
6256 goto err;
6257 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006258
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006259 all = PyList_New(0);
6260 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 goto err;
6262 for (res = res0; res; res = res->ai_next) {
6263 PyObject *single;
6264 PyObject *addr =
6265 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6266 if (addr == NULL)
6267 goto err;
6268 single = Py_BuildValue("iiisO", res->ai_family,
6269 res->ai_socktype, res->ai_protocol,
6270 res->ai_canonname ? res->ai_canonname : "",
6271 addr);
6272 Py_DECREF(addr);
6273 if (single == NULL)
6274 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006275
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006276 if (PyList_Append(all, single)) {
6277 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 goto err;
Miss Islington (bot)b5ea5e52018-11-15 01:25:34 -08006279 }
6280 Py_DECREF(single);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 }
6282 Py_XDECREF(idna);
6283 if (res0)
6284 freeaddrinfo(res0);
6285 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006286 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 Py_XDECREF(all);
6288 Py_XDECREF(idna);
6289 if (res0)
6290 freeaddrinfo(res0);
6291 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006292}
6293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006294PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006295"getaddrinfo(host, port [, family, type, proto, flags])\n\
6296 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006297\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006298Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006299
6300/* Python interface to getnameinfo(sa, flags). */
6301
6302/*ARGSUSED*/
6303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006304socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306 PyObject *sa = (PyObject *)NULL;
6307 int flags;
Serhiy Storchakad3187152017-11-09 18:00:38 +02006308 const char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006309 int port;
6310 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006311 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6312 struct addrinfo hints, *res = NULL;
6313 int error;
6314 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006315 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 flags = flowinfo = scope_id = 0;
6318 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6319 return NULL;
6320 if (!PyTuple_Check(sa)) {
6321 PyErr_SetString(PyExc_TypeError,
6322 "getnameinfo() argument 1 must be a tuple");
6323 return NULL;
6324 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006325 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006327 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006329 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006330 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006331 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006332 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006333 return NULL;
6334 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6336 memset(&hints, 0, sizeof(hints));
6337 hints.ai_family = AF_UNSPEC;
6338 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006339 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340 Py_BEGIN_ALLOW_THREADS
6341 ACQUIRE_GETADDRINFO_LOCK
6342 error = getaddrinfo(hostp, pbuf, &hints, &res);
6343 Py_END_ALLOW_THREADS
6344 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6345 if (error) {
6346 set_gaierror(error);
6347 goto fail;
6348 }
6349 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006350 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351 "sockaddr resolved to multiple addresses");
6352 goto fail;
6353 }
6354 switch (res->ai_family) {
6355 case AF_INET:
6356 {
6357 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006358 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 "IPv4 sockaddr must be 2 tuple");
6360 goto fail;
6361 }
6362 break;
6363 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006364#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 case AF_INET6:
6366 {
6367 struct sockaddr_in6 *sin6;
6368 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006369 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 sin6->sin6_scope_id = scope_id;
6371 break;
6372 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006373#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006375 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6377 if (error) {
6378 set_gaierror(error);
6379 goto fail;
6380 }
Victor Stinner72400302016-01-28 15:41:01 +01006381
6382 name = sock_decode_hostname(hbuf);
6383 if (name == NULL)
6384 goto fail;
6385 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006386
6387fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 if (res)
6389 freeaddrinfo(res);
6390 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006391}
6392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006393PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006394"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006395\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006396Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006397
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006398
6399/* Python API to getting and setting the default timeout value. */
6400
6401static PyObject *
6402socket_getdefaulttimeout(PyObject *self)
6403{
Victor Stinner71694d52015-03-28 01:18:54 +01006404 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006405 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 }
Victor Stinner71694d52015-03-28 01:18:54 +01006407 else {
6408 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6409 return PyFloat_FromDouble(seconds);
6410 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006411}
6412
6413PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006414"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006415\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006416Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006417A value of None indicates that new socket objects have no timeout.\n\
6418When the socket module is first imported, the default is None.");
6419
6420static PyObject *
6421socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6422{
Victor Stinner71694d52015-03-28 01:18:54 +01006423 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006424
Victor Stinner71694d52015-03-28 01:18:54 +01006425 if (socket_parse_timeout(&timeout, arg) < 0)
6426 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006429
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006430 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006431}
6432
6433PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006434"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006435\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006436Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006437A value of None indicates that new socket objects have no timeout.\n\
6438When the socket module is first imported, the default is None.");
6439
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006440#ifdef HAVE_IF_NAMEINDEX
6441/* Python API for getting interface indices and names */
6442
6443static PyObject *
6444socket_if_nameindex(PyObject *self, PyObject *arg)
6445{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006446 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006447 int i;
6448 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006449
Charles-François Natali60713592011-05-20 16:55:06 +02006450 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006451 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006452 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006453 return NULL;
6454 }
6455
6456 list = PyList_New(0);
6457 if (list == NULL) {
6458 if_freenameindex(ni);
6459 return NULL;
6460 }
6461
Charles-François Natali60713592011-05-20 16:55:06 +02006462 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6463 PyObject *ni_tuple = Py_BuildValue("IO&",
6464 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006465
6466 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6467 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006468 Py_DECREF(list);
6469 if_freenameindex(ni);
6470 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006471 }
6472 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006473 }
6474
6475 if_freenameindex(ni);
6476 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006477}
6478
6479PyDoc_STRVAR(if_nameindex_doc,
6480"if_nameindex()\n\
6481\n\
6482Returns a list of network interface information (index, name) tuples.");
6483
Charles-François Natali60713592011-05-20 16:55:06 +02006484static PyObject *
6485socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006486{
Charles-François Natali60713592011-05-20 16:55:06 +02006487 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006488 unsigned long index;
6489
Charles-François Natali60713592011-05-20 16:55:06 +02006490 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6491 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006492 return NULL;
6493
Charles-François Natali60713592011-05-20 16:55:06 +02006494 index = if_nametoindex(PyBytes_AS_STRING(oname));
6495 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006496 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006497 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006498 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006499 return NULL;
6500 }
6501
6502 return PyLong_FromUnsignedLong(index);
6503}
6504
6505PyDoc_STRVAR(if_nametoindex_doc,
6506"if_nametoindex(if_name)\n\
6507\n\
6508Returns the interface index corresponding to the interface name if_name.");
6509
Charles-François Natali60713592011-05-20 16:55:06 +02006510static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006511socket_if_indextoname(PyObject *self, PyObject *arg)
6512{
Charles-François Natali60713592011-05-20 16:55:06 +02006513 unsigned long index;
6514 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006515
Charles-François Natali60713592011-05-20 16:55:06 +02006516 index = PyLong_AsUnsignedLong(arg);
6517 if (index == (unsigned long) -1)
6518 return NULL;
6519
6520 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006521 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006522 return NULL;
6523 }
6524
Charles-François Natali60713592011-05-20 16:55:06 +02006525 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006526}
6527
6528PyDoc_STRVAR(if_indextoname_doc,
6529"if_indextoname(if_index)\n\
6530\n\
6531Returns the interface name corresponding to the interface index if_index.");
6532
6533#endif /* HAVE_IF_NAMEINDEX */
6534
6535
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006536#ifdef CMSG_LEN
6537/* Python interface to CMSG_LEN(length). */
6538
6539static PyObject *
6540socket_CMSG_LEN(PyObject *self, PyObject *args)
6541{
6542 Py_ssize_t length;
6543 size_t result;
6544
6545 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6546 return NULL;
6547 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6548 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6549 return NULL;
6550 }
6551 return PyLong_FromSize_t(result);
6552}
6553
6554PyDoc_STRVAR(CMSG_LEN_doc,
6555"CMSG_LEN(length) -> control message length\n\
6556\n\
6557Return the total length, without trailing padding, of an ancillary\n\
6558data item with associated data of the given length. This value can\n\
6559often be used as the buffer size for recvmsg() to receive a single\n\
6560item of ancillary data, but RFC 3542 requires portable applications to\n\
6561use CMSG_SPACE() and thus include space for padding, even when the\n\
6562item will be the last in the buffer. Raises OverflowError if length\n\
6563is outside the permissible range of values.");
6564
6565
6566#ifdef CMSG_SPACE
6567/* Python interface to CMSG_SPACE(length). */
6568
6569static PyObject *
6570socket_CMSG_SPACE(PyObject *self, PyObject *args)
6571{
6572 Py_ssize_t length;
6573 size_t result;
6574
6575 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6576 return NULL;
6577 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6578 PyErr_SetString(PyExc_OverflowError,
6579 "CMSG_SPACE() argument out of range");
6580 return NULL;
6581 }
6582 return PyLong_FromSize_t(result);
6583}
6584
6585PyDoc_STRVAR(CMSG_SPACE_doc,
6586"CMSG_SPACE(length) -> buffer size\n\
6587\n\
6588Return the buffer size needed for recvmsg() to receive an ancillary\n\
6589data item with associated data of the given length, along with any\n\
6590trailing padding. The buffer space needed to receive multiple items\n\
6591is the sum of the CMSG_SPACE() values for their associated data\n\
6592lengths. Raises OverflowError if length is outside the permissible\n\
6593range of values.");
6594#endif /* CMSG_SPACE */
6595#endif /* CMSG_LEN */
6596
6597
Guido van Rossum30a685f1991-06-27 15:51:29 +00006598/* List of functions exported by this module. */
6599
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006600static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 {"gethostbyname", socket_gethostbyname,
6602 METH_VARARGS, gethostbyname_doc},
6603 {"gethostbyname_ex", socket_gethostbyname_ex,
6604 METH_VARARGS, ghbn_ex_doc},
6605 {"gethostbyaddr", socket_gethostbyaddr,
6606 METH_VARARGS, gethostbyaddr_doc},
6607 {"gethostname", socket_gethostname,
6608 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006609#ifdef HAVE_SETHOSTNAME
6610 {"sethostname", socket_sethostname,
6611 METH_VARARGS, sethostname_doc},
6612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 {"getservbyname", socket_getservbyname,
6614 METH_VARARGS, getservbyname_doc},
6615 {"getservbyport", socket_getservbyport,
6616 METH_VARARGS, getservbyport_doc},
6617 {"getprotobyname", socket_getprotobyname,
6618 METH_VARARGS, getprotobyname_doc},
Christian Heimesd0e31b92018-01-27 09:54:13 +01006619 {"close", socket_close,
6620 METH_O, close_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006621#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622 {"dup", socket_dup,
6623 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006624#endif
Dave Cole331708b2004-08-09 04:51:41 +00006625#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626 {"socketpair", socket_socketpair,
6627 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 {"ntohs", socket_ntohs,
6630 METH_VARARGS, ntohs_doc},
6631 {"ntohl", socket_ntohl,
6632 METH_O, ntohl_doc},
6633 {"htons", socket_htons,
6634 METH_VARARGS, htons_doc},
6635 {"htonl", socket_htonl,
6636 METH_O, htonl_doc},
6637 {"inet_aton", socket_inet_aton,
6638 METH_VARARGS, inet_aton_doc},
6639 {"inet_ntoa", socket_inet_ntoa,
6640 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006641#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642 {"inet_pton", socket_inet_pton,
6643 METH_VARARGS, inet_pton_doc},
6644 {"inet_ntop", socket_inet_ntop,
6645 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006646#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006647 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6648 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 {"getnameinfo", socket_getnameinfo,
6650 METH_VARARGS, getnameinfo_doc},
6651 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6652 METH_NOARGS, getdefaulttimeout_doc},
6653 {"setdefaulttimeout", socket_setdefaulttimeout,
6654 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006655#ifdef HAVE_IF_NAMEINDEX
6656 {"if_nameindex", socket_if_nameindex,
6657 METH_NOARGS, if_nameindex_doc},
6658 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006659 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006660 {"if_indextoname", socket_if_indextoname,
6661 METH_O, if_indextoname_doc},
6662#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006663#ifdef CMSG_LEN
6664 {"CMSG_LEN", socket_CMSG_LEN,
6665 METH_VARARGS, CMSG_LEN_doc},
6666#ifdef CMSG_SPACE
6667 {"CMSG_SPACE", socket_CMSG_SPACE,
6668 METH_VARARGS, CMSG_SPACE_doc},
6669#endif
6670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006672};
6673
Guido van Rossum30a685f1991-06-27 15:51:29 +00006674
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006675#ifdef MS_WINDOWS
6676#define OS_INIT_DEFINED
6677
6678/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006679
6680static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006681os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006684}
6685
6686static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006687os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 WSADATA WSAData;
6690 int ret;
6691 ret = WSAStartup(0x0101, &WSAData);
6692 switch (ret) {
6693 case 0: /* No error */
6694 Py_AtExit(os_cleanup);
6695 return 1; /* Success */
6696 case WSASYSNOTREADY:
6697 PyErr_SetString(PyExc_ImportError,
6698 "WSAStartup failed: network not ready");
6699 break;
6700 case WSAVERNOTSUPPORTED:
6701 case WSAEINVAL:
6702 PyErr_SetString(
6703 PyExc_ImportError,
6704 "WSAStartup failed: requested version not supported");
6705 break;
6706 default:
6707 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6708 break;
6709 }
6710 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006711}
6712
Guido van Rossum8d665e61996-06-26 18:22:49 +00006713#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006714
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006715
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006716
6717#ifndef OS_INIT_DEFINED
6718static int
6719os_init(void)
6720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006722}
6723#endif
6724
6725
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006726/* C API table - always add new things to the end for binary
6727 compatibility. */
6728static
6729PySocketModule_APIObject PySocketModuleAPI =
6730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006732 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006734};
6735
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006736
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006737/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006738
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006739 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006740 "socket.py" which implements some additional functionality.
6741 The import of "_socket" may fail with an ImportError exception if
6742 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006743 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006744 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006745*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006746
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006747PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006748"Implementation module for socket operations.\n\
6749\n\
6750See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006751
Martin v. Löwis1a214512008-06-11 05:26:20 +00006752static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 PyModuleDef_HEAD_INIT,
6754 PySocket_MODULE_NAME,
6755 socket_doc,
6756 -1,
6757 socket_methods,
6758 NULL,
6759 NULL,
6760 NULL,
6761 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006762};
6763
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006764PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006765PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769 if (!os_init())
6770 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006771
Victor Stinnerdaf45552013-08-28 00:53:59 +02006772#ifdef MS_WINDOWS
6773 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006774 support_wsa_no_inherit = IsWindows7SP1OrGreater();
Victor Stinnerdaf45552013-08-28 00:53:59 +02006775 }
6776#endif
6777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 Py_TYPE(&sock_type) = &PyType_Type;
6779 m = PyModule_Create(&socketmodule);
6780 if (m == NULL)
6781 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006782
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006783 Py_INCREF(PyExc_OSError);
6784 PySocketModuleAPI.error = PyExc_OSError;
6785 Py_INCREF(PyExc_OSError);
6786 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006788 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 if (socket_herror == NULL)
6790 return NULL;
6791 Py_INCREF(socket_herror);
6792 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006793 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006794 NULL);
6795 if (socket_gaierror == NULL)
6796 return NULL;
6797 Py_INCREF(socket_gaierror);
6798 PyModule_AddObject(m, "gaierror", socket_gaierror);
6799 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006800 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801 if (socket_timeout == NULL)
6802 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006803 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006804 Py_INCREF(socket_timeout);
6805 PyModule_AddObject(m, "timeout", socket_timeout);
6806 Py_INCREF((PyObject *)&sock_type);
6807 if (PyModule_AddObject(m, "SocketType",
6808 (PyObject *)&sock_type) != 0)
6809 return NULL;
6810 Py_INCREF((PyObject *)&sock_type);
6811 if (PyModule_AddObject(m, "socket",
6812 (PyObject *)&sock_type) != 0)
6813 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006814
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006815#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006817#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820 Py_INCREF(has_ipv6);
6821 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823 /* Export C API */
6824 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6825 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6826 ) != 0)
6827 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006829 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006830#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006832#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006834#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006836#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006837#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006840#endif
6841#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006843#endif
6844#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006845 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006847#endif
6848#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006851#endif
6852#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006855#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006856#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006859#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006860#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006863#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006864#ifdef HAVE_SOCKADDR_ALG
6865 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6866#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006867#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006870#endif
6871#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006873#endif
6874#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006877#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006878#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006879 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006881#endif
6882#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006885#endif
6886#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006889#endif
6890#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006893#endif
6894#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, AF_NETLINK);
6897 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006898#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006900#endif
6901#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006903#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6905 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006906#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006908#endif
6909#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006911#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006912#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006914#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006915#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006917#endif
6918#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006920#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006922#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006924#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006925#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006927#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006928#ifdef NETLINK_CRYPTO
6929 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6930#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006931#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006932
6933#ifdef AF_VSOCK
6934 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6935 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6936 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6937 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6938 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6939 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6940 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6941 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6942 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6943#endif
6944
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006945#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006948#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006949#ifdef AF_LINK
6950 PyModule_AddIntMacro(m, AF_LINK);
6951#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006952#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006955#endif
6956#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006959#endif
6960#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006961 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006963#endif
6964#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006967#endif
6968#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006971#endif
6972#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006975#endif
6976#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006979#endif
6980#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006983#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006984
Hye-Shik Chang81268602004-02-02 06:05:24 +00006985#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6987 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6988 PyModule_AddIntMacro(m, BTPROTO_HCI);
6989 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006990#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006992#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006993#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006994#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006996#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6998 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006999#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
7002 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00007003#endif
7004
Charles-François Natali47413c12011-10-06 19:47:44 +02007005#ifdef AF_CAN
7006 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007008#endif
7009#ifdef PF_CAN
7010 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02007012#endif
7013
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007014/* Reliable Datagram Sockets */
7015#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007017#endif
7018#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007020#endif
7021
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007022/* Kernel event messages */
7023#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007025#endif
7026#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007028#endif
7029
Antoine Pitroub156a462010-10-27 20:13:57 +00007030#ifdef AF_PACKET
7031 PyModule_AddIntMacro(m, AF_PACKET);
7032#endif
7033#ifdef PF_PACKET
7034 PyModule_AddIntMacro(m, PF_PACKET);
7035#endif
7036#ifdef PACKET_HOST
7037 PyModule_AddIntMacro(m, PACKET_HOST);
7038#endif
7039#ifdef PACKET_BROADCAST
7040 PyModule_AddIntMacro(m, PACKET_BROADCAST);
7041#endif
7042#ifdef PACKET_MULTICAST
7043 PyModule_AddIntMacro(m, PACKET_MULTICAST);
7044#endif
7045#ifdef PACKET_OTHERHOST
7046 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
7047#endif
7048#ifdef PACKET_OUTGOING
7049 PyModule_AddIntMacro(m, PACKET_OUTGOING);
7050#endif
7051#ifdef PACKET_LOOPBACK
7052 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
7053#endif
7054#ifdef PACKET_FASTROUTE
7055 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00007056#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007057
Christian Heimes043d6f62008-01-07 17:19:16 +00007058#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00007060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
7063 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
7064 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00007065
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
7067 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
7068 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007070 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, SOL_TIPC);
7072 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
7073 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
7074 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
7075 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00007076
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
7078 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
7079 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
7080 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00007081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007082 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
7084 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00007085#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00007088#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
7090 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
7091 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
7092 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
7093 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
7094 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00007095#endif
7096
Christian Heimesdffa3942016-09-05 23:54:41 +02007097#ifdef HAVE_SOCKADDR_ALG
7098 /* Socket options */
7099 PyModule_AddIntMacro(m, ALG_SET_KEY);
7100 PyModule_AddIntMacro(m, ALG_SET_IV);
7101 PyModule_AddIntMacro(m, ALG_SET_OP);
7102 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
7103 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
7104 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
7105
7106 /* Operations */
7107 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
7108 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
7109 PyModule_AddIntMacro(m, ALG_OP_SIGN);
7110 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
7111#endif
7112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, SOCK_STREAM);
7115 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007116/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03007117#ifdef SOCK_RAW
7118 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03007120#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00007122#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00007124#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00007125#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007127#endif
7128#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00007130#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007135#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007140#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007141#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00007143#endif
7144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007147#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007162#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007163#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007166#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00007194#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007195#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007197#endif
7198#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007200#endif
7201#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007203#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007204#ifdef SO_PASSSEC
7205 PyModule_AddIntMacro(m, SO_PASSSEC);
7206#endif
7207#ifdef SO_PEERSEC
7208 PyModule_AddIntMacro(m, SO_PEERSEC);
7209#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02007210#ifdef SO_BINDTODEVICE
7211 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
7212#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06007213#ifdef SO_PRIORITY
7214 PyModule_AddIntMacro(m, SO_PRIORITY);
7215#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007216#ifdef SO_MARK
7217 PyModule_AddIntMacro(m, SO_MARK);
7218#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007219#ifdef SO_DOMAIN
7220 PyModule_AddIntMacro(m, SO_DOMAIN);
7221#endif
7222#ifdef SO_PROTOCOL
7223 PyModule_AddIntMacro(m, SO_PROTOCOL);
7224#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226 /* Maximum number of connections for "listen" */
7227#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007229#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007231#endif
7232
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007233 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007234#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007236#endif
7237#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007239#endif
7240#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007242#endif
7243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244 /* Flags for send, recv */
7245#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007274#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007275#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007277#endif
7278#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007280#endif
7281#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007283#endif
7284#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007286#endif
7287#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007289#endif
7290#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007292#endif
7293#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007295#endif
7296#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007298#endif
7299#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007301#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007302#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007303 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007304#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007306 /* Protocol level and numbers, usable for [gs]etsockopt */
7307#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007308 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007311 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007312#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007319 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007321#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007322 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007324#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007325 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007327#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007332#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007339#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007340#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007341 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007342#endif
7343#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007344 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7345 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007346#endif
7347#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7349 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7350 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007351
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7353 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7354 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007355#ifdef CAN_ISOTP
7356 PyModule_AddIntMacro(m, CAN_ISOTP);
7357#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007358#endif
7359#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007360 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7361 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7362 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7363 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007364#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007365#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7366 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7367#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007368#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007369 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007370 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7371 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7372 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7373 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7374 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7375 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7376 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7377 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7378 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7379 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7380 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7381 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7382#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007383#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007385#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007386#ifdef HAVE_SOCKADDR_ALG
7387 PyModule_AddIntMacro(m, SOL_ALG);
7388#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007389#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007391#endif
7392#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007394#endif
7395#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007397#endif
7398#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007399 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007400#endif
7401#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007402 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007403#endif
7404#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007405 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007407#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007408 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007409#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007410 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007412#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007415#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007417#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007418 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007437#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007438 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007440#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007443#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007446#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007448#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007451#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007454#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007457#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007460#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007463#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007464 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007466#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007467 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007469#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007470 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007472#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007473 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007475#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007476 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007478#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007479 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007481#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007482 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007484#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007485 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007487#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007488 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007490#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007491 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007493#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007496#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007497 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007499#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007500 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007502#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007507#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007508#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007513#endif
7514/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007515#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007517#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007518 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007522#endif
7523
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007524#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007525 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007526#endif
7527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007528 /* Some port configuration */
7529#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007531#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007534#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007535 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007536#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007537 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007538#endif
7539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007540 /* Some reserved IP v.4 addresses */
7541#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007543#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007544 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007546#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007547 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007549 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007553#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007554 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007556#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007557 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007558#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007559 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007561#ifdef INADDR_ALLHOSTS_GROUP
7562 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7563 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007565 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007567#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007569#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007570 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007572#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007575 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007576#endif
7577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007578 /* IPv4 [gs]etsockopt options */
7579#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007582#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007585#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007588#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007591#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007597#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007600#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007603#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007606#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007609#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007612#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007615#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007618#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007621#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007624#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007626#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007627#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007629#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007631 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7632#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007633 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007635#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007636 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007638#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007639 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007641#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007645 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007647#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007648 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007650 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007651#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007654 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007655#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007657#endif
7658#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007660#endif
7661#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007663#endif
7664#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007666#endif
7667#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007669#endif
7670#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007672#endif
7673#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007675#endif
7676#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007678#endif
7679#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007681#endif
7682#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007684#endif
7685#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007687#endif
7688#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007690#endif
7691#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007692 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007693#endif
7694#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007695 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007696#endif
7697#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007698 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007699#endif
7700#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007702#endif
7703#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007704 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007705#endif
7706#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007707 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007708#endif
7709#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007710 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007711#endif
7712#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007713 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007714#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007716 /* TCP options */
7717#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007718 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007720#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007721 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007724 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007726#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007727 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007730 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007732#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007733 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007735#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007738#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007739 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007741#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007742 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007744#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007745 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007747#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007748 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007750#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007751 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007752#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007753#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007754 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007755#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007756#ifdef TCP_CONGESTION
7757 PyModule_AddIntMacro(m, TCP_CONGESTION);
7758#endif
7759#ifdef TCP_USER_TIMEOUT
7760 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7761#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007762#ifdef TCP_NOTSENT_LOWAT
7763 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7764#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007766 /* IPX options */
7767#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007768 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007769#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007770
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007771/* Reliable Datagram Sockets */
7772#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007773 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007774#endif
7775#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007776 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007777#endif
7778#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007779 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007780#endif
7781#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007782 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007783#endif
7784#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007785 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007786#endif
7787#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007788 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007789#endif
7790#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007791 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007792#endif
7793#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007794 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007795#endif
7796#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007797 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007798#endif
7799#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007800 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007801#endif
7802#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007803 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007804#endif
7805#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007806 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007807#endif
7808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007809 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007810#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007811 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007812#endif
7813#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007814 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007815#endif
7816#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007817 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007818#endif
7819#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007820 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007821#endif
7822#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007823 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007824#endif
7825#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007826 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007827#endif
7828#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007829 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007830#endif
7831#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007832 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007833#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007834#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007835 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007836#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007837#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007838 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007839#endif
7840#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007841 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007842#endif
7843#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007844 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007845#endif
7846#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007847 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007848#endif
7849#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007850 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007851#endif
7852#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007853 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007854#endif
7855#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007856 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007857#endif
7858#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007859 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007860#endif
7861#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007862 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007863#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007864#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007865 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007866#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007867#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007868 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007869#endif
7870#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007871 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007872#endif
7873#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007874 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007875#endif
7876#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007877 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007878#endif
7879#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007880 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007881#endif
7882#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007883 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007884#endif
7885#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007886 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007887#endif
7888#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007889 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007890#endif
7891#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007892 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007893#endif
7894#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007895 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007896#endif
7897#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007898 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007899#endif
7900#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007901 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007902#endif
7903#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007904 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007905#endif
7906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007907 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007908#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007909 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007910#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007911 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007912#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007913 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007914#endif
7915#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007916 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007917#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007918 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007919#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007920 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007921#endif
7922#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007923 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007924#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007925 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007926#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007927 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007928#endif
7929
Christian Heimesfaf2f632008-01-06 16:59:19 +00007930#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007931 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007932 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7933#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007934 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007935#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007936 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007937 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7938#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007939 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007940#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007941 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007942 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007943 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007944 PyObject *tmp;
7945 tmp = PyLong_FromUnsignedLong(codes[i]);
7946 if (tmp == NULL)
7947 return NULL;
7948 PyModule_AddObject(m, names[i], tmp);
7949 }
7950 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007951 PyModule_AddIntMacro(m, RCVALL_OFF);
7952 PyModule_AddIntMacro(m, RCVALL_ON);
7953 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007954#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007955 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007956#endif
7957#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007958 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007959#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007960#endif /* _MSTCPIP_ */
7961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007962 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007963#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007964 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007965#endif
Miss Islington (bot)53d3f8a2018-02-26 10:36:17 -08007966
7967#ifdef MS_WINDOWS
7968 /* remove some flags on older version Windows during run-time */
7969 remove_unusable_flags(m);
7970#endif
7971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007972 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007973}